C中的循环链接列表

时间:2013-01-22 11:13:11

标签: c circular-list

我试图在C中遍历一个循环的单链接列表,但是它显示除了最后一个之外的所有元素......哪里有错误? 可能是在显示功能的其他部分条件发生改变的时候?但条件是什么? 显示和创建链接列表的功能是:

struct node
{

    int data;
    struct node *next;
}*last;

void create(int num)
{

        struct node *t,*q;
        t=(struct node*)malloc(sizeof(struct node));
        t->data=num;
        //list is empty 
        if(last==NULL){
        last=t;
        t->next=last;
    }
    else
    {
        t->next=last->next;     
        last->next=t;
        last=t;
    }
    return;
}

void display()
{

    struct node *q;
    q=(struct node*)malloc(sizeof(struct node));
    if(last==NULL){
        printf("no items in the list");
        return;

    }
    else{
        q=last->next;
        while(q!=last){
                printf("%d\n",q->data);
            q=q->next;          
        }
    }
    //return;
}

3 个答案:

答案 0 :(得分:2)

您从last->next开始打印,但q==last时间内的情况会中断。因此,您不打印last节点。

如果要执行else部分,那么您知道列表中至少有一个节点。所以你可以将else部分改为:

q=last->next;
do{
    printf("%d\n",q->data);
    q=q->next;
}while(q!=last->next);

答案 1 :(得分:1)

在这种情况下,

last也是一个有效的注释,你摆脱循环的方式很好。您应该在while循环后添加一些代码来打印last节点。

答案 2 :(得分:1)

您不打印循环列表的最后一个节点。

添加

printf("%d\n",q->data);
else

display()阻止后

或者在else块之后放置一个丑陋的printf,你可以考虑使用 做构造

你不需要在display()中为q进行内存分配。 只是

struct node *q;

一定够了。因为你只持有遍历列表的指针。