Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Tomate in ghiveci la curte?

Idei cale de actiune recuperare g...

Intoleranța lactoza- vegan v...

Tobe acustice insonorizare in blo...
 Cine canta? Fragment din melodie...

Tablou sigurante Dacia Sandero 2012

Baby Reindeer - 2024

Hotii voteaza hoti?!
 Camera video masina

Zilele emailului din gospodaria n...

Best gaming laptop?

Humane (2024)
 Recomandare casti 100-150 lei

Schimbare bec far VW Touran 1T3

Plata impozit PF

Ce parere aveti de viteza/ modul ...
 

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,445
  • Înscris: 10.08.2005
Dar dupa ce le citesti, sunt salvate corespunzator ?

#3
TamtamTicaticaPiupiu

TamtamTicaticaPiupiu

    Senior Member

  • Grup: Senior Members
  • Posts: 2,481
  • Î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,239
  • Î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

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 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