无法将单链表排序为 3 个不同的单链表
Unable to sort singly linked list into 3 different singly linked list
我有一个splitter=5,我想通过splitter对单链表的数据进行排序。喜欢
"list_1" -> Holds the data which are less than 5
"list_2" -> Holds thedata which are equal to 5
"list_3" -> Holds the data which are greater than 5
但是在调用排序函数时它退出没有任何错误。
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);
}
您的 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
的值 return。这可能是一个错误。
也许你想做:
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;
}
我有一个splitter=5,我想通过splitter对单链表的数据进行排序。喜欢
"list_1" -> Holds the data which are less than 5
"list_2" -> Holds thedata which are equal to 5
"list_3" -> Holds the data which are greater than 5
但是在调用排序函数时它退出没有任何错误。
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);
}
您的 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
的值 return。这可能是一个错误。
也许你想做:
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;
}