Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Binärbaum/lineare Liste in allgemeiner Form

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.01.2004, 17:32 Uhr
virtual
Sexiest Bit alive
(Operator)


Ist ein wenig arg viel Code für den Anfang, aber in einfuegen schein mit mind. ein Fehler:

C++:
    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;
// VIRTUAL: Sollte man hier nicht ein return spendieren???
// die Node ist komplett und eigentlich alles in butter...
// Denn weiter unten machst Du ja noch ein malloc und greifst auf z2
// (==NULL) zu, komisch.
    }
    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;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 13.01.2004 um 17:33 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.01.2004, 18:06 Uhr
Vriza



Der Fehler scheint zwar logisch zu sein, ändert aber allerdings trotzdem nichts daran dass ich bei der Ausgabe nur komische Symbole zu sehen bekomme, anstatt jene Werte die ich eingegeben hab.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.01.2004, 20:16 Uhr
(un)wissender
Niveauwart


Huh, schüttel, ich weiß schon, warum ich C++ programmiere, diese casterei zu ** muss ja irgendwann Ärger machen.

Warum fflushest du eigentlich immer stdin?

Ich glaube, wenn du einen Koten löscht, dann löscht du nur die Pointer, nicht das was dahinter steht.
So was wie free(node *) löscht nicht node -> info, bspw.
Ich hoffe nicht, dass ich mich irre, aber du hast damit gewaltige Memoryleaks.

Ich würde vorschlagen, diu geht alles von anfang an durch und lässt dir jeder Schritt ausgeben.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.01.2004, 20:18 Uhr
(un)wissender
Niveauwart


Habe mehrere Stellen gefunden, wo du evtl. Speicher nicht wieder freigibst, erste ist gleich in main, wenn break; auftritt.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.01.2004, 21:18 Uhr
kronos
Quotenfisch
(Operator)


könntest du vielleicht ein bischen weniger ausgewählten code posten und dein problem präzisieren? dann hast du auch die unterstützung der lesefaulen...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: