无法将单链表排序为3个不同的单链表

时间:2018-04-01 06:56:22

标签: c sorting data-structures singly-linked-list

我有一个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);
}

1 个答案:

答案 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;
}