我正在尝试在以下程序的Insert函数中返回链表的头部。但是,它因编译错误而失败。 谁能告诉我我做错了什么:
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int data;
struct ListNode *next;
};
int ListLength(struct ListNode *head)
{
int count = 0;
struct ListNode *temp=head;
while(temp!=NULL)
{
count++;
temp=temp->next;
}
return count;
}
struct ListNode *Insert(struct ListNode *head, int value, int pos)
{
struct ListNode *temp,*curr;
curr=head;
int k=1;
temp=(struct ListNode *)malloc(sizeof(struct ListNode));
if(pos==1)
{
temp->data=value;
if(head==NULL)
{
temp->next=NULL;
head=temp;
}
else
{
temp->next=head;
head=temp;
}
}
else
{
while((curr!=NULL) && (k<pos))
{
k++;
curr=curr->next;
}
temp->data=value;
temp->next=curr->next;
curr->next=temp;
}
return head;
}
void printList(struct ListNode *head)
{
struct ListNode *temp;
temp=head;
while(temp!=NULL)
{
printf("%d",temp->data);
printf(" ");
temp=temp->next;
}
}
int main
{
struct ListNode *head=NULL;
//head = NULL;
head=Insert(head,10,1);
//Insert(head,11,2);
printList(head);
return 0;
}
我试图在插入后返回新链表的头部。我不知道我哪里出错了。在此先感谢您的帮助。
答案 0 :(得分:1)
(i)首先,请在评论中提及int main(void)
。
(ii)接下来,使用当前代码,当您尝试打印列表时,您将处于无限循环中并获得堆栈溢出。
为避免这种情况,请在每次打印后将temp
增加指向下一个节点。
因此,您的打印功能应如下所示:
void printList(struct ListNode *head)
{
struct ListNode *temp;
temp=head;
while(temp!=NULL)
{
printf("%d",temp->data);
printf(" ");
temp=temp->next; // this line is required
}
}
(iii)在你的main函数中,用一个参数调用printList
,这就是节点的头部:
printList(head);
(iv)并且不要忘记在查找列表函数的长度时返回count
。在ListLength
函数的末尾添加return语句:
return count;
(v)当前代码不处理head
为NULL且用户想要插入大于1的位置的情况。或者更一般地,当用户想要插入位置时大于当前列表的长度。
虽然您信任不会给出这样的输入,但始终处理此类异常(在尝试访问空节点的内存时,您可能会在此处获得SEGMENTATION FAULT
。
要处理此问题,您可以在Insert
函数的开头添加一个检查,例如
int lenList = ListLength(head);
if (lenList < pos)
{
printf("Please provide a position less than %d to insert", lenList);
return 0; // don't proceed with inserting node with NULL pointers
}
答案 1 :(得分:-1)
如果头部被宣布为全球,则您不必将其归还。 (对不起,我的答案很简短)