C语言 显示循环列表无限循环



我有两个函数:

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)显示此列表后,我有一个无限循环。

感谢您的支持。

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

要创建循环列表,您必须在列表中没有元素时再处理一种情况,即 start 为 NULL(列表为空(。

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

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

因为您没有提供完整的示例来构建循环列表,所以让我假设您使用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);

相关内容

  • 没有找到相关文章

最新更新