我有两个功能:
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)
显示此列表后,我有一个无限循环。
感谢您的支持。
答案 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);