c双向链表显示方法显示冗余元素

时间:2014-01-16 20:32:02

标签: c doubly-linked-list

我有一个小的双链表应用程序。我想在列表中添加元素,然后正常显示列表。在输出我得到我插入的元素好吧,但在他们之后我得到一堆奇怪的数字(如...... 28482 -20048 2817 ......) 我认为这是空间分配的问题。

感谢任何帮助,谢谢!

# 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;
}

1 个答案:

答案 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-&gt; urm设置为NULL。