suche hilfe: rekursives einfügen in einen binärbaum
-
will keinen neuen thread aufmachen.
bin nun beim hashing angelangt.
ich soll eine hashtabelle erstellen wenn eine kollision auftritt wird in baumform hinter dem gleichen key gespeichert.nun habe ich ein problem ich habe ein struct node und eine hashtabelle:
hashtree[10]={0};
wenn ich hier nun einen wert reinschreiben will und zwar so:
hashtree[a]=(node*)malloc(sizeof(node));
(hashtree[a]->data)=eingabe;
a ist der zuvor errechnete key für das eingegebene wort char eingabe[30]
nun bekomm ich den fehler, dass der ausdruck ein änderbarer value sein muss, der fehler trirr vor (hashtree[a]->data)=eingabe;
was mache ich falsch ??€: bewirkt {0}, dass das gesammte array mit 0 gefüllt wird??
lg
-
Schau mal in deinem Buch unter dem kapitel Array nach was Array[]={0} macht.
Du solltest dir angwöhnen malloc nicht zu casten.
Kannst du nicht den original Fehler posten? Aus deiner übersetztung werde ich nicht ganz schlau...
-
Du solltest dir angwöhnen malloc nicht zu casten.
.. nicht zu benutzen sollte es wohl heissen ..
ehm.. sorry.. dachte ich sei im C++ forum.. ich schussel..
-
er sagt mir, dass der linke wert kein L-wert sei, aber eigentlich muss ich hashtree[a]->value doch einen wert zuweisen könnten oder nicht?
was meinst du mit casten ? die typumwandlung auf(node*)?
falls es von ineresse ist, hier der bisherige code:
#include"programmskizze.h" int menu_ausgabe(void) { int auswahl; do { printf("\n menue\n --------------\n 1...Eingabe\n 2...Ausgabe inorder\n 3...suchen\n 4...loeschen\n "); scanf("%d", &auswahl); } while ((auswahl>6) || (auswahl<1)); return auswahl; } typedef struct Node_ { charArray data; /* data stored in node */ struct Node_ *left; /* left child */ struct Node_ *right; /* right child */ } node; void getline(char *feld,int laenge) { int z=0; int ch=0; laenge=laenge-1; fflush(stdin); for(z=0;(z<laenge)&&((ch=getchar())!=EOF)&&(ch != '\n');z++) { feld[z]=(char) ch; } feld[z]='\0'; if(z==laenge) { printf("Ihr eingegebenes Wort ist zu lang\n"); printf("Uebernommenes Wort: %s\n",feld); } } int asciiumwandlung(int a) {int i; int z=0; for(i=65;i<=90;i++)//für großbuchstaben { if(a==i) return z; else z++; } for(i=97;i<=122;i++) { if(a==i) return z; else z++; } printf("konnte dem buchstaben %c keinen wert zuweisen",a); } int hashkey(char*eingabe,int behälter) {int i; i=((asciiumwandlung(eingabe[0])+asciiumwandlung(eingabe[1])+asciiumwandlung(eingabe[2])+asciiumwandlung(eingabe[3]))%behälter); return i; } main() { int auswahl; int a; charArray eingabe;//char array definiert ein array mit ARRAY_ELEMTS elementen node *hashtree[10] = {NULL}; auswahl=menu_ausgabe(); while(1) { if(auswahl==1) { printf("bitte geben sie ihr wort ein(nicht mehr als 30buchstaben):\n"); getline(eingabe,ARRAY_ELEMENTS); a=hashkey(eingabe,10); //hashkey wird ermittellt hashtree[a]=(node*)malloc(sizeof(node)); (hashtree[a]->data)=eingabe; } } }
header: #include <stdio.h> #include <stdlib.h> #define ARRAY_ELEMENTS 30 typedef char charArray[ARRAY_ELEMENTS]; /* type of item to be stored */
in zeile 103 kommt der fehler mit dem l wert
lg
-
@theta bleib in deinem Forum, new kann doch jedes kleine kind verwenden...
Du hast da glaub einige Kapitel übersprungen. Oder du hast Bei den Arrays geschlafen. Es ist noch nie möglich gewesen einen Array mit = an einem Anderen Array zuzuweisen. Versuche es mit strcpy.
was meinst du mit casten ? die typumwandlung auf(node*)?
Ja!
-
ach verdammt, ja da war was.
als ich vorhin mit dem programm angefangen hab hab ich noch dran gedacht, habs dann wohl beim programmieren vergessen.
danke
-
so kann leider erst morgen weiter machen.
hier mal mein bisheriger code:#include"programmskizze.h" int menu_ausgabe(void) { int auswahl; do { printf("\n menue\n --------------\n 1...Eingabe\n 2...Ausgabe inorder\n 3...suchen\n 4...loeschen\n "); scanf("%d", &auswahl); } while ((auswahl>6) || (auswahl<1)); return auswahl; } typedef struct Node_ { charArray data; /* data stored in node */ struct Node_ *left; /* left child */ struct Node_ *right; /* right child */ } node; void getline(char *feld,int laenge) { int z=0; int ch=0; laenge=laenge-1; fflush(stdin); for(z=0;(z<laenge)&&((ch=getchar())!=EOF)&&(ch != '\n');z++) { feld[z]=(char) ch; } feld[z]='\0'; if(z==laenge) { printf("Ihr eingegebenes Wort ist zu lang\n"); printf("Uebernommenes Wort: %s\n",feld); } } node* einfuegen(node*root,node*eingabe,int stelle)// es wird die zu schreibende stelle von hashtree übergeden, die eingabe und die passende stelle als int es wird die entsprechende wurzel an der passenden stelle zurückgegeben { if(root==0)//noch kein knoten vorhanden root zeigt ins nichts { root=(node*)malloc(sizeof(node)); strcpy(root->data,eingabe->data); (root->left)=0; (root->right)=0; printf("tabelle an %i erstmalig mit %s befuellt\n",stelle,root->data); return root; } else//es ist bereits ein knoten vorhanden { if(strcmp(root->data,eingabe->data)<0) { if((root->left)==0)//der linke knoten ist frei { (root->left)=eingabe; (eingabe->left)=0; (eingabe->right)=0; printf("an der stelle %i der tabelle wurde an %s links %s angehangt"),stelle,root->data,eingabe->data; } else //der linke knoten ist besetzt { printf("da linker knoten an stelle %i besetzt ist wird weiter gegangen\n",stelle); einfuegen(root->left,eingabe,stelle);//mach alles nochmal nur mit dem linken teil als wurzel } } if(strcmp(root->data,eingabe->data)>0)//der einzufügende wert muss an die rechte stelle, da kleiner { if((root->right)==0)//ist der rechte teil des knotens frei?? { (root->right)=eingabe; (eingabe->right)=0; (eingabe->left)=0; printf("der rechte knoten von %s an der stelle %i wurde mit %s gefuellt",root->data,stelle,eingabe->data); } else//der knoten ist nicht frei { printf("der rechte knoten an stelle %i ist besetzt, springe zum nachsten\n",stelle); einfuegen(root->right,eingabe,stelle); } } return root; } } int asciiumwandlung(int a) {int i; int z=0; for(i=65;i<=90;i++)//für großbuchstaben { if(a==i) return z; else z++; } for(i=97;i<=122;i++) { if(a==i) return z; else z++; } printf("konnte dem buchstaben %c keinen wert zuweisen",a); } int hashkey(char*eingabe,int behälter) {int i; i=((asciiumwandlung(eingabe[0])+asciiumwandlung(eingabe[1])+asciiumwandlung(eingabe[2])+asciiumwandlung(eingabe[3]))%behälter); return i; } main() { int auswahl; int a; char j='j'; charArray eingabe;//char array definiert ein array mit ARRAY_ELEMTS elementen node*ptr_eingabe; node*hashtree[10] = {NULL}; node*root[10]; auswahl=menu_ausgabe(); while(1) { if(auswahl==1) { while(j=='j') { printf("bitte geben sie ihr wort ein(nicht mehr als 30buchstaben):\n"); getline(eingabe,ARRAY_ELEMENTS); a=hashkey(eingabe,10); //hashkey wird ermittellt printf("eingegebenes wort:%s\n",eingabe); ptr_eingabe=(node*)malloc(sizeof(node)); strcpy((ptr_eingabe->data),eingabe); root[a]=einfuegen(root[a],ptr_eingabe,a);//nun fülle die hashtabelle an stelle a mit dem entsprechenden baum printf("noch einen wert einlesen?\n"); scanf("%c",&j); } } } }
#include <stdio.h> #include <stdlib.h> #include<string.h> #define ARRAY_ELEMENTS 30 typedef char charArray[ARRAY_ELEMENTS]; /* type of item to be stored */
die aufgabe war eine hashtabelle zu erstellen. tritt eine kollision auf, so soll ein baum bei entsprechendem key erstellt werden.
wer den fehler findet bekommt einen keks
ich denke es ist mal wieder eine falsche speicher allokation.der fehler liegt irgendwie bei strcmp in meiner einfuegen funktion
€: so fehler behoben, ihr wart zu langsam :p
ka warum ich nochmal root[10] erstellt hab
lg
-
Oh schade... Ich hätte den Keks liebend gern genommen
Edit: Wenn ich du wäre würde ich den code schöner darstellen, vorallem würde ich mich auf eine Einrückungsart beschränken, ist viel angenehmer zum lesen.
-
ja sieht im moment ziemlich bescheiden aus, ich schau mal, dass ichs schönder formatiere.
ich denke auch, dass man das ganze auch eleganter programmieren könnte, aber für mich ist ersteinmal die hauptsache, dass das funktioniert.
v.a. der hashkey wäre in einer schleife sicher schöner, aber wegen 4 summanden war mir das zu aufwendig :p
einen tag habe ich noch, dann hoffe ich, dass meine klausur einigermaßen wird.lg
-
so habe versucht es etwas übersichtlicher zu machen.
irgendwas läuft in der funktion einfuegen schief.
wenn ich den key, also a ausgebe, nachdem ein knoten vorhanden ist, stimmt der key am anfang bei der ausgabe noch.
4 zeilen später bringt er komische zahlen (evtl eine adresse?) obwohl ich an a nichts geändert habe.zu testen indem man einfach mal AAAA und AAAAB eingibt. die haben beide den selben hashkey aber sind trotzdem unterschiedlich somit muss AAAAB ein kind von AAAA werden.
ich weiss echt nicht, was der da fabriziert.#include"programmskizze.h" int menu_ausgabe(void) { int auswahl; do { printf("\n menue\n --------------\n 1...Eingabe\n 2...Ausgabe inorder\n 3...suchen\n 4...loeschen\n "); scanf("%d", &auswahl); } while ((auswahl>6) || (auswahl<1)); return auswahl; } typedef struct Node_ { charArray data; /* data stored in node */ struct Node_ *left; /* left child */ struct Node_ *right; /* right child */ } node; void getline(char *feld,int laenge) { int z=0; int ch=0; laenge=laenge-1; fflush(stdin); for(z=0;(z<laenge)&&((ch=getchar())!=EOF)&&(ch != '\n');z++) { feld[z]=(char) ch; } feld[z]='\0'; if(z==laenge) { printf("Ihr eingegebenes Wort ist zu lang\n"); printf("Uebernommenes Wort: %s\n",feld); } } node* einfuegen(node*root,node*eingabe,int stelle)// es wird die zu schreibende stelle von hashtree übergeden, die eingabe und die passende stelle als int es wird die entsprechende wurzel an der passenden stelle zurückgegeben { if(root==0)//noch kein knoten vorhanden root zeigt ins nichts { root=(node*)malloc(sizeof(node)); strcpy(root->data,eingabe->data); (root->left)=0; (root->right)=0; printf("tabelle an %i erstmalig mit %s befuellt\n",stelle,root->data); return root; } else//es ist bereits ein knoten vorhanden { if(strcmp((root->data),(eingabe->data))<0) { if((root->left)==0)//der linke knoten ist frei { printf("die stelle lautet %i",stelle); (root->left)=eingabe; (eingabe->left)=0; (eingabe->right)=0; printf("an der stelle %i der tabelle wurde an %s links %s angehangt\n"),(stelle),(root->data),(eingabe->data); } else //der linke knoten ist besetzt { printf("da linker knoten an stelle %i besetzt ist wird weiter gegangen\n",stelle); einfuegen((root->left),eingabe,stelle);//mach alles nochmal nur mit dem linken teil als wurzel } } if(strcmp((root->data),(eingabe->data))>0)//der einzufügende wert muss an die rechte stelle, da kleiner { if((root->right)==0)//ist der rechte teil des knotens frei?? { (root->right)=eingabe; (eingabe->right)=0; (eingabe->left)=0; printf("der rechte knoten von %s an der stelle %i wurde mit %s gefuellt\n",root->data,stelle,eingabe->data); } else//der knoten ist nicht frei { printf("der rechte knoten an stelle %i ist besetzt, springe zum nachsten\n",stelle); einfuegen(root->right,eingabe,stelle); } } return root; } } int asciiumwandlung(int a) { int i; int z=1; for(i=65;i<=90;i++)//für großbuchstaben { if(a==i) { //printf("%c hat den wert:%i\n",a,z); return z; } if(a==0) return 0; else z++; } for(i=97;i<=122;i++) { if(a==i) { //printf("%c hat den wert:%i\n",a,z); return z; } else z++; } printf("konnte dem buchstaben %c keinen wert zuweisen\n",a); } int hashkey(char*eingabe,int behälter) { int i; int a=0; //while((eingabe[a]!=0)&&(a<=4) //{ i=((asciiumwandlung(eingabe[0])+asciiumwandlung(eingabe[1])+asciiumwandlung(eingabe[2])+asciiumwandlung(eingabe[3]))%behälter); return i; } main() { int auswahl; int a; char j='j'; //charArray eingabe;//char array definiert ein array mit ARRAY_ELEMTS elementen node*ptr_eingabe; node*hashtree[10] = {NULL}; //node*root[10]={0}; auswahl=menu_ausgabe(); while(1) { if(auswahl==1) { while(j=='j') { charArray eingabe={0}; printf("bitte geben sie ihr wort ein(nicht mehr als 30buchstaben):\n"); getline(eingabe,ARRAY_ELEMENTS); a=hashkey(eingabe,10); //hashkey wird ermittellt printf("hashkey:%i\n",a); ptr_eingabe=(node*)malloc(sizeof(node)); strcpy((ptr_eingabe->data),eingabe); printf("der ptr lautet %s\n",ptr_eingabe->data); hashtree[a]=einfuegen(hashtree[a],ptr_eingabe,a);//nun fülle die hashtabelle an stelle a mit dem entsprechenden baum //root[a]=hashtree[a]; printf("noch einen wert einlesen?\n"); scanf("%c",&j); } } } }
header:
#include <stdio.h> #include <stdlib.h> #include<string.h> #define ARRAY_ELEMENTS 30 typedef char charArray[ARRAY_ELEMENTS]; /* type of item to be stored */
€: ich hasse es wie einem winzige fehler stunden kosten können.
habe gerade rausgefunden, dass er in einen rechten knoten korrekt einfügt und auch die ausgabe korrekt ist, also habe ich einfach die gleiche ausgabe wie im rechten fall in den linken kopiert und nun stimmt die ausgabe.der eigentliche fehler ist mir aber nicht ganz klar:
printf("der linke knoten von %s an der stelle %i wurde mit %s gefuellt\n",root->data,stelle,eingabe->data); printf("an der stelle %i der tabelle wurde an %s links %s angehangt\n"),stelle,root->data,eingabe->data;
das erste gibt korrekt aus, das zweite nicht
so habs jetzt endgültig
im zweiten wird die klammer zu früh geschlossen