000
13.01.2004, 16:31 Uhr
Vriza
|
Hi Leute!
Ich bin über Google hier in das Forum gekommen und muss sagen dass es wirklich eine sehr fähige Leute hier gibt. Deswegen hab ich mich entschlossen einen Thread aufzumachen, da ich derzeit mit einem Problem beschäftigt bin dass mich schon etwas längere Zeit verfolgt. Und zwar hab ich einen Binärbaum und eine lineare Liste programmiert. Zuerst nur um int Werte einzufügen und zu speichern. Ich will aber jede Art von Datentypen in meinem Binärbaum bzw. in meiner Liste aufnehmen.
Wenn ich Werte eingebe, kommen bei der Ausgabe in der Konsole immer die gleichen, komischen Symbole. Main:
C++: |
# include <stdio.h> # include <windows.h> # include <stdlib.h>
# include "baum.h"
void main() { baum *root=NULL;
char *key; do{ printf("Welchen Wert wollen sie einfuegen?");
key=(char*)malloc(sizeof(char));//speicherplatz wird allokiert scanf("%c",key);
if (*key=='0')//Abbrucht bei Null (Notlösung) break; einfuegen(&root,&key,cmp);//Aufruf der Einfügefunktion
} while (key!=0);
system("cls"); printf("Rekonstruierter Baum:\n");
printf("\n INORDER \n");
inorder(root); printf("\n PREORDER \n"); preorder(root);
printf("\n POSTORDER\n");
postorder(root);
}
baum * einfuegen(baum **root, void *key, int (*cmp)(const void *p1, const void *p2)) {
baum *z2; baum *z1; baum *new_ptr; z1=z2=*(root); if (*root == NULL) { new_ptr=(baum*) malloc (sizeof(baum)); new_ptr->info=key; new_ptr->links=new_ptr->rechts=NULL; *root=new_ptr; } else {
while(z1!=NULL) { if (cmp((char*) key,&z1->info)) { z2=z1; z1=z1->links; } else { z2=z1; z1=z1->rechts; } }
new_ptr=(baum*) malloc (sizeof(baum));
if(new_ptr) { new_ptr->info=key; new_ptr->links=new_ptr->rechts=NULL; } if (cmp(key,z2->info)) { z2->links=new_ptr; } else { z2->rechts=new_ptr; } } return new_ptr;
}
void inorder(baum *root) {
if(root) { inorder(root->links); printf("%c ", root->info); inorder (root->rechts); } }
void preorder(baum *root) {
if(root) { printf("%c ", root->info); preorder(root->links); preorder (root->rechts); } }
void postorder(baum *root) {
if(root) {
postorder(root->links); postorder (root->rechts); printf("%c ", root->info);
} }
int cmp(const void*p1,const void*p2) { return (*(char*)p1-*(char*)p2); }
|
die baum.h datei:
C++: |
# include <stdio.h> # include <stdlib.h>
struct baum {
baum *links; void *info; baum *rechts; };
int cmp(const void*p1,const void*p2); void postorder(baum *root); void preorder(baum *root); void inorder(baum *);
baum * einfuegen(baum **root, void *key, int (*fkt)(const void *p1, const void *p2));
|
Das gleiche Problem mit der Linearen Liste:
Main:
C++: |
# include <stdio.h> # include <stdlib.h> # include <windows.h> # include "list.h"
void main() {
char *Wert; int wahl; char *key; char *p=NULL; void *ap=NULL; char *inf;
while(wahl!=0) { printf("\nWas willst du machen?\n"); printf("1. Werte einfuegen\n"); printf("2. Werte ausgeben\n"); printf("3. Wert loeschen\n"); printf("4. Sortiert Einfuegen\n"); printf("0. Programm verlassen\n\n"); scanf("%d",&wahl); system("cls"); fflush(stdin);
switch(wahl) { case 1: do{ printf("\n Gib einen Wert ein\n "); Wert=(char *) malloc (sizeof(1));
scanf("%c",Wert); fflush(stdin); if(Wert[0]=='0') break; //p=(char*)malloc(sizeof(char));
//*p = *Wert; FifoInsert(&ap, (void*)Wert); }while(Wert!=0);
break; case 2: if (ap==NULL) printf ("\nListe Leer"); else WalkList(&ap); break;
case 3: printf("Welchen Wert willst du löschen?\n"); key=(char *) malloc (sizeof(1));
scanf("%c", key); delete_item(&ap, (void*)key); free(key); break; case 0: exit(0); break;
case 4: printf("Welchen Wert willst du einfuegen? \n"); inf=(char *) malloc (sizeof(1)); scanf("%c", inf); sort_insert(&ap, (void *)inf); break; default: printf("Falsche Eingabe! Nochmal: \n"); break; }
} }
|
Die Funktionen:
C++: |
# include <stdio.h> # include <stdlib.h> # include <windows.h> # include "list.h" # include "node.h"
node * FifoInsert (void *ap, void *info) { node *new_ptr; node *p; node **hp=(node**)ap;
if (*hp==NULL) //Liste leer { new_ptr= (node*) malloc(sizeof (node) );
new_ptr->info=info; new_ptr->next=NULL; *hp=new_ptr; } else { p=*hp; while(p->next!=NULL) p=p->next; new_ptr=(node*)malloc(sizeof(node)); if(new_ptr) { p->next=new_ptr; new_ptr->info=info; new_ptr->next=NULL; } } return new_ptr; }
void WalkList(void *ap) { node **hp=(node**) ap;
while(*hp) { printf("%c ",(*hp)->info); *hp=(*hp)->next; } }
int delete_item(void *ap, void *key) { node *p1=NULL; node *p2=(node*)ap;
node **hp=(node **)ap; bool gefunden=false; if(*hp==NULL) { printf("Liste Leer\n"); p2=NULL; } else {
while (p2 && !gefunden) { if(key==p2->info) gefunden=true; else { p1=p2; p2=p2->next; } } if(gefunden==false) { printf("Den Wert gibt es nicht! \n"); return 1; } else { if(p1==NULL) { *hp=p2->next; } else { p1->next=p2->next; } free(p2); } } }
node *sort_insert(void *ap, void *infop) { node *z1=NULL; node *z2=(node*)ap;
node *new_ptr; bool gefunden = false; while(ap!=NULL && gefunden) { if(infop > z2->info) { z1=z2; z2->next; } else { gefunden = true; } }
new_ptr=(node *) malloc (sizeof(node));
if(new_ptr) { new_ptr->info=infop; new_ptr->next=z2;
if(z1==NULL) { ap=new_ptr; } else { z1->next=new_ptr; } }return new_ptr; }
|
list.h
C++: |
# include "node.h"
node *FifoInsert (void *ap, void *info); void WalkList (void *); int delete_item(void *ap, void *info); node *sort_insert (void *ap, void *info);
|
C++: |
# include <stdio.h> # include <stdlib.h> #pragma once
struct node{ void *info; node *next; };
|
Ich wäre dankbar für jede Art von Hilfe!
mfG
Vriza Dieser Post wurde am 13.01.2004 um 18:55 Uhr von Pablo editiert. |