我正在尝试学习链接列表中的插入技术。在执行期间,每次说程序停止工作时都会崩溃。它没有显示任何错误。我是Stack Overflow的新手。如果已经问过这个问题,请原谅我。这是我的代码:
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
struct node *next;
};
void push(struct node** head_ref, int new_data)
{
struct node* new_node= (struct node*)malloc(sizeof(struct node));
new_node->data=new_data;
new_node->next=(*head_ref);
(*head_ref)=new_node;
}
void insertAfter(struct node* prev_node, int new_data)
{
if(prev_node==NULL)
{printf("The previous node cannot be NULL");
return;
}
struct node* new_node=(struct node*)malloc(sizeof(struct node));
new_node->data=new_data;
new_node->next=prev_node->next;
prev_node->next=new_node;
}
void append(struct node** head_ref, int new_data)
{
struct node* new_node= (struct node*)malloc(sizeof(struct node));
struct node *last= *head_ref;
new_node->data=new_data;
new_node->next=NULL;
if(*head_ref==NULL)
{
*head_ref=new_node;
}
else
while(last->next!=NULL)
{
last=last->next; /* Segmentation fault */
}
last->next=new_node;
return;
}
void printlist(struct node *node)
{
while(node!=NULL)
{
printf("%d",node->data);
node=node->next;
}
}
int main()
{
struct node* head=NULL;
append(&head,6);
push(&head,7);
push(&head,11);
append(&head,4);
insertAfter(head->next,12);
printf("\n Created Linked list is:");
printlist(head);
return 0;
}
答案 0 :(得分:2)
检查头部为NULL
的情况,但else
子句仅包含while
循环。 last
的分配在两种情况下均已执行。
您应该在else
子句周围放置大括号:
void append(struct node **head_ref, int new_data)
{
struct node *new_node = (struct node *) malloc(sizeof(struct node));
struct node *last = *head_ref;
new_node->data = new_data;
new_node->next = NULL;
if (*head_ref == NULL) {
*head_ref = new_node;
} else {
while (last->next != NULL) {
last = last->next;
}
last->next = new_node;
}
}
正确的缩进会使这些错误脱颖而出。在我看来,在整个过程中使用大括号也是一个好主意,可能除了内循环中没有if
的非常短的else
之外。
答案 1 :(得分:0)
至少,您尝试取消引用NULL指针(在append
中)。
您可能需要if (head_ref==NULL)
而不是if (*head_ref==NULL)
。