0

我正在尝试遍历 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;
}
4

3 回答 3

2

您从 开始打印,last->next但 while 中的条件在q==last. 所以你没有打印last节点。

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

q=last->next;
do{
    printf("%d\n",q->data);
    q=q->next;
}while(q!=last->next);
于 2013-01-22T11:24:09.900 回答
1

last在这种情况下也是一个有效的注释,你打破循环的方式很好。您也应该在 while 循环之后添加一些代码来打印last节点。

于 2013-01-22T11:17:37.820 回答
1

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

添加

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

else阻止之后display()

或者不要在 else 块之后放置一个丑陋的 printf ,您可以考虑使用 do while 构造

而且您不需要在 display() 中为 q 分配内存。只是

struct node *q;

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

于 2013-01-22T11:22:13.343 回答