显示循环列表无限循环

时间:2017-07-24 12:31:12

标签: c pointers struct linked-list

我有两个功能:

void display(struct node *start) {
    struct node *ptr;

    ptr = start;

    while (ptr -> next != start) {
        printf("\t %d", ptr -> data);
        ptr = ptr -> next;
    }

    printf("\t %d", ptr -> data);
}

struct node *insert_beg(struct node *start) {
    struct node *new_node;

    new_node = (struct node *)malloc(sizeof(struct node));
    printf("\n Enter data : ");
    scanf("%d", &new_node -> data);

    new_node -> next = start;
    start = new_node;

    return start;
}

使用insert_beg(start)并尝试使用display(start)显示此列表后,我有一个无限循环。

感谢您的支持。

2 个答案:

答案 0 :(得分:1)

您不是在这里创建循环列表。

为了创建循环列表,当列表中没有元素,即start为NULL(list为空)时,你必须再处理一个案例。

在insert_beg()函数的scanf部分之后对其进行以下编辑:

if(start == NULL){     // this is the required condition to be added
     start = new_node;
     start->next = start;
}
else{
     // this code for adding element is to be performed only when list is not empty
     struct node *tmp = start->next;
     start->next = new_node;
     new_node->next = temp;
}

我希望它能解决你的问题!!

答案 1 :(得分:0)

因为您没有提供完整的示例如何构建循环列表,所以我假设您使用的insert_beg函数错误。

如果我使用你的函数如下,则没有无限循环:

int main() {
    struct node* start;

    start = (struct node*)malloc(sizeof(struct node));
    start->data = 1;
    start->next = start; /* initializing the next pointer to itself */

    start->next = insert_beg(start->next);
    start->next = insert_beg(start->next);
    start->next = insert_beg(start->next);

    display(start);
    return 0;
}

我在insert_beg中也发现了一个问题:

start = new_node;

如果您打算覆盖start指向的位置,则必须将功能签名更改为以下内容:

struct node *insert_beg(struct node **start);

然后在函数内部,您可以执行以下操作:

new_node->next = *start; /* access the pointer pointed by start */
*start = new_node; /* overwrite where the pointer pointed by start points to*/

return *start; /* losts its meaning */

上述修改可让您使用insert_beg功能,如下所示:

insert_beg(&start->next);
insert_beg(&start->next);
insert_beg(&start->next);