2016-08-27 3 views
1

Ich bin neu zu c.Ich habe den folgenden Code, der eine doppelt verkettete Liste erstellt.Simple-C-Programm stürzt in Windows

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h> 
typedef struct Dnode 
{ 
    char c; 
    struct Dnode *left; 
    struct Dnode *right; 
}Dnode; 
void insert(Dnode *,char); 
void unshift(Dnode *,char); 
void travel(Dnode *); 
int main(){ 
    Dnode *cur = (Dnode *)malloc(sizeof(Dnode)); 
    Dnode *head = NULL; 
    head = cur; 

    cur -> c = 'a'; 
    printf("Cur -> c: %c\n",cur->c); 
    cur ->left = NULL; 
    cur -> right = (Dnode *)malloc(sizeof(Dnode)); 
    cur->right->c = 'b'; 
    cur->right->left = cur; 
    cur = cur->right; 
    travel(head); 
    system("pause"); 
    return 0; 
} 
void reset(Dnode *h){ 
    while(h->left) 
     h=h->left; 
} 
void travel(Dnode *head){ 
    printf("Traversing all nodes of list:\n"); 
    while(head->right){ 
     printf("Received char from node %c\n",head->c); 
     head = head->right; 
    } 
    //reset(head); 
} 
void insert(Dnode * d,char c){ 
    Dnode *t = d; 
    while(t ->right) 
     t=t->right; 
    t->right = (Dnode *)malloc(sizeof(Dnode)); 
    if(t->right){ 
     t->right->c = c; 
     t= t->right; 
     t->right = t->left = NULL; 
    } 
} 
void unshift(Dnode *d,char cc){ 
    Dnode *t =(Dnode *)malloc(sizeof(Dnode)); 
    t = d->right; 
    t->left =NULL; 
    d->left = t; 
    d = t; 
}  

Das Problem ist, dass nach dem Aufruf von travel() alle Knoten ausgedruckt werden. Es druckt „Empfangene Zeichen von Knoten ein“ und „Empfangene Zeichen von Knoten b“

aber dann ist die Windows mir einen Fehler geben, die besagen, dass das Programm crashed.Any Ideen hat? Ich würde eine detaillierte Antwort mag so wie um ähnliche Probleme in der Zukunft zu vermeiden.

+0

Verwenden Sie einen Debugger, um durch das Programm zu gehen und festzustellen, wo es fehlschlägt. – Barmar

+2

Sie haben nie 'cur-> right-> right' initialisiert. – Barmar

+0

Dies scheint kein "einfaches" Programm zu sein. :-P –

Antwort

2

Nach der Initialisierung der Liste wie folgt aussieht:

head ------> X ------> Y ------> uninitialized 
      /^  /
      /|  /
      / \  /
    null<---  ------- 

So in der travel Funktion von Sie beginnen X.c in der ersten Schleife Druck und dann die nicht initialisierte Zeiger in der zweiten Schleife verwenden. Das verursacht einen Programmabsturz.

So müssen Sie hinzufügen:

cur->right->c = 'b'; 
cur->right->left = cur; 
cur->right->right = NULL // Add this line 

auf die Initialisierung.

Beachten Sie auch, dass Sie die zugewiesenen Ressourcen nicht free. So in main (kurz vor return) sollten Sie tun:

Dnode *tmp; 
while(head){ 
    tmp = head; 
    head = head->right; 
    free(tmp); 
} 

BTW - Sie nicht den Wert geworfen zurück von malloc. Just do Dnode *cur = malloc(sizeof(Dnode));

BTW - diese Zeile:

cur = cur->right; 

als cur gelöscht wird danach nicht verwendet.

+0

Das Op sagt, es ist eine doppelt verkettete Liste, kein Baum – cssGEEK

+0

@cssGEEK - Danke - Ich wurde durch die Namen verwirrt, d. H. Die Zeiger werden links und rechts genannt, was für einen Baum normal ist, während Listen typischerweise prev und next verwenden. Antwort aktualisiert – 4386427

+0

wo füge ich es hinzu? –

Verwandte Themen