无法将单链表排序为 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;
}