probleme mit linearen listen
-
edit:
hallo die ursprüngliche frage hat sich erledigt.
hier meine neue:
ich hab den quelltext jetzt übern haufen geworfen und einen neuen geschrieben
aber er geht noch nicht ganz ich ich weiss nicht genau wo der fehler ist
aber ich überschreibe mir immer einen "next"-pointer und verliere so immer
wieder elemente in der liste beim einfügen.
hier der neue code ist weiter unten.
-
Du kannst strings nicht durch '=' zuweisen, strings durch char-Arrays
repräsentiert werden. Das '=' weist jetzt einem Pointer einen anderen zu.
Schau dir mal die Fkt. strcpy(..) an.Viel Glück bei deinem Testat
edit: 30 Plätze für einen string ist vielleicht ein bischen knapp. Du kannst
ohne schlechtes Gewissen 300 draus machen. In erdoes.txt sind (glaub ich) sogar
längere Namen.
-
mir ist gerade eingefallen das ich ja strncpy benutzen soll
geänderte zeile:
strncpy(name,strtok(txt,":"),MAX_NAM);
trotzdem das Programm funktioniert noch nicht ganz richtig.
die commando-line argumente benutze ich noch nicht beim testen, ich bau die erst ein wenn ich mir sicher bin das ich auch den inhalt des *.txt files in die lineare liste geschrieben habe.
Wie krieg ich jetzt den inhalt aus der textdatei in diese verflixte liste.
hier die URL auf der man das Aufgaben-blatt und die *.txt datei finden kann.
http://www.ti3.tu-harburg.de/ProgMetho/es ist übung 12.
vielen dan für die hilfe
-
thx is mir auch gerade aufgefallen.
das kommt davon wenn mehrere stunden codet man sieht irgendwann den wald vor lauter
bäumen nicht mehr......
gruss Aeon
-
Aeon schrieb:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_NAM 30 /*struct dient als Basis für lin. Liste*/ struct sListe { char Name[MAX_NAM]; int ez; struct sListe *next; }; /* - - - - - - - - - */ struct sListe *Next = NULL; struct sListe *anfang = NULL; /*fügt ein element am ende der Liste an*/ int attach(char n[MAX_NAM], int z) { struct sListe *pointer; if(anfang == NULL) { if((anfang = (struct sListe *) malloc(sizeof(struct sListe))) == NULL) { printf("ERROR 1:Not enought Memmory\n"); getchar(); return (1); } strncpy(anfang->Name, n, MAX_NAM); anfang->ez = z; anfang->next = NULL; } else { pointer = anfang; while(pointer->next != NULL){ pointer = pointer->next;} /* pointer zeigt auf das letzte Element, aber warum überschreibst du pointer jetzt??? */ if((pointer = (struct sListe *) malloc(sizeof(struct sListe))) == NULL) { printf("ERROR 2:Not enought Memmory\n"); getchar(); return (1); } /* und jetzt kann das arbeiten mit pointer nur noch schief gehen */ pointer = pointer->next; strncpy(pointer->Name, n, MAX_NAM); pointer->ez = z; pointer->next = NULL; } return(0); }/*attach*/ /*Sortierstes Eingeben der Listenelemente*/ void sort_insert(char n[MAX_NAM], int z) { struct sListe *pointer, *pointer1; if(anfang == NULL)/*Ist das Element das erste der Liste?*/ { attach(n,z); } else/*1*/ { pointer = anfang; while(pointer != NULL && (strncmp(pointer->Name,n,MAX_NAM))<0) pointer = pointer->next; if(pointer == NULL) attach(n,z); else if (anfang == pointer) { anfang = (struct sListe *) malloc(sizeof(struct sListe)); if(NULL == anfang) { printf("Error 3: not enought memory\n"); getchar(); return; } strncpy( anfang->Name,strtok(n,"\n"),MAX_NAM ); anfang->ez = z; } else/*2*/ { pointer1 = anfang; while(pointer1->next != pointer) pointer1 = pointer1->next; pointer = (struct sListe *) malloc(sizeof(struct sListe)); if(NULL == pointer) { printf("Error 4: Not enought memory\n"); getchar(); return; } strncpy(pointer->Name,strtok(n, "\n"),MAX_NAM); pointer->ez = z; /*element einfügen*/ pointer->next = pointer1->next; pointer1->next = pointer; }/*end else/*2*/ }/*end else/*1*/ }/*sort_insert*/ /*funktion zum Löschen der kompletten Liste*/ void clearlist() { struct sListe *pointer, *pointer1; /*prüfen ob eine Liste existiert*/ if(anfang != NULL) { /*Liste Vorhanden*/ pointer = anfang->next; while(pointer != NULL) { /* das schaut auch ein bissl komisch aus. könnte es sein, dass das schiefgehen könnte ? */ pointer1 = anfang->next->next; anfang->next = pointer1; free(pointer->next); free(pointer); pointer = pointer1; } /*Anfang der Liste löschen*/ free(anfang->next); free(anfang); anfang=NULL; printf(" List deleted\n"); } else printf("Error 5: can't find a List\n"); }/*clearlist*/ int main(int argc, char* argv[]) { FILE *in; /* struct sListe *anfang = NULL;/*pointer auf NULL setzen*/ char txt[100] = {},name[30] = {}; int z = 0; /*------ Abfrage wieviele parameter eingeben wurden -----*/ if(argc != 3 ) { printf("+-------------------------------------------------------+\n"); printf("| Fehler! |\n"); printf("| ======== |\n"); printf("| Das Programm benoetigt 2 Parameter. |\n"); printf("| |\n"); printf("| Du kannst folgende Parameter dem Programm uebergeben: |\n"); printf("| |\n"); printf("| -n <name> : suchen nach einem Namen |\n"); printf("| -l <no> : Ausgabe aller Namen mit Erdoes-Zahl <no> |\n"); printf("| -r <no> : siehe -l nur die namen werden |\n"); printf("| alphabetisch absteigend sortiert |\n"); printf("| |\n"); printf("| Please press any key to exit |\n"); printf("+-------------------------------------------------------+\n"); getchar(); return (0); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* -- FILE-Pointer mit textdatei verknüpfen --*/ if((in = fopen("erdoes.txt","r")) == NULL) { printf("Error: can't open file erdoes.txt"); return (1); } /* - - - - - - - */ /* - - Daten aus datei in lin. Liste schreiben*/ while(fgets(txt, 100, in) != NULL) { name = strtok(txt,":"); z = atoi(strtok(txt,"\n")); sort_insert(name,z); } /* - - - - - */ /* hier machst du den anfang-pointer kaputt und verlierst den beginn der liste */ while(anfang->next != NULL) { printf("%s %d\n",anfang->Name, anfang->ez); anfang = anfang->next; } /* - - - Speicher wieder freigeben - - -*/ /* und löscht daher hier nicht die ganze liste, weil anfang nicht mehr auf den Anfang zeigt :) */ clearlist(anfang); fclose(in); return(0); }/*main*/
Kann sein, dass da noch mehr schief hängt. Habs nur überflogen.
edit: ach ja, globale Variablen sollte man meiden wie der Teufel das Weihwasser
-
danke für den infos.
ich hab den quelltext jetzt übern haufen egworfen und einen neuen geschrieben
aber er geht noch nicht ganz ich ich weiss nicht genau wo der fehler ist
aber ich überschreibe mir immer einen "next"-pointer und verliere so immer
wieder elemente in der liste beim einfügen.
hier der neue code:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TEST struct sListe { char name[30]; int ez; struct sListe *next; };/*struct sListe*/ /*erzeugt mir das Nullte-Element der lineraren Liste es diennt als dummy-*/ struct sListe *create_list() { struct sListe *anfang; anfang = (struct sListe *) malloc(sizeof(struct sListe)); if (anfang == NULL) { printf("ERROR 1: can't create List\n"); return(NULL); } anfang->next = NULL; strncpy(anfang->name,"<ANFANG>",10); anfang->ez = -1; return(anfang); }/*create_list*/ /*fügt ein element in die Liste ein alphabetisch sortiert nach struct element name*/ void insert(struct sListe **anfang, char name[30],int z) { struct sListe *pointer = NULL, *pointer1 = NULL; pointer1 = *anfang; pointer = (struct sListe *) malloc(sizeof(struct sListe)); if(pointer == NULL) { printf("ERROR 2: can't create new element"); return; } strncpy(pointer->name,name,30); pointer->ez = z; pointer->next = NULL; if/*1*/((*anfang)->next == NULL)/*1. Fall Liste Leer*/ { (*anfang)->next = pointer; #ifdef TEST printf("\n |leer einfuegen %s| \n",pointer->name); #endif } else /*andere möglichkeit liste nicht leer*/ { if( strncmp(pointer->name,((*anfang)->next)->name,30)<0 )/*2.Fall element am anfang einfügen.*/ { pointer->next = (*anfang)->next; (*anfang)->next = pointer; #ifdef TEST printf("\n |anfang einfuegen %s| \n",pointer->name); #endif } while(strncmp(pointer->name,((*anfang)->next)->name,30) > 0 ) { if((strncmp(pointer->name,((*anfang)->next)->name,30) > 0) && ( (strncmp(pointer->name,(((*anfang)->next)->next)->name,30) < 0) && ((*anfang)->next)->next !=NULL ) )/*3.Fall element am in mitte einfügen*/ { pointer->next = (*anfang)->next->next; (*anfang)->next->next = pointer; #ifdef TEST printf("\n |mitte einfuegen %s| \n",pointer->name); #endif break; } else { if( (strncmp(pointer->name,((*anfang)->next)->name,30) > 0) ) { ((*anfang)->next)->next = pointer; #ifdef TEST printf("\n |ende einfuegen %s| \n",pointer->name); #endif break; } } (*anfang) = (*anfang)->next; } /*anfang = pointer1;*/ } }/*insert*/ int main(void) { struct sListe *anfang; anfang = create_list(); insert(&anfang,"element1",12); insert(&anfang,"alement2",10); insert(&anfang,"clement3",11); insert(&anfang,"boing4",34); insert(&anfang,"gooo5",56); insert(&anfang,"tree6",53); insert(&anfang,"zlement7",99); insert(&anfang,"flement8",20); while(anfang != NULL) { printf("\nName: %s Zahl: %d \n",anfang->name,anfang->ez); anfang = anfang->next; } getchar(); return(0); }/*main*/