我编写了一个在链表末尾插入节点的函数。当我运行程序时,当我调用此函数时,程序就会停止工作。
这是功能:
void insert(node **head, int x) {
node *new = malloc(sizeof(node));
new->data = x;
new->next = NULL;
node *temp = *head;
while (temp != NULL) {
temp = temp->next;
}
temp->next = new;
}
谁能告诉它哪里出错了?
答案 0 :(得分:4)
当while
循环终止时temp
为NULL
。因此temp -> next
会生成Segmentation Fault
。
而不是while(temp!=NULL)
,您应该使用while(temp->next!=NULL)
。
如果head
是NULL
怎么办? (空链表)
为此检查head
是否为NULL
。
如果malloc
失败了怎么办?
所以解决方案将是:
void insert(node **head, int x)
{
node *new = (node *)malloc(sizeof(node));
if(!new)
{
printf("Memory allocation failed!\n");
exit(1);
}
new->data = x;
new->next = NULL;
node *temp = *head;
if(!temp)
*head = new;
else
{
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = new;
}
return ;
}
答案 1 :(得分:2)
使用node**
进行迭代。因此,如果列表为空,则无关紧要。迭代直到找到next
为NULL
的节点。您可以直接在目标上分配内存。
void insert( node **head, int x){
node **ptr_new = head;
while( *ptr_new != NULL ){
ptr_new = &((*ptr_new)->next);
}
// now temp refers either to head or to next of the last node.
*ptr_new = malloc( sizeof(node) );
if ( *ptr_new != NULL )
{
(*ptr_new)->next = NULL;
(*ptr_new)->data = x;
}
}
与原始代码相比,您有一个指向指针的指针,其中存储了新节点的地址。在原始文件中,您在temp
不是NULL
时进行了迭代。
while (temp != NULL) {
temp = temp->next;
}
在此while
循环temp==NULL
之后,因为这是循环的终止条件。因此,您的计划在此处停止工作temp->next = new;
答案 2 :(得分:2)
您的代码存在两个问题:
temp
指针被推到列表的末尾,直到它变为NULL
,到那时将新指针存储到其next
成员,并尝试调用未定义的行为(Segmentation fault
在您的系统上)。temp->next == NULL
时停止循环,也无法以这种方式存储新项目。还希望避免使用C ++关键字来命名C代码中的变量,因为如果需要这样做会使代码迁移到C ++变得更加困难。
同样,测试malloc
是否失败并将指针返回到新节点或失败时NULL
更为正确。
以下是更正后的版本:
node *insert(node **head, int x) {
node *new_node = malloc(sizeof(node));
if (new_node != NULL) {
new_node->data = x;
new_node->next = NULL;
node *temp = *head;
if (temp == NULL) {
*head = new_node;
} else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
}
}
return new_node;
}
您还可以使用指向指针的指针迭代列表:它稍微复杂但更短,因为您只有一个测试来查找存储new
指针的位置:
node *insert(node **head, int x) {
node *new_node = malloc(sizeof(node));
if (new_node != NULL) {
new_node->data = x;
new_node->next = NULL;
node **np = head;
while (*np) {
np = &(*np)->next;
}
*np = new_node;
}
return new_node;
}