试问这段代码是否能完成排序?

ReverseEngineering 2009-07-23 03:57:05

typedef struct node
{
int data;
struct node *next;
}Node;

void Sort(Node * list)
{
Node *p=NULL,*q=NULL,*tmp;

p=list->next;
list->next=NULL;

while(p)
{
q=list;
while(q->next)
{
if ( q->next->data > p->data )
break;
q=q->next;
}
tmp=p;
p=p->next;
tmp->next=q->next;
q->next=tmp;
}



传过来的list是这样一个链表,他的头结点也就是最开始的那个节点始终纯在,但不赋值,赋值的是从接下来的那个节点开始的,这个节点可以不存在。也就是说,判断是否空表是依据 list->next, 如果 list->next == NULL 表为空,而非 list == 0 表为空。我个人比较奇怪这种做法,不知道哪位高手能讲讲这样做的好处。

我个人觉得貌似此函数不能成功排序,但实际测试时,发现竟然可以。期待高手给与解释!

list->next开始为空,将p不断插入之,始终插在q->next的位子。

我最奇怪的是这个插法,如何保证有序?
...全文
124 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
红街咖啡 2009-07-23
  • 打赏
  • 举报
回复
看看高人怎么回答的。
bigbug9002 2009-07-23
  • 打赏
  • 举报
回复
对于排序,一楼是对的,就是插入排序
bigbug9002 2009-07-23
  • 打赏
  • 举报
回复
带头结点的链表啊。
带头结点的的好处是,当你把一个链表做为参数传给一个函数时,你可以对链表(除了头结点)做任何修改,这种修改可以带回给调用函数。
你试着想想,如果没有头结点,list指向了第一个结点l1,在被调函数中对链表进行了修改,就有可能修改了list的值,比如第一个结点变为了l2,但这种改变不会带回到调用函数。被调函数结束后,在调用函数中,list的值仍然指向l1,链表结构大乱,l1以前的结点都丢掉了。
LeonTown 2009-07-23
  • 打赏
  • 举报
回复
不敢在大侠面前卖弄~

但,看代码,的确可以排序的啊。
这个应该就是插入排序的吧。

开始时,将List和后续节点断开,后续节点由p指向。
每次向List中插入当前p指向的节点。

每次插入p指向的节点时,
先将q指向List,然后向后遍历,直到q的后一个节点大于p节点。

然后就是在q之后插入p节点了。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