【问题标题】:Unable to sort singly linked list into 3 different singly linked list无法将单链表排序为 3 个不同的单链表
【发布时间】:2018-09-10 17:51:47
【问题描述】:

我有一个 splitter=5,我想通过 splitter 对单链表的数据进行排序。喜欢

"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);
}

【问题讨论】:

  • 你能提供你输入的例子吗?你也在使用全局变量吗?重要的是,还要提供调用排序函数的上下文,因为您可能会传递一个空指针来开始。
  • @AJD 输入是 int 值。是的,我正在使用全局变量 splitter=5。我正在调用像 start=sort(start) 这样的排序函数。并且 start 被全局声明为节点 *start = NULL ;节点 *start_2 = NULL ;节点 *start_1 = NULL ;节点 *start_3 = NULL ;
  • printf("\n 6.Display"); -> printf("\n 2.Display");
  • @shobhit:将这些详细信息添加到您的问题将有助于未来的答案。干杯。
  • 这只是拼写错误@4386427 我自己叫它2。

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


【解决方案1】:

您的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;
}

【讨论】:

  • @SHOBHITSRIVASTAVA17BIT0292 您的描述不清楚。 Exiting without any error 是什么意思?您预计会出现什么错误?
  • 它没有显示任何输出。我期待它之后的菜单,因为我使用的是菜单驱动程序,所以在执行排序功能后它应该显示菜单但它只是退出。检查他的问题更新
  • 我也在问题中插入了菜单,请检查一下。
  • @SHOBHITSRIVASTAVA17BIT0292 查看更新后的答案。你还应该发布display_sorted函数
猜你喜欢
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2021-04-20
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
相关资源
最近更新 更多