我有两个函数:
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);