geketteter typ/groessenflexibler stapel ---absolute verzweiflung macht sich breit :((
-
hallo,
ich bin verzweifelt, mein stack funktioniert einfach nicht. sitze jetzt
schon 2 tage dran und hab kein nerv mehr
es soll ein geketteter stack werden der daten beliebigen typs und groesse
aufnehemen kann.
irgendwo in der push-funktion stimmt was nicht glaub ich. immer wenn ich
einen neuen wert pushe werden alle werte mit dem neuen überschrieben ...hier mal die funktion:
+++++++++++++++++++
int Push(void *vPDatum, int G, TStapel *PS){ TElem *PH; PH=malloc(sizeof(TElem)); if (PH == NULL) return 1; PH->PDatum=malloc(G); PH->PDatum=vPDatum; PH->Pnext=PS->Anker; PS->Anker=PH; return 0; } +++++++++++++++++ etwasmehr code (ganz unten noch das lauffähige programm) ++++++++++++ ... typedef struct TElement { int G; /*groesse des datums in byte*/ char *PDatum; /*nimmt das datum auf*/ struct TElement *Pnext; }TElem; typedef struct TStack { TElem *Anker; }TStapel; TStapel* InitStapel(void); int IsEmpty(TStapel*); int Push(void*, int, TStapel*); int Pop(void*, int, TStapel*); int main (void) { char Antw, Antw2; /*menu*/ int G; int intDatum; int *PintDatum; char charDatum[21]; void *vPDatum; TStapel *PStapel=InitStapel(); printf("\n\nTyp/Groessen-flexibler geketteter LIFO - Stapel"); /*EINGABE VON NEUEM WERT*/ ... /* case 'i': INTEGER-WERT soll eingegeben werden*/ printf("\ninteger Wert: "); scanf("%d", &intDatum); rewind(stdin); vPDatum=&intDatum; G=sizeof(int); if (Push(vPDatum, G, PStapel)) printf("\nSpeicher voll!"); else printf("integer Wert \"%d\" eingetragen", intDatum); break; ... ... /*AUSGABE*/ ... if (Pop(vPDatum, G, PStapel)) printf("\nStack leer!"); else { switch (G) { case sizeof(int): PintDatum=vPDatum; printf("\nPOP: integer Wert \"%d\"", *PintDatum); break; ... } } ... return 0; } TStapel* InitStapel(void) { TStapel *PH; PH=(TStapel *)malloc(sizeof(TStapel)); if (PH==NULL) return NULL; PH->Anker=NULL; return PH; } int Push(void *vPDatum, int G, TStapel *PS){ TElem *PH; PH=malloc(sizeof(TElem)); if (PH == NULL) return 1; PH->PDatum=malloc(G); PH->PDatum=vPDatum; PH->Pnext=PS->Anker; PS->Anker=PH; return 0; } int Pop(void *vPDatum, int G, TStapel *PS){ TElem *PH; if (PS->Anker == NULL) return 1; PH=PS->Anker; vPDatum=PH->PDatum; PS->Anker=PH->Pnext; free(PH); return 0; } int IsEmpty(TStapel *PS){ return (PS->Anker == NULL); } +++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ ++++++++++++ lauffaehig aber funzt net: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef struct TElement { int G; char *PDatum; struct TElement *Pnext; }TElem; typedef struct TStack { TElem *Anker; }TStapel; typedef struct adress{ char Name[16]; /*Vorname[16],Strasse[16],Ort[16];*/ char PLZ[6]; }Adresse; /*************************************************************************** **************************************************************************** ** ****************************************************** P R O T O T Y P E S **************************************************************************** ************** **************************************************************************** **************************************************************************** **/ TStapel* InitStapel(void); int IsEmpty(TStapel*); int Push(void*, int, TStapel*); int Pop(void*, int, TStapel*); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ P R O T O T Y P E S ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /*************************************************************************** **************************************************************************** ** ****************************************************** M A I N **************************************************************************** ************** **************************************************************************** **************************************************************************** **/ int main (void) { char Antw, Antw2; int G; int intDatum; int *PintDatum; char charDatum[21]; Adresse adrDatum; void *vPDatum; TStapel *PStapel=InitStapel(); printf("\n\nTyp/Groessen-flexibler geketteter LIFO - Stapel"); do { printf("\n(e)ingeben, (a)usgeben, (z)erstören, (b)eenden: "); fflush(stdout); Antw=getch(); putchar(Antw); switch (Antw) { case 'e': do { printf("\n\n(i)nteger Wert, (z)eichenkette, (a)dresse, (h)auptmenue: "); ////2do::wie geht das ohne (h) ?? fflush(stdout);Antw2=getch(); putchar(Antw2); switch (Antw2) { case 'i': printf("\ninteger Wert: "); scanf("%d", &intDatum); rewind(stdin); vPDatum=&intDatum; G=sizeof(int); if (Push(vPDatum, G, PStapel)) printf("\nSpeicher voll!"); else printf("integer Wert \"%d\" eingetragen", intDatum); break; case 'z': printf("\nZeichenkette: "); scanf("%s", charDatum); rewind(stdin); vPDatum=charDatum; G=sizeof(charDatum); if (Push(vPDatum, G, PStapel)) printf("\nSpeicher voll!"); else printf("Zeichenkette: \"%s\" eingetragen", charDatum); break; case 'a':break; } } while (Antw2 != 'h'); break; case 'a': if (Pop(vPDatum, G, PStapel)) printf("\nStack leer!"); else { switch (G) { case sizeof(int): PintDatum=vPDatum; printf("\nPOP: integer Wert \"%d\"", *PintDatum); break; case sizeof(charDatum):break; case sizeof(Adresse):break; default:break; } } break; case 'b': break; } } while (Antw != 'b'); return 0; }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ M A I N ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /*************************************************************************** **************************************************************************** ** ****************************************************** InitStapel **************************************************************************** ************** **************************************************************************** **************************************************************************** **/ TStapel* InitStapel(void) { TStapel *PH; PH=(TStapel *)malloc(sizeof(TStapel)); if (PH==NULL) return NULL; PH->Anker=NULL; return PH; }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ InitStapel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /*************************************************************************** **************************************************************************** ** ****************************************************** Push **************************************************************************** ************** **************************************************************************** **************************************************************************** **/ int Push(void *vPDatum, int G, TStapel *PS){ TElem *PH; PH=malloc(sizeof(TElem)); if (PH == NULL) return 1; PH->PDatum=malloc(G);//2do::(char *)malloc(G); PH->PDatum=vPDatum; PH->Pnext=PS->Anker; PS->Anker=PH; return 0; }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Push ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /*************************************************************************** **************************************************************************** ** ****************************************************** Pop **************************************************************************** ************** **************************************************************************** **************************************************************************** **/ int Pop(void *vPDatum, int G, TStapel *PS){ TElem *PH; if (PS->Anker == NULL) return 1; PH=PS->Anker; vPDatum=PH->PDatum; PS->Anker=PH->Pnext; free(PH); return 0; }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pop ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /*************************************************************************** **************************************************************************** ** ****************************************************** IsEmpty **************************************************************************** ************** **************************************************************************** **************************************************************************** **/ int IsEmpty(TStapel *PS){ return (PS->Anker == NULL); }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ IsEmpty ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
-
if (PH == NULL) return 1;
PH->PDatum=malloc(G);
PH->PDatum=vPDatum;
//war hier eher memcpy gemeint oder wozu sonst haste malloc(G) gemacht?
-
damit will ich G bytes für PDatum reservieren, dass das nen int-wert oder ne zeichenkette (später noich ne struct) aus dem void-ptr aufnehemn kann.
-
aber mit memcpy. du läßt einfach alle PDatum auf die selbe instanz von int, also auf main::intDatum zeigen.
nicht PH->PDatum=vPDatum; machen!
eher memcpy(PH->PDatum,vDatum,G);
-
na dann is wenig verwunderlich dass die immer überschrieben werden
danke dir
hab hier haufenweise gemälde von den listen, nur die speicherstruktur hab ich mir net klargemacht, das werd ich jetzt mal tun! danke dir, da wär ich nie draufgekkommen
da memcopy meinem prof net gefallen wird, werd ich jetzt einfach für jedes neue datum auch neu mallocen, sollte ja gehen.
-
es wird ihm gefallen. warum denn nicht?
-
das ist ganz einfach: memcopy war nicht stoff _seiner_ vorlesung, dh
-er kennt es möglicherweise nicht (echt wahr )
-die lösungen der probleme sollen auf dem durchgenommenen kram basierendanke nochmal für die schnelle hilfe schönes forum, schick mit der code- darstellung auch hier.... bis zu meinem nächsten problem, hoffe dass ich auchbald soweit bin hier anderen weiterzuhelfen, aber momentan ist mein C einfach übelst
-
da memcopy meinem prof net gefallen wird...
Oder du schreibst die Funktion selber mit ins Programm rein, da kann er nicht meckern
void memcpy(void* src, void* dst, size_t bytes) { char *ps = (char*)src, *pd = (char*)dst; for(; bytes; --bytes) *pd++ = *ps++; }
-
sieht irgendwie sexy aus der code
-