在C中按升序对链表进行排序

时间:2015-03-02 19:15:22

标签: c sorting linked-list

我正在为我的C编程课程开发一个程序,该程序应该为我们提供使用链表的经验。赋值的最后部分之一要求我们使用我们在程序中先前编写的前置或附加函数来获取链接列表并按升序对其进行排序。

struct lnode
{
  int datum;
  struct lnode *next;
};


struct lnode*
prepend(struct lnode *list, int x)
{
  struct lnode *node = (struct lnode *)malloc(sizeof(struct lnode));
  node -> datum = x;
  node -> next = list;
  list = node;
  return list;
}

struct lnode*
append(struct lnode *list, int x)
{
  if(list==NULL){
    list = (struct lnode *)malloc(sizeof(struct lnode));
    list -> datum = x;
    list -> next = NULL;
  }else{
    list -> next = append(list->next,x);li
  }
  return list;
}

以上是我们在课堂上设计的附加和前置功能。<​​/ p>

下面是删除功能,我们在课堂上也做了一些事情:

struct lnode*
delete(struct lnode *list, int x)
{
  struct lnode* tmp;
  if(list == NULL){
    return list;
  }else if(list-> datum == x){
    tmp = list -> next;
    list -> next = NULL;
    free(list);
    list = tmp;
    return list;
  }else{
    list->next = delete(list->next,x);
    return list;
  }
}

int
find_smallest(struct lnode*list)
{
  int smallest;
  smallest = list->datum;
  while(list!=NULL){
    if(list->datum < smallest){
      smallest = list->datum;
    }
    list = list->next;
  }
  return smallest;
}

函数find_smallest将链表作为输入,并应返回链表中的最小整数值。我已经多次测试过这个功能,它看起来效果很好。

最后,sort,如下所示,应该创建一个新的链表new_list,并且应该在列表中附加最小整数的值,然后从列表中删除该值,直到列表不再有任何值。

struct lnode*
sort(struct lnode *list)
{
  struct lnode *new_list;
  while(list != NULL && list->next != NULL){
    new_list = append(new_list, find_smallest(list));
    list = delete(list, find_smallest(list));
  }
  return new_list;
}

我遇到的问题是看起来我的循环无限。 我运行了一个测试用例,我在每次运行循环后打印列表元素,其中列表最初为5 4 1 2 3,打印出来的是5 4 2 3一遍又一遍,直到我强制程序停止。所以我相信它只能正确运行一次?

1 个答案:

答案 0 :(得分:1)

变量new_list未在sort函数中初始化。然后append函数错误地附加到不存在的节点。

更改

struct lnode *new_list;

struct lnode *new_list = NULL;

sort函数中。