F
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