Zum Inhalt springen

IltisvdT

Mitglieder
  • Gesamte Inhalte

    41
  • Benutzer seit

  • Letzter Besuch

  1. IltisvdT

    Stack

    Daran lag es in der Tat! Danke sehr. Programm funktioniert nun wie gewünscht.
  2. IltisvdT

    Stack

    Ok, size haben vor das return gesetzt. Haben uns Index und size printen lassen, verstehen aber nicht, wo da das Problem liegen soll. Kannst du das etwas präzisieren?
  3. IltisvdT

    Stack

    Also das Problem mit dem sizeof haben wir gelöst. stack=malloc(a*sizeof(int)); hoffe das ist auch gut gelöst:D Nun bleibt das Problem, dass beim letzten Aufruf von top der falsche Wert geliefert wird. Es wird ja wahrscheinlich mit dem Wert des Index zusammenhängen, aber dieser ist bei den vorherigen Funktionsaufrufen ja richtig. Oder sehen wir das falsch?
  4. IltisvdT

    Stack

    Korrigiert mich, wenn ich irre, aber soweit ich weiß liefert malloc eine Zeiger auf eine Adresse wo ein freier speicherbereich der in malloc geforderten Größe beginnt. Und auf diese Adresse soll auch der stack-pointer zeigen. Ich weiß nicht genau, wo da vollkommen undefiniertes Verhalten sein soll. Aber ich habe nicht genug Ahnung davon um das so beurteilen zu können, aber speziell bei der ersten if-bedingung (aus der ja diese Zeile stammt) bin ich mir recht sicher....
  5. IltisvdT

    Stack

    Also gegeben sind Aufg1.c und stack.h, stack.c sollen wir selbst schreiben. a haben wir eingeführt um den anzufordernden Speicher jeweils um 5 zu erweitern. bin soll lediglich als eine Art Schalter fungieren, sodass der anfangs benötigte Speicher nur einmal bereitgestellt wird und die if-Bedingung nicht wieder gestartet wird. Ja, dass mit dem falschen Wert bei pop hatten wir auch. Das mit dem nicht allozierten Speicher haben wir uns schon gedacht, allerdings haben wir doch den benötigten Speicher immer vorher per malloc angefordert?! Die printfs sind lediglich um zuschauen, an welcher Stelle er abstürzt..
  6. IltisvdT

    Stack

    Hallo, ich mal wieder... Wir sollen ein stack als array speichern. Mit malloc den Speicherplatz in 5er Schritten allokieren und das ganze mit push, pop und top "verarbeiten". Dazu haben wir folgende Codes(z.T. vorgegeben bekommen): Aufg1.c #include <stdio.h> #include <stdlib.h> #include "stack.h" int main() { push(6); push(5); push(35); push(34); printf("Top: %d \n", top()); push(3); printf("Top: %d \n", top()); push(5); printf("Top: %d \n", top()); push(10); printf("Pop: %d \n", pop()); printf("Pop: %d \n", pop()); printf("Top: %d \n", top()); return 0; } stack.h: void push(int); int pop(); int top(); stack.c(unser Programm): #include <stdio.h> #include <stdlib.h> #include "stack.h" static int *stack; static int index=0; static int size=0,a=5,bin=0; void push(int element) { int i=size; int *temp; int b; if(bin==0) { stack=malloc(sizeof(stack[a])); bin=1; } if(size>a) { temp=malloc(sizeof(stack[a+5])); printf("oooo"); for(b=0; b<(size-1); b++) temp[b]=stack[b]; printf("test"); free(stack); stack=malloc(sizeof(stack[a+5])); printf("SSSSSSSSSSSS"); for(b=0; b<size; b++) stack[b]=temp[b]; free(temp); a+=5; } stack[index++]=element; size++; } int pop() { return stack [--index]; size--; } int top() { return stack[index-1]; } Das Programm stürzt immer ab. Und zwar nach dem printf("test"). Nehme ich die pops raus aus der Aufg1, dann passiert folgendes: Eigenartiger Weise stürzt er mal früher und mal später, an verschiedenen Stellen, u.a. direkt vor dem return (0) ab.. Wieso stürzt ein Programm an verschiedenen Stellen ab, ohne jegliche Veränderung und nur bei einem erneuten Aufruf? Und an welcher Stelle liegt unser Problem?
  7. IltisvdT

    Verkettete Liste

    Ihr seid die besten....alles läuft...supergut. Bin total glücklich. Das war aber auch ne schwere Geburt..danke danke danke....
  8. IltisvdT

    Verkettete Liste

    Habe jetzt in dem if, wo das break drin ist aus Tail->next ein Tail gemacht, jetzt stürzt es ab, wenn ein Eintrag länger ist als alle anderen. Kürzer geht, nur länger nicht...
  9. IltisvdT

    Verkettete Liste

    @flashpixx Das hatte ich auch schon zu einem früheren Zeitpunkt überlegt. Aber im Moment ist es so, dass das ganze ding funktioniert, nur, dass er das erste Listenelemnt nicht mitsortiert. Und deswegen alles funktionierende in die Tone zu treten widerstrebt mir etwas. Mein sortiert einfügen ist jetzt so: void sortiert_einfuegen(struct stringList **liste, struct stringList *Neu) { struct stringList *Tail; struct stringList *Tail2=NULL; if (*liste == NULL) {*liste = Neu; printf("01\n"); } else { Tail=*liste; printf("02\n"); while ((strlen((Tail)->zeichen))<(strlen(Neu->zeichen))) {printf("06\n"); if(Tail->next==NULL) break; Tail2=Tail; Tail = Tail->next;} printf("07\n"); if(Tail2==NULL) { Neu->next=Tail; *liste=Neu; } else { Neu->next = Tail; Tail2->next=Neu; } } } das muss doch irgendwie funktionieren...nur sortiert er nciht richtig. Aber wenigstens stürzt er nciht ab...
  10. IltisvdT

    Verkettete Liste

    so, jetzt hab ichs so: else { Tail=*liste; printf("02\n"); while ((strlen((Tail)->zeichen))<(strlen(Neu->zeichen))) {printf("06\n"); if(Tail->next==NULL) break; Tail2=Tail; Tail = Tail->next;} printf("07\n"); Neu->next = Tail; Neu=Tail2->next; Und es geht garnichts mehr...:-/ Die Einträge dürfen nie länger oder kürzer sein als der vorherige und sie werden auch, wenn ich sie ausgeben lasse nicht gespeichert. Es ist also nur der erste da. Und wie ich das am Anfang einfüge weiß ich noch nicht. Würde da ne if-Bedingung machen und die strlen von liste->zeichen mit der neu->zeichen vergleichen und wenn da rauskommt, dass der neue an den anfang muss, ist *liste=Neu und *liste->next der alte Eintrag von liste, den muss ich also auch irgendwo noch speichern. Is das vom Prinzip her richtig?
  11. IltisvdT

    Verkettete Liste

    Jetzt hab ichs wieder auf Tail gebaut. void sortiert_einfuegen(struct stringList **liste, struct stringList *Neu) { struct stringList *Tail; if (*liste == NULL) {*liste = Neu; printf("01\n"); } else { Tail=*liste; printf("02\n"); while ((strlen((Tail)->zeichen)<strlen(Neu->zeichen)) && (strlen(((Tail)->next)->zeichen)>=strlen(Neu->zeichen))) {printf("06"); Tail = (Tail)->next;} Neu->next = Tail->next; Tail->next = Neu; } } Selbe Problematik...er hängt in der while-Schleife, wenn der 2. Eintrag länger ist als der erste und beim sortieren nimmt er den ersten nicht mit. Ich hab jetzt den Speicher freigegebn mit free(loesch) und free(loesch->zeichen), das sind ja die beiden, die ich mit malloc angefordert habe, geht das?
  12. IltisvdT

    Verkettete Liste

    Habe nun die loeschen fkt geändert. Habe einfach die Zeile mit liste=tmp3 rausgeschmissen und voila, es funktioniert. Den Speicher freigeben mache ich mit free(zeichenkette), oder? Ich bin so glücklich, weil das Programm so gut wie läuft, nur das sortieren funktioniert nicht. Und zwar stürzt das Programm ab, wenn die zweite eingabe länger ist als die erste, danach ist alles egal. Er printet dann einmal die 02 und dann hängt er, also macht ihm die while-schleife probleme. die dritte kann ruhig länger sein als die zweite und erste usw. Außerdem sortiert er die erste eingabe nicht. Also wenn ich zehn eingaben machen sortiert er die richtig der länge nach, nur die erste bleibt fest. Außerdem tut er sich schwer beim zahlen sortieren, aber das ist nciht so wichtig, denke ich. Vermutlich lassen sich ja die beiden Fehler auf den selben Fehler im Code begründen. Anbei der Code für die sortieren-Fkt: void sortiert_einfuegen(struct stringList **liste, struct stringList *Neu) { struct stringList *Tail; if (*liste == NULL) {*liste = Neu; printf("01\n"); } else { printf("02\n"); while ((strlen((*liste)->zeichen)<strlen(Neu->zeichen)) && (strlen(((*liste)->next)->zeichen)>=strlen(Neu->zeichen))) {printf("06"); *liste = (*liste)->next;} Neu->next = (*liste)->next; (*liste)->next = Neu; } } Und zu dem einrücken: Ich schicke das mit nem Kumpel immer hin und her und scheinbar passen die editoren nciht so gut zusammen und das haut alles durchnander. aber ich gebe mir größte Mühe mich zu bessern.
  13. IltisvdT

    Verkettete Liste

    So, haben unsere loeschen-fkt geändert. Sieht nun so aus: void loeschen(struct stringList **liste, char *zeichenkette) { struct stringList *loesch= *liste; // struct stringList *tmp2= *liste; struct stringList *tmp3= *liste; if (strcmp(zeichenkette, tmp2->zeichen) ==0){ loesch=tmp2->next; free(liste); // *liste=loesch; printf("1."); } else { while(strcmp(zeichenkette, tmp2->zeichen) !=0){ tmp3=tmp2; tmp2=tmp2->next; if(tmp2==NULL) printf("nicht vorhanden"); if(strcmp(zeichenkette, tmp2->zeichen) ==0){ loesch=tmp3->next; tmp3->next=tmp3->next->next; *liste=tmp3; free(loesch); printf("2."); break; }; } } }Er löscht auch brav das angegebene element, jedoch löscht er auch alle vorherigen, bis auf den direkten Vorgänger. zB ist die Liste 1 2 3 4 5 und er soll die 4 löschen, dann bleiben 3 und 5 über. Das liegt ja daran, dass wir liste=tmp3 speichern und tmp3 ja erst bei dem direkten Vorgänger beginnt. Wie kann man das lösen?
  14. IltisvdT

    Verkettete Liste

    Die ausgabe läuft nun sauber, habe das fgets in die if gepackt. Um das erste Element zu löschen habe ich eine weiter if-Prüfung eingebaut und darin versucht, den Zeiger auf das 2. Element mittels "Hilfsvariable" zu sichern, dann den Speicherplatz des ersten Elements freizugeben und anschließend das erste Element gleich dem 2. zusetzen. Ähnlich habe ich eine weitere Variable eingefügt um mir den Vorgänger des zulöschenden Elements zu merken. Ich denke, dass er in beiden Fällen nicht aus der while-Schleife rauskommt, da er kein Ende findet.. Seh ich das Problem richtig? und wenn wie schaffe ich es dass er ein Ende findet? #ifndef a_h #define a_h #include <stdio.h> #include <stdlib.h> #include <string.h> struct stringList { struct stringList *next; char *zeichen; }; struct stringList *neuesElement(char *zeichenkette) { struct stringList *Neu; Neu = malloc(sizeof(struct stringList)); Neu->zeichen=malloc(strlen(zeichenkette)+1); Neu->next = NULL; strcpy(Neu->zeichen,zeichenkette); return Neu; } void sortiert_einfuegen(struct stringList **liste, struct stringList *Neu) { struct stringList *Tail; if (*liste == NULL) {*liste = Neu; printf("01");} else { Tail = *liste; printf("02"); while (Tail->next != NULL) Tail = Tail->next; Neu->next = Tail->next; Tail->next = Neu; } } void ausgabe(struct stringList **liste) { struct stringList *Tail = *liste; while (Tail != NULL) { printf("%s\n", Tail->zeichen); Tail = Tail->next; } } int suchen(struct stringList **liste, char *zeichenkette ) { int i=1; struct stringList *tmp = *liste; while(strcmp( zeichenkette, tmp->zeichen ) != 0 ) { tmp = tmp->next; i++; if( tmp == NULL ) { printf("nicht vorhanden"); return(-1); } } printf("sucheingabe war%s i=%d", zeichenkette, i); return(i); } void loeschen(struct stringList **liste, char *zeichenkette) { struct stringList *loesch= *liste; // struct stringList *tmp2= *liste; struct stringList *tmp3= *liste; if (strcmp(zeichenkette, tmp2->zeichen) ==0){ loesch=tmp2->next; free(tmp2); // tmp2=loesch; } else { while(strcmp(zeichenkette, tmp2->zeichen) !=0){ tmp3=tmp2; tmp2=tmp2->next; if(tmp2==NULL) printf("nicht vorhanden"); if(strcmp(zeichenkette, tmp2->zeichen) ==0){ loesch=tmp3->next; tmp3->next=tmp3->next->next; free(loesch); }; } } } #endif
  15. IltisvdT

    Verkettete Liste

    Bin etwas weiter gekommen.. zum Einen hakt es immernoch an der Ausgabe des letzten Elements, finde aber einfach keinen Fehler:/ Habe nun eine Header-Datei draus gemacht und die Funktionen kann ich auch mit einer weiteren Datei aufrufen. Nun wollte ich mich an das loeschen eines Elements machen, nur leider wird immer das darauffolgende Element gelöscht, denke es liegt an der while-Schleife die tmp2 halt einen zuweit setzt, komme aber nicht drauf wie ich das verhindere... habe es mit einem weiteren strcmp in einer if-Funktion versucht, aber das ändert nichts am Problem.. hier mal die beiden Codes: Header: #ifndef a_h #define a_h #include <stdio.h> #include <stdlib.h> #include <string.h> struct stringList { struct stringList *next; char *zeichen; }; struct stringList *neuesElement(char *zeichenkette) { struct stringList *Neu; Neu = malloc(sizeof(struct stringList)); Neu->zeichen=malloc(strlen(zeichenkette)+1); Neu->next = NULL; strcpy(Neu->zeichen,zeichenkette); return Neu; } void sortiert_einfuegen(struct stringList **liste, struct stringList *Neu) { struct stringList *Tail; if (*liste == NULL) {*liste = Neu; printf("01");} else { Tail = *liste; printf("02"); while (Tail->next != NULL) Tail = Tail->next; Neu->next = Tail->next; Tail->next = Neu; } } void ausgabe(struct stringList **liste) { struct stringList *Tail = *liste; while (Tail != NULL) { printf("%s\n", Tail->zeichen); Tail = Tail->next; } } int suchen(struct stringList **liste, char *zeichenkette ) { int i=1; struct stringList *tmp = *liste; while(strcmp( zeichenkette, tmp->zeichen ) != 0 ) { tmp = tmp->next; i++; if( tmp == NULL ) { printf("nicht vorhanden"); return(-1); } } printf("sucheingabe war%s i=%d", zeichenkette, i); return(i); } void loeschen(struct stringList **liste, char *zeichenkette) { struct stringList *loesch; struct stringList *tmp2= *liste; while(strcmp(zeichenkette, tmp2->zeichen) !=0){ tmp2=tmp2->next; printf("SSSSSSSSSSSSS%s",tmp2->zeichen); if(tmp2==NULL) printf("nicht vorhanden"); if(strcmp(zeichenkette, tmp2->zeichen) ==0){ loesch=tmp2->next; tmp2->next=tmp2->next->next; free(loesch); }; } } #endif und die .c-Datei: #include "a2.h" int main (void) { char str[80]; char such[80]; char loesch[80]; int z; z=5; struct stringList *Neu; struct stringList *liste=NULL; while(1) { fgets(str, 30, stdin); if (z != 0) { Neu = neuesElement(str); sortiert_einfuegen(&liste, Neu); z--; } else break; } printf("03"); ausgabe(&liste); //printf("sucheingabe"); //fgets(such, 30, stdin); //suchen(&liste, such); printf("loescheingabe"); fgets(loesch, 30, stdin); loeschen(&liste, loesch); ausgabe(&liste); return(0); }

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...