Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
ULBS INFORMATICA

Index preturi

Boxa membrana tweeter infundata

Am nevoie de poze cu un curcubeu
 Whisky for Mac

Xiaomi 14 Gpay

Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3
 Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...

De ce sunt oamenii nostalgici

Cum vand casa fara factura Hidroe...
 Scor FICO minim

Tonometru compensat CAS?

polita RCA ONLINE

Termostat frigider - verificare
 

Lista cu sublista (C)

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

#1
iroxana100

iroxana100

    New Member

  • Grup: Junior Members
  • Posts: 8
  • Înscris: 09.05.2019
Salut!
Nu reusesc nici cum sa fac o lista cu sublista.
Am 2 fisiere text:
fisierul pacienti care contine "nr_pacient nume prenume cnp data_nasterii adresa"
fisierul afectiuni care contine "nr_pacient nr_afectiune denumire_afectiune data_prezentarii_la medic "
Trebuie sa introduc aceste date intr-o lista cu sublista, de tipul:
Pacient1  Afectiune1
                Afectiune2
Pacient2 Afectiune1
               Afectiune2
              Afectiune3
etc.
Nu inteleg de ce nu mi afiseaza nimic in urma rularii urmatorului cod:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

typedef struct afect{
int nr_pacient,nr_afectiune;
char *denumire_afectiune,*data;
struct afect *urm1;
}afectiune;

typedef struct pac{int nr_pacient;
char *nume,*prenume,*datan,*adresa;
int cnp;
struct afect *sl;
struct pac *urm2;
}pacient;

pacient *listaP=NULL;
afectiune *listaAR=NULL,*listaAS=NULL;

pacient *pacientNou(int nr_pacient){
pacient *q1,*q2,*p;
p=(pacient*)malloc(sizeof(pacient));
if((p==NULL)||(p->adresa==NULL)||(p->datan)==NULL||(p->nume==NULL)||(p->prenume)==NULL){
printf("\nMemorie insuficienta!\n");
return;}
p->sl=NULL;
p->nr_pacient=nr_pacient;
p->urm2=NULL;
for(q1=q2=listaP;q1!=NULL&q1->nr_pacient<p->nr_pacient;q2=q1,q1=q1->urm2);
if(q1!=q2){
q2->urm2=p;
p->urm2=q1;
return listaP;}
p->urm2=listaP;
listaP=p;
return listaP;}

afectiune *afectiuneNoua(int nrpacient,int nrafectiune,char denumire[80],char data[80]){
afectiune *q1,*q2,*p;
p=(afectiune *)malloc(sizeof(afectiune));
p->denumire_afectiune=(char*)malloc(strlen(denumire)+1);
if((p == NULL) || (p->denumire_afectiune == NULL))
   {
printf("\nMemorie insuficienta!\n");
return;
   }
   p->urm1=NULL;
    p->nr_pacient=nrpacient;
    p->nr_afectiune=nrafectiune;
    strcpy(p->denumire_afectiune,denumire);
    strcpy(p->data,data);
    for(q1=q2=listaAR; q1!=NULL && strcmp(q1->denumire_afectiune, p->denumire_afectiune)<0; q2=q1, q1=q1->urm1);
   if(q1!=q2)
   {
    q2->urm1=p;
    p->urm1=q1;
    return listaAR;
   }
   p->urm1=q1;
   listaAR=p;
   return listaAR;
}

afectiune *cautarePacient(int nr){
afectiune *p;
for(p=listaAS; p!=NULL && p->nr_pacient!=nr; p=p->urm1);
   return p;
}

