Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
M-am culcat cu un tip și apo...

Facultate din Bucuresti posibil o...

Eroare steering

Recomandare service pentru repara...
 Premier Energy se listeaza la bursa

Unde recomandati un CT cu Casa de...

Adaptare masina pentru o persoana...

Bios laptop Myria MY8315
 Folie display laptop in Bucuresti?

Incalzire cu Boiler cu PDC + IPAT...

Salariu de șofer Uber 8000 l...

Problema token semnatura electron...
 Incarcator diy China

Unde au disparut tancurile federa...

RMN Decontat

Jgheab clasic forma "U"- ...
 

Concatenare doua liste dublu inlantuite in C

- - - - -
  • Please log in to reply
4 replies to this topic

#1
DarkAngel03

DarkAngel03

    New Member

  • Grup: Candidate Members
  • Posts: 1
  • Înscris: 10.05.2023
Buna ziua,

Am si eu nevoie de putin ajutor la o problema in limbajul C.
Incerc sa fac concatenarea a doua liste dublu inlantuite, dar nu reusesc.
Mentionez ca fisierele list.c si list.h exista deja in program.
Asta este ce am incercat sa fac:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#define N 5
#define M 3
float readFloat() {
	float x;
	scanf("%f", &x);
	return x;
}
List concatenateLists(List L1, List L2) {
	List L3 = newList();  // a treia lista
	Iterator it;
	for (it = first(L1); it != NULL; it = next(L1, it)) {
		insert(L3, last(L3), get(L1, it));
	}
	for (it = first(L2); it != NULL; it = next(L2, it)) {
		insert(L3, last(L3), get(L2, it));
	}
	return L3;
}
int main() {
	List L1 = newList();  // prima lista
	List L2 = newList();  // a doua lista
	float nValues[N], mValues[M];
	int i;
	printf("Introduceti %d valori pentru prima lista:\n", N);
	for (i = 0; i < N; i++) {
		nValues[i] = readFloat();
		insert(L1, last(L1), &nValues[i]);
	}
	printf("Introduceti %d valori pentru a doua lista:\n", M);
	for (i = 0; i < M; i++) {
		mValues[i] = readFloat();
		insert(L2, last(L2), &mValues[i]);
	}
	// concatenarea celor doua liste intr-o singura lista
	List L3 = concatenateLists(L1, L2);
	// afisarea continutului informativ al fiecarui nod din a treia lista
	printf("Lista concatenata este: ");
	Iterator it;
	for (it = first(L3); it != NULL; it = next(L3, it)) {
		printf("%0.1f ", *(float *)get(L3, it));
	}
	printf("\n");
	deleteList(L1);
	deleteList(L2);
	deleteList(L3);
	return 0;
}

Ceea ce afiseaza este:

Introduceti 5 valori pentru prima lista:
1 2 3 4 5
Introduceti 3 valori pentru a doua lista:
10 15 20
Lista concatenata este: 3.0 4.0 5.0 1.0 15.0 20.0 10.0 2.0.

Lista concatenata afisata nu este corecta. Ce trebuie sa fac?

Edited by MarianG, 10 May 2023 - 14:34.


#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,482
  • Înscris: 10.08.2005
Dar dupa ce le citesti, sunt salvate corespunzator ?

#3
TamtamTicaticaPiupiu

TamtamTicaticaPiupiu

    Senior Member

  • Grup: Senior Members
  • Posts: 2,487
  • Înscris: 05.04.2023
O lista nu e un sir, pe scurt.

Cand incepi sa populezi memoria alocata la crearea listei, aceasta se face aleator, nu dupa cum spune iteratorul, care cuantifica doar gradul de umplere a listei.

Valorile introduse in lista vor fi trimise la deruta, nu in ordinea crescatoare a pozitiilor ei, pana cand iteratorul spune stop, gata, nu mai avem memorie alocata obiectului. Daca afisezi L1 sau L2, vei observa ca pozitiile listelor sunt ocupate la intamplare, fara nici o constrangere.

Chiar daca sortezi L1 si L2 inainte de concatenare, L3 va aparea tot un ghiveci aleator. Lista e o multime neordonata de valori.

#4
pelikanu

pelikanu

    tread carefully

  • Grup: Senior Members
  • Posts: 5,089
  • Înscris: 19.08.2005
Adresele elementelor sunt inlocuite la fiecare iteratie, cred ca ar trebui sa mearga asa:

#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#define N 5
#define M 3
float readFloat() {
	float x;
	scanf("%f", &x);
	return x;
}
List concatenateLists(List L1, List L2) {
	List L3 = newList();  // a treia lista
	Iterator it;
	for (it = first(L1); it != NULL; it = next(L1, it)) {
		insert(L3, last(L3), *(float *)get(L1, it));
	}
	for (it = first(L2); it != NULL; it = next(L2, it)) {
		insert(L3, last(L3), *(float *)get(L2, it));
	}
	return L3;
}
int main() {
	List L1 = newList();  // prima lista
	List L2 = newList();  // a doua lista
	float nValues[N], mValues[M];
	int i;
	printf("Introduceti %d valori pentru prima lista:\n", N);
	for (i = 0; i < N; i++) {
		nValues[i] = readFloat();
		insert(L1, last(L1), &nValues[i]);
	}
	printf("Introduceti %d valori pentru a doua lista:\n", M);
	for (i = 0; i < M; i++) {
		mValues[i] = readFloat();
		insert(L2, last(L2), &mValues[i]);
	}
	// concatenarea celor doua liste intr-o singura lista
	List L3 = concatenateLists(L1, L2);
	// afisarea continutului informativ al fiecarui nod din a treia lista
	printf("Lista concatenata este: ");
	Iterator it;
	for (it = first(L3); it != NULL; it = next(L3, it)) {
		printf("%0.1f ", *(float *)get(L3, it));
	}
	printf("\n");
	deleteList(L1);
	deleteList(L2);
	deleteList(L3);
	return 0;
}



#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,258
  • Înscris: 24.02.2007
  • Concatenarea unor liste inlantuite e o operatie O(1). N-are ce cauta for acolo
  • Cum arata list.h?
  • La ce-ti trebuie nValues si mValues ca array?


Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate