doppelt verkettete Liste
-
static struct dict_node *nodes; struct dict_node { char *key; void *data; struct dict_node *prev; struct dict_node *next; }; void add(char *key, void *data) { struct dict_node *node = malloc(sizeof(struct dict_node)); node->key = key; node->data = data; node->next = NULL; if(nodes) { struct dict_node *temp = nodes; while(temp->next) temp = temp->next; node->prev = temp; temp->next = node; } else { node->prev = NULL; nodes = node; } } int remove_node(struct dict_node *node) { if(node == nodes) nodes = node->next; if(node->next) node->next->prev = node->prev; if(node->prev) node->prev->next = node->next; free(node); return 1; }
Da haste nen kleines Beispiel.
Ich habe jetzt leider keine Zeit, dazu noch mehr zu sagen :x
Vielleicht hilfts ja.Ausserdem ist das hier das C Forum, nicht das C++ Forum.
bla = new bla(); ist kein C, sondern C++.
Und es ist auch nicht void main(void) sondern int main(void)
-
vielleicht sollte man in die ansi-c foren beschreibung den dicken zusatz:
kein new! mit aufnehmen.
*g*
-
Oder vor jedem Beitrag einen Text durchlesen lassen, wo der Unterschied zwischen C++ und C geklärt wird
-
Îhr seit ja alle soo lieb zu mir
AJ sei so lieb und walte mal deines Amtes und verschiebe den mal ebend ins C++ Eckchen
-
Immer doch gerne
-
Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
So jetzt bin ich im C++ Eckchen gelandet .Ihr könnt mir dennoch helfen
-
wo liegt denn das Problem? Probier es doch mal mit Deadlefs' Variante?
-
Deadlef schrieb:
@tobiasl: ja sicher, aber soo schwer ist die Überlegung doch auch nicht!
Überall, wo du Elemente einfügst/löschst/umsortierst in deiner verketteten Liste musst du ja eh den Zeiger auf den Nachfolger anpassen. An gleicher Stelle muss dann natürlich auch der Vorgängerzeiger angepasst werden. In welcher Reihenfolge, das kannst Du dir zum besseren Verständnis mal selber herleiten.Soweit so gut, genrell habe ich das denke ich auch Verstanden, nur happert es bei der Umsetzung..
ich habe also jetzt erst mal in meiner struct pPrev mit dabei. Sprich wenn mein zeiger auf Next zeigt muß er ja auch auf den Vorgänger zeigen richtig?
-
Soo ich habe das mal Versucht.
Soweit läuft das auch Fehlerfrei nur die Frage ist:
Macht das so Sinn wie ich das gemacht habe?#include <malloc.h> #include <stdio.h> #include <conio.h> #include <windows.h> #include <string.h> struct strasse { char str[50]; struct strasse* pNext; // Zeiger der auf das nächste Objekt zeigt struct strasse* pPrev; // Zeiger der auf das vorige Objekt zeigt struct strasse* pTemp; }; typedef struct strasse STRASSE; typedef struct strasse* LPSTRASSE; void main() { int i=0, P=0; char buffer[50]; LPSTRASSE pAnfang, pEnde, pNew, pAkt, pTemp;; pNew = new STRASSE; pAnfang=pEnde=pNew; pNew->pPrev=NULL; pNew->pNext=NULL; FILE *pf; pf=fopen("strasse.txt","r"); // Öffnen der Datei if (pf == NULL) { //FEHLER return; } while (fgets(buffer, sizeof(buffer), pf) != NULL) { strcpy(pNew->str, buffer); pEnde->pPrev = pTemp; pEnde->pNext = pNew; pTemp->pNext = pEnde; pNew->pNext = NULL; pEnde = pNew; pNew = new STRASSE; P++; } printf("Bitte geben Sie den Suchbegriff ein : "); scanf("%s",buffer); printf("Ihre Eingabe lautet : %s\n",buffer); printf("Gefundene Ergebnisse:\n\n"); pAkt = pAnfang; for(i=0;i<P;i++) { if (strstr(pAkt->str, buffer) != NULL) printf("\t%s\n",pAkt->str); pAkt = pAkt->pNext; } fclose(pf); fflush(stdin); getch(); system("cls"); // den gesamten Speicher frei geben pAkt = pAnfang->pNext; for (i=0; i<P; i++) { delete pAnfang; if (pAkt != NULL) { pAnfang = pAkt; pAkt = pAkt->pNext; } } }
-
Sieht schonmal ganz gut aus.
Ich versuche mal zu korrigieren, wo es nicht ganz passt:while (fgets(buffer, sizeof(buffer), pf) != NULL) { strcpy(pNew->str, buffer); pNew->pPrev = pEnde; //Vorgänger des Neuen ist das bisherige Ende pEnde->pNext = pNew; //Nachfolger des bisherigen Endes ist das Neue pEnde = pNew; pEnde->pNext = NULL; //Neues Ende hat noch keinen Nachfolger pNew = new STRASSE; P++; }
Soweit ich das beurteilen kann brauchst Du pTemp überhaupt nicht.
Ansonsten kann man das zwar noch eleganter lösen, aber <ohne Gewähr> das sollte funktionieren </ohne Gewähr>
-
stimmt ohne PTemp geht es auch!
Scheint in der Tat zu klappen..
Ich glaube es liegt daran, daß ich mich nie was traue und immer total verunsichert bin. war doch gar nicht so schwer wie ich dachte
DANKE