void citirePac(){
FILE*f;
afectiune *p;
pacient *q;
int nrpacient,nrafectiune;
char denumirea[80],data[80];
if((f=fopen("afectiuni.txt", "rt"))==NULL)
{
  printf("\nFisierul nu a putut fi deschis!");
  return;
}
while(fscanf(f, "%d %d %s %s", &nrpacient,&nrafectiune,denumirea,data)!=EOF) {
  p=cautarePacient(nrpacient);
  if(p==NULL)
  {
listaP=pacientNou(nrpacient);
   p=cautarePacient(nrpacient);
   listaAR=q->sl;
  q->sl=afectiuneNoua(nrpacient,0,0,data);
  }
  else
  {
   listaAR=q->sl;
   q->sl=afectiuneNoua(nrpacient,0,0,data);
  }
}
fclose(f);
}

void afisarePacienti(){
pacient *p;
afectiune *a;
  for(p=listaP; p!=NULL; p=p->urm2)
{
  printf("%s \n", p->nume);
  for(a=p->sl; a!=NULL; a=a->urm1)
printf("\t %s %d\n", a->denumire_afectiune, a->data);
}
}

int main(){
citirePac();
afisarePacienti();
getch();
return 0;
}



Please, help :)

#2
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,596
  • Înscris: 30.07.2003

View Postiroxana100, on 09 mai 2019 - 23:28, said:

Nu inteleg de ce nu mi afiseaza nimic in urma rularii urmatorului cod:
Prim data rulezi cu debuggerul, pas cu pas, inspectezi variabile, vezi pe unde o ia aplicatia, tragi concluzii. Daca nu rezolvi 100%, macar localizezi pe unde nu face asa cum te asteptai si ne indici fragmentul de cod.
Daca nu si nu, facem noi pentru tine asta dar prima data tu ne arati ca ai incercat sa te zbati un pic (asa-ti ramane pe viata, nu cand iti indica cineva la milimetru ce si cum).

#3
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019
Am format codul ca sa intelegem mai bine cu totii:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
typedef struct afect {
	 int nr_pacient, nr_afectiune;
	 char * denumire_afectiune, * data;
	 struct afect * urm1;
}
afectiune;
typedef struct pac {
	 int nr_pacient;
	 char * nume, * prenume, * datan, * adresa;
	 int cnp;
	 struct afect * sl;
	 struct pac * urm2;
}
pacient;
pacient * listaP = NULL;
afectiune * listaAR = NULL, * listaAS = NULL;
pacient * pacientNou(int nr_pacient) {
	 pacient * q1, * q2, * p;
	 p = (pacient * ) malloc(sizeof(pacient));
	 if ((p == NULL) || (p - > adresa == NULL) || (p - > datan) == NULL || (p - > nume == NULL) || (p - > prenume) == NULL) {
			 printf("\nMemorie insuficienta!\n");
			 return;
	 }
	 p - > sl = NULL;
	 p - > nr_pacient = nr_pacient;
	 p - > urm2 = NULL;
	 for (q1 = q2 = listaP; q1 != NULL & q1 - > nr_pacient < p - > nr_pacient; q2 = q1, q1 = q1 - > urm2);
	 if (q1 != q2) {
			 q2 - > urm2 = p;
			 p - > urm2 = q1;
			 return listaP;
	 }
	 p - > urm2 = listaP;
	 listaP = p;
	 return listaP;
}
afectiune * afectiuneNoua(int nrpacient, int nrafectiune, char denumire[80], char data[80]) {
	 afectiune * q1, * q2, * p;
	 p = (afectiune * ) malloc(sizeof(afectiune));
	 p - > denumire_afectiune = (char * ) malloc(strlen(denumire) + 1);
	 if ((p == NULL) || (p - > denumire_afectiune == NULL)) {
			 printf("\nMemorie insuficienta!\n");
			 return;
	 }
	 p - > urm1 = NULL;
	 p - > nr_pacient = nrpacient;
	 p - > nr_afectiune = nrafectiune;
	 strcpy(p - > denumire_afectiune, denumire);
	 strcpy(p - > data, data);
	 for (q1 = q2 = listaAR; q1 != NULL && strcmp(q1 - > denumire_afectiune, p - > denumire_afectiune) < 0; q2 = q1, q1 = q1 - > urm1);
	 if (q1 != q2) {
			 q2 - > urm1 = p;
			 p - > urm1 = q1;
			 return listaAR;
	 }
	 p - > urm1 = q1;
	 listaAR = p;
	 return listaAR;
}
afectiune * cautarePacient(int nr) {
	 afectiune * p;
	 for (p = listaAS; p != NULL && p - > nr_pacient != nr; p = p - > urm1);
	 return p;
}
void citirePac() {
	 FILE * f;
	 afectiune * p;
	 pacient * q;
	 int nrpacient, nrafectiune;
	 char denumirea[80], data[80];
	 if ((f = fopen("afectiuni.txt", "rt")) == NULL) {
			 printf("\nFisierul nu a putut fi deschis!");
			 return;
	 }
	 while (fscanf(f, "%d %d %s %s", & nrpacient, & nrafectiune, denumirea, data) != EOF) {
			 p = cautarePacient(nrpacient);
			 if (p == NULL) {
					 listaP = pacientNou(nrpacient);
					 p = cautarePacient(nrpacient);
					 listaAR = q - > sl;
					 q - > sl = afectiuneNoua(nrpacient, 0, 0, data);
			 } else {
					 listaAR = q - > sl;
					 q - > sl = afectiuneNoua(nrpacient, 0, 0, data);
			 }
	 }
	 fclose(f);
}
void afisarePacienti() {
	 pacient * p;
	 afectiune * a;
	 for (p = listaP; p != NULL; p = p - > urm2) {
			 printf("%s \n", p - > nume);
			 for (a = p - > sl; a != NULL; a = a - > urm1)
					 printf("\t %s %d\n", a - > denumire_afectiune, a - > data);
	 }
}
int main() {
	 citirePac();
	 afisarePacienti();
	 getch();
	 return 0;
}



