2014-01-16 40 views
0

我有一個小的雙向鏈表應用程序。我想添加列表中的元素,然後正常顯示列表。在輸出處,我得到了插入的元素,但是在他們之後,我得到了一堆奇怪的數字(比如...... 28482 -20048 2817 ......) 我相信這是一個空間分配問題。c顯示冗餘元素的雙向鏈表顯示方法

任何幫助表示讚賞,在此先感謝!

# include <stdio.h> 
# include <conio.h> 
# include <string.h> 
# include <stdlib.h> 

typedef struct elem { 
    int number; 
    struct elem * urm; 
    struct elem * prec; 
}nod; 



nod *prim=NULL,*ultim=NULL, *local=NULL, *p=NULL; 

void insert_element(int numb){ 

    nod *local=(nod *)malloc(sizeof(nod)); 
    local->number = numb; 

    if (prim==NULL){ 
     prim=local; 
     ultim=local; 
    } 
    else{ 
     ultim->urm = local; 
     local->prec = ultim; 
     ultim=local; 
    } 
} 

void load_data() 
{ 
    int i,n; 
    nod *c = (nod *)malloc(sizeof(nod)); 
    printf("\n cate elemente va avea lista?"); 
    scanf("%d", &n); 
    printf("avem %d elemente", n); 
    for(i=1;i<=n;i++){ 
    printf("\n number: "); 
    scanf("%d", &c->number); 
    insert_element(c->number); 
    } 
} 

void list_left_to_right() 
{ 
    nod *p = (nod*) malloc(sizeof(nod)); 
    p=prim; 

    while(p){ 
    printf("%d ", p->number); 
    p=p->urm; 
    } 
    printf("\n"); 
} 

int main() 
{ 
    int op; 

    do{ 
    printf("\n1.Enter some data\n"); 
    printf("2.Display left - > right the data\n"); 
    printf("0.Exit\n"); 
    printf("choice : "); 
    scanf("%d",&op); 

    switch(op){ 
    case 1: load_data(); break; 
    case 2: list_left_to_right(); break; 
    case 0: break;} 
    } 
    while (op!=0); 
    return 0; 
} 
+0

請記住,malloced內存不是0初始化的。額外的數據來自隨機存儲器,當您的應用程序在列表的最後一個節點中取消引用錯誤指針時,它將開始讀取它。 –

回答

0

(1)你有list_left_to_right()內存泄漏:

nod *p = (nod*) malloc(sizeof(nod)); 
p=prim; 

此泄漏通過malloc()返回的塊。

(2)

void insert_element(int numb) { 
    nod *local=(nod *)malloc(sizeof(nod)); 
    local->number = numb; 
    // TODO: set local->urm and local->prec to NULL 

    if (prim==NULL) { 
     prim=local; 
     ultim=local; 

行,所以第一次insert_element()被調用時,新的元素是兩者的頭部和尾部。

錯誤:您需要將urmprec字段設置爲NULL。他們最初有未定義的值。

} 
    else { 
     ultim->urm = local;  
     local->prec = ultim; 
     ultim=local; 
    } 
} 

在此之後,隨後的元件插入作爲一個新的尾部(ultim)。

錯誤:但同樣你需要確保local-> urm被設置爲NULL。

+0

謝謝!問題解決了:) local-> urm沒有設置爲null,因此它將隨機值插入到列表中。現在理解機制!再次感謝! – CodeM21