我有一个splitter = 5,我想通过拆分器对单链表的数据进行排序。喜欢
“list_1” - >保存小于5的数据
“list_2” - >保存等于5的数据
“list_3” - >保存大于5的数据
但是在调用sort函数时它会退出而没有任何错误。
nodal *sort(nodal *start)
{
struct node *ptr;
ptr=start;
while(ptr!=NULL)
{
if(ptr->data<splitter)
{
start_1=insert_end(start_1,ptr->data);
}
else if(ptr->data==splitter)
{
start_2=insert_end(start_2,ptr->data);
}
else
{
start_3=insert_end(start_3,ptr->data);
}
}
return start;
}
nodal *insert_end(nodal *start,int num)
{
nodal *new_node,*ptr;
new_node = (nodal *)malloc(sizeof(nodal));
new_node->data=num;
if(start==NULL)
{
new_node->next=NULL;
start=new_node;
}
else
{
new_node->next=NULL;
ptr = start;
while (ptr!= NULL)
{
ptr=ptr->next;
}
ptr->next=new_node;
}
return start;
}
我的函数调用
int main()
{
int options;
do
{
printf("\n 1.Create node");
printf("\n 6.Display");
printf("\n 3.Display Sorted");
printf("\n 4.Sort the given list");
printf("\n Enter you choice \n");
scanf("%d",&options);
switch (options)
{
case 1:
start = create(start);
break;
case 2:
display(start);
break;
case 3:
start = display_sorted(start_1,start_2,start_3);
break;
case 4:
start = sort(start);
break;
default:
break;
}
}while(options!=13);
}
答案 0 :(得分:0)
您的insert_end
功能错误。
在下面的代码中,迭代直到ptr
变为NULL,然后解除引用ptr
。那将失败(即未定义的行为)。
ptr = start;
while (ptr!= NULL) // Will continue until ptr is NULL
{
ptr=ptr->next;
}
ptr->next=new_node; // Ups - dereference of NULL pointer
也许试试:
while (ptr->next != NULL)
另一个观察是你永远不会使用insert_end
的值返回值。这可能是个错误。
也许你想这样做:
start_1 = insert_end(start_1, ptr->data);
sort
还有一个问题 - 您永远不会更改ptr
while(ptr!=NULL)
{
if(ptr->data<splitter)
{
start_1=insert_end(start_1,ptr->data);
}
else if(ptr->data==splitter)
{
start_2=insert_end(start_2,ptr->data);
}
else
{
start_3=insert_end(start_3,ptr->data);
}
// This line is missing
ptr = ptr->next;
}