我从早上开始尝试修复此代码,但可以完成它。所以,最后我需要一些帮助来搞清楚错误。代码编译时没有错误,但是当我从终端运行它时出现错误,说“segmetation error:11”
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *next;
};
struct Node *head;
void Insert(int data);
void Print();
int main()
{
head = NULL; //list is empty
Insert(3);
Insert(5);
Insert(2);
Insert(8);
Print();
return 0;
}
void Insert(int data)
{
struct Node *temp = malloc(sizeof(struct Node));
temp->data = data;
temp->next = NULL;
struct Node *temp1 = head;
while(temp1 != NULL)
{
temp1= temp1->next;
}
temp1->next = temp;
}
void Print()
{
struct Node *temp =head;
while(temp != NULL)
{
temp = temp->next;
printf("%d", temp->data);
}
}
答案 0 :(得分:2)
您从未将head
设置为NULL
以外的任何内容。
(即使您已经解决了上述问题){J} <} {}
temp1
保证为NULL
。{/ 1>}
醇>
P.S。我认为称之为变量temp1->next = temp;
,temp
等是一种很好的做法。从这些名称来看,无法判断它们的假设功能是什么。
答案 1 :(得分:0)
你正在写
while(temp1 != NULL)
像这样做
while(temp1->next != NULL)
这里,temp1在循环结束时指向null,并且您尝试在null之后添加节点,即
null->next =temp;
必须抛出错误。
答案 2 :(得分:0)
通常,单个链接列表具有插入操作,该操作在列表的开头插入数据。不过你的函数插入可以看下面的方式
void Insert( int data )
{
struct Node *temp = malloc(sizeof( struct Node ) );
temp->data = data;
temp->next = NULL;
if ( head == NULL )
{
head = temp;
}
else
{
struct Node *current = head;
while ( current->next != NULL ) current = current->next;
current->next = temp;
}
}
如果您检查函数是否已分配节点,那会更好。
功能打印也是错误的。它看起来像
void Print( void )
{
for ( struct Node *current = head; current != NULL; current = current->next )
{
printf( "%d ", current->data );
}
}
答案 3 :(得分:0)
struct Node *curr;
void Insert(int data){
struct Node *temp = malloc(sizeof(struct Node));
temp->data = data;
temp->next =NULL;
if(head == NULL)
curr = head = temp;
else
curr = curr->next = temp;
}
void Print(){
struct Node *temp =head;
while(temp != NULL){
printf("%d ", temp->data);
temp=temp->next;
}
}