我在列表末尾插入节点,但我的代码只打印第一个元素并在无限循环中运行。 我无法弄清楚代码中的错误。
typedef struct nodetype
{
int info;
struct nodetype* next;
}node;
node *head=NULL;
void insertatend(int x);//x is the key element.
void print();
void insertatend(int x)
{
node *ptr;
ptr=(node*)malloc(sizeof(node));
ptr->info=x;
if(head==NULL)
{
ptr->next=ptr;
head=ptr;
}
else
ptr->next=ptr;
}
void print() //To print the list
{
node *temp=head;
printf("List is-");
while(temp!=NULL)
{
printf("%d",temp->info);
temp=temp->next;
}
}
答案 0 :(得分:1)
考虑你的插入方法(我将把头作为参数而不是全局)
void insertatend(node **hd, int x) {
node *ptr = NULL, *cur = NULL;
if (!(ptr = malloc(sizeof (node)))) {
return;
}
if (!*hd) {
*hd = ptr;
} else {
cur = *hd;
while (cur->next) {
cur = cur->next;
}
cur->next = ptr;
}
}
您需要从末尾到后面遍历列表才能正确执行插入。 (因此上面函数中的while
循环)。
答案 1 :(得分:1)
你的" temp!= NULL"插入后永远不会变为false,因为在该插入中,您将下一个指针设置为自身,从而创建一个链接循环。
应该更像这样:
void insertatend(int x)
{
node *ptr;
ptr=malloc(sizeof(node)); //don't cast pointers returned by malloc
ptr->info=x;
ptr->next=NULL; //set next node pointer to NULL to signify the end
if(head==NULL)
{
head=ptr;
}
else
{
node* tmp = head;
while(tmp->next) tmp = tmp->next; //get last node
tmp->next=ptr; //attach new node to last node
}
}
你的其他分支也不正确,创建另一个链接循环。
答案 2 :(得分:0)
您需要传递列表的最后一个元素:
void insertatend(node *last, int x)
或者将尾部node
设为全局:
node *head = NULL;
node *tail = NULL;
void insertatend(int x)
{
node *ptr;
ptr = malloc(sizeof(node)); /* Don't cast malloc */
ptr->info = x;
ptr->next = NULL;
if (head == NULL) {
head = ptr;
} else {
tail->next = ptr;
}
tail = ptr;
}
答案 3 :(得分:0)
您还可以重新定义节点结构以包含next,prev,head和tail指针并适当地操作它们。
在您的情况下,您只需要在尾节点上设置头指针,在头节点上设置尾指针。在所有节点上设置next和prev。头节点上的头指针应指向自身;尾节点上的尾指针应指向自身。 Head-> prev = NULL; Tail-> next = NULL;
然后只将头指针传递给你的insertatend func。