Concatenare doua liste dublu inlantuite in C
Last Updated: May 10 2023 21:29, Started by
DarkAngel03
, May 10 2023 12:43
·
1
#1
Posted 10 May 2023 - 12:43
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. |
#3
Posted 10 May 2023 - 16:37
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
Posted 10 May 2023 - 17:15
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
Posted 10 May 2023 - 21:29
|
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users