Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Folie display laptop in Bucuresti?

Pagina Wikipedia

Masina veche sau indatorat in ban...

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"- ...

Reparatie plafoniera LED

Problema PC - se blocheaza sau re...
 Notebook HP 840G2 - Upgrade RAM, ...

Defect ciudat Videorecorder Panas...

lege de reglementare a shrinkflat...

Care este cota parte la succesiun...
 

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

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

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