#4
maccip

maccip

    45 ani

  • Grup: Senior Members
  • Posts: 33,208
  • Înscris: 06.01.2007
1. O prima observatie (care poate sa fie eroare sau.. nu). Daca folosesti liste, nu prea mai e indicat sa folosesti si numerotarea nodurilor gen
int nr_pacient,nr_afectiune;

Listele se folosesc datorita faptuli ca poti scoate si introduce elemente in ea foarte usor (un numar fix de pasi). Daca numerotezi nodurile, lista isi pierde scopul deoarece cand scoti un nod din lista, tre sa renumerotezi restul lor.

2.O eroare in pacient * pacientNou(...)
p = (pacient * ) malloc(sizeof(pacient));
if ((p == NULL) || (p - > adresa == NULL) || (p - > datan) == NULL || (p - > nume == NULL) || (p - > prenume) == NULL) {
   printf("\nMemorie insuficienta!\n");
   return;
}

dupa ce atribui lui p o valoare, cine-ti garanteaza ca p->adresa nu e NULL ?
Si daca e NULL, de ce-i dai return? De unde stii ca ai returnat din cauza ca p==NULL sau p->adresa==NULL ???
Din ce C++ mai stiu eu, cred ca codul nici nu se compileaza, tre sa returnezi ceva, eventual NULL. Dar inainte de asta, tre sa dai si un free(), altfel vei avea memory leaks.
Deci ai zbarcit-o rau aici.

3. Trebuie sa intelegi mai intai rolul listelor pentru a le putea folosi cu.. folos. La modul cum ai gandit programelul, mai bine foloseai tablouri (sau vectori)
Ce faci daca 2 pacienti au aceiasi afectiune?  Nu inteleg ce-ai vrut sa faci acolo. Creezi un nod, dupa care cauti in lista intr-u nod foarte ciudat sau incorect pentru ca daca q1!=q2, tu dai return. Dar q1 va fi diferit de q2 la al doilea pas din iteratie, intotdeauna.


Or mai fi si alte greseli, eu ma opresc aici deocamdata.

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

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