由于某些原因,我的代码没有运行insert函数。我想在末尾添加一个节点,但由于一些错误,我的后半部分代码没有执行,这很奇怪,因为编译器没有抛出任何错误。
//Inserting at the end
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
void display(struct Node * head)
{
int i=1;
while(head!=NULL){
printf("Element %d: %dn",i,head->data);
i++;
head=head->next;
}
}
void insert(struct Node* head,int p)
{
struct Node *last = (struct Node *)malloc(sizeof(struct Node));
last->next=NULL;
last->data=p;
while (head!=NULL)
{
head=head->next;
}
head->next=last;
printf("%dt%d",head->data,last->data); //to check insert function
}
int main()
{
struct Node *first, *second, *third;
first = (struct Node *)malloc(sizeof(struct Node));
second = (struct Node *)malloc(sizeof(struct Node));
third = (struct Node *)malloc(sizeof(struct Node));
first->data = 7;
first->next = second;
second->data = 11;
second->next = third;
third->data = 55;
third->next = NULL;
display(first);
insert(first,24);
display(first);
return 0;
}
它甚至没有给我任何垃圾价值。
当您扫描到列表的末尾时,您正在执行以下操作:
while (head != NULL)
{
head = head->next;
}
问题是,当这个循环结束时,head
现在为NULL,然后您尝试:
head->next = last; //<-- BOOM!
将循环更改为:
while (head->next != NULL)
{
head = head->next;
}
现在,当head
指向的对象没有next
指针时,循环将结束。
这确实假设您从未将NULL
传递给insert
函数,但这应该没问题,因为这似乎是一个前提条件。所以,只要确保你永远不要那样做!即使你想允许插入到一个空列表中,目前也没有办法返回一个新的列表头。