PDA

Visualizza la versione completa : [C] lista


Haring01
18-02-2012, 16:46
Mi sto esercitando per un esame con questo esercizio:
"Si consideri il seguente tipo:

typedef struct EStr {
char * str; //stringa allocata dinamicamente
struct EStr *next;
} EStr, *LStr;

Scrivere una funzione void inscat(LStr L) che per ogni coppia di elementi consecutivi della lista L che hanno stringhe uguali inserisce un nuovo elemento tra di essi la cui stringa è la concatenazione delle stringhe dei due elementi. Esempio:

L = "A" → "A" → "B" -> "B" → "B"
Dopo inscat(L), L = "A" → "AA" → "A" → "B" → "BB" → "B" → "BB" → "B"
"

Ho scritto questo codice:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct EStr{
char *str;
struct EStr *next;
}EStr,*LStr;

void inscart(LStr l);
void visualizza(LStr t);
void svuota(LStr t);
LStr insord(LStr t);


int main (int argc, const char * argv[]){
LStr t=NULL;

printf("\nRiempi la lista:\n");
t=insord(t);

printf("\nQuindi la lista è:\n");
visualizza(t);

if(t!=NULL){
inscart(t);
printf("\nLa nuova lista è:\n");
visualizza(t);
}
else
printf("\nERROR LIST EMPTY\n");

if(t!=NULL)
svuota(t);

return 0;

}

void inscart(LStr l){
while(l!=NULL){
LStr prec=l;
LStr succ=l->next;

if(l->str==succ->str){
char *string=malloc(sizeof(char)*(strlen(l->str)+1));
strcat(string,l->str);
string=realloc(string,(strlen(succ->str)+1));
strcat(string,succ->str);
LStr new=(EStr*)malloc(sizeof(EStr));
new->str=strcpy(new->str,string);
new->next=succ;
prec->next=new;
}

l=l->next;
}

}

void svuota(LStr t){
LStr temp;

printf("\nErase elements: ");
if(t!=NULL){
do {
printf("|%s| ",t->str);
temp=t;
t=t->next;
free(temp);
}while(t!=NULL);
printf("\nList empty\n");
}
else
printf("\nThe list is already empty!\n");

}

void visualizza(LStr t){
LStr p;

printf("\nHead ");
p=t;
while(p!=NULL){
printf("|%s| ",p->str);
p=p->next;
}
printf("Tail\n");

}

LStr insord(LStr t){
int scelta;

do{
char *valore=malloc(10*sizeof(char));
printf("\nInsert a new element in the list\n");
scanf("%s",valore);

LStr nuovo=(EStr*) malloc(sizeof(EStr));
nuovo->str=malloc(sizeof(char)*(strlen(valore)+1));
nuovo->str=strcpy(nuovo->str,valore);
nuovo->next=NULL;

LStr temp,prec; //puntatori per confronti

if(t==NULL)
t=nuovo;
else { //else 1
if(t->str>=nuovo->str) { //if 1
temp=t;
t=nuovo;
t->next=temp;
}//chiusa if 1
else { //else 2
temp=t;
while(temp!=NULL && nuovo->str>=temp->str) { //while
prec=temp;
temp=temp->next;
}//chiusa while
nuovo->next=temp;
prec->next=nuovo;
} //chiusa else 2
} //chiusa else 1
printf("\nDo you want to continue the insertion? 0=yes 1=no\n");
scanf("%d",&scelta);

}while(scelta==0);

return t;
}


I valori vengono inseriti correttamente nella lista, ma quando si arriva nella funzione void inscart(LStr l) il programma si blocca nell'IF poichè la lista "l" passata alla funzione punta all'ultimo elemento della lista, quindi quando va a fare il confronto trova che "succ" è null. Perchè la lista passata punta all'ultimo elemento e non al primo??

VYCanisMajoris
18-02-2012, 17:03
Scusate l'OT per caso sei un alunno di Pellacini?

Haring01
18-02-2012, 17:05
No di Silvestri
vai anche tu alla Sapienza?

oregon
18-02-2012, 17:36
Guarda che le stringhe non si confrontano così

l->str==succ->str

in C ...


P.S. Non ti preoccupare, non sono né Pellacini né Silvestri, anche se non escludo che seguano questo forum ...

Haring01
18-02-2012, 17:57
si me ne ero accorto, l'esempio nel testo è fatto con un solo carattere e mi sono confuso con un char! ho modificato la funzione in questo modo ed ora va bene


void inscart(LStr l){
while(l!=NULL){
LStr prec=l;
LStr succ=l->next;

if(succ!=NULL)
if(strcmp(prec->str,succ->str)==0){
char *string=malloc(sizeof(char)*(strlen(l->str)+1));
strcat(string,l->str);
string=realloc(string,(strlen(succ->str)+1));
strcat(string,succ->str);
LStr new=(EStr*)malloc(sizeof(EStr));
new->str=malloc(sizeof(char)*(strlen(string)+1));
new->str=strcpy(new->str,string);
new->next=succ;
prec->next=new;
}
l=succ;
}

}


comunque in questo forum siete tutti così simpaticamente sarcastici, complimenti

alka
20-02-2012, 09:46
Originariamente inviato da VYCanisMajoris
Scusate l'OT per caso sei un alunno di Pellacini?

Invece di scusarvi e poi abusare comunque del forum, usate i messaggi privati che sono fatti apposta. :fagiano:

Loading