关于链表排序

payen_1985 2008-01-15 09:38:20
struct num *sort(struct num *head)
{
struct num *p,*q,*t,*s;
p=head;
while(p->next->next!=NULL)
{
for(s=p,q=p->next;q->next!=NULL;q=q->next)
{
if(s->next->data>q->next->data) s=q;
if(s!=p)
{
t=s->next;
s->next=t->next;
t->next=p->next;
p->next=t;
}
}
p=p->next;
}
return head;
}


大家看看这个链表排序有没有问题,请帮忙具体讲解一下。
...全文
601 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bookoo 2008-11-02
  • 打赏
  • 举报
回复
交换节点,不是交换节点的值,搞混了
liyuzhu_1984 2008-01-17
  • 打赏
  • 举报
回复
void sort(struct num *head)
{
struct num *p,*q;
p=head;
while(NULL != p->next) /* 控制链表结束*/
{
q = p->next;
while(NULL != q->next) /* 控制节点p后面的每一个小于当前节点p的都与p的数据域进行交换 冒泡思想 */
{
if(p->data > q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
q = q->next;
}
else
{
q=q->next;
}
}
p = p->next;
}
}

当然了 上边的方法是基于没有头节点的链表 如果是有头节点的链表 只要把开头的p=head 改成p=head->next 就可以了
xxmv99 2008-01-17
  • 打赏
  • 举报
回复
冒泡冒泡冒泡冒泡冒泡冒泡冒泡冒泡冒泡冒泡冒泡冒泡冒泡
flyingscv 2008-01-16
  • 打赏
  • 举报
回复
if(...) s=q;
...
s->next=...
这个算法是错的,你自己尝试写个吧
payen_1985 2008-01-16
  • 打赏
  • 举报
回复
to 10楼
t=s-> next;
s-> next=t-> next;
t-> next=p-> next;
p-> next=t;
这个交换怎么会改变q->next呢,我觉得这段话只是将t(s->next),即当前循环的最小值“抽”到p->next去呀。不知我的理解是否有误,这个排序里我不明白的有两点:
1、while(p-> next-> next!=NULL),这样的话岂不是链表走到倒数第三个位置时就结束了;
2、for(s=p,q=p-> next;q-> next!=NULL;q=q-> next) 这样的话链表首结点,不是没法进行排序了吗?
另,该算法为资料上查的,在我的程序中运行失败。。。所以,希望大家先指出这个算法是否可行,再解释为什么!

flyingscv 2008-01-16
  • 打赏
  • 举报
回复
for(s=p,q=p-> next;q-> next!=NULL;q=q-> next)
{
if(s-> next-> data> q-> next-> data) s=q;
if(s!=p)
{
t=s-> next;
s-> next=t-> next;
t-> next=p-> next;
p-> next=t;
}

恩,再看了一下应该是循环控制语句里的q-> next!=NULL会出错 ^_^

t=s-> next;
s-> next=t-> next;
t-> next=p-> next;
p-> next=t;
这个交换会更改q->next,最后会出现q->next==NULL
之后q=q->next 》》q==NULL,导致q-> next!=NULL循环判断异常
payen_1985 2008-01-16
  • 打赏
  • 举报
回复
to 8楼
应该不会吧,它的循环控制语句里有q->next!=NULL,那么q->next->data应该是有值的吧
payen_1985 2008-01-16
  • 打赏
  • 举报
回复
5楼那个算法就是我的想法,不过我觉得资料上那个算法应该不会错呀,我不止在一个地方看到那个算法了。。。
flyingscv 2008-01-15
  • 打赏
  • 举报
回复
恩,仔细一看啥排序也不是


for(s=p,q=p-> next;q-> next!=NULL;q=q-> next)
{
if(s-> next-> data> q-> next-> data//这个 q->next会出界
Thorwein 2008-01-15
  • 打赏
  • 举报
回复
楼主 画个图.
跟着自己的程序走几遍.

相信一切都清晰了。但是我初学连表的时候是这样的.
payen_1985 2008-01-15
  • 打赏
  • 举报
回复
谢谢5楼的回答,但是我是想知道我的排序内容中是哪里错了,那是我从资料上看来的方法,不过我没看太明白,疑问在4楼我已经提出!
chlaws 2008-01-15
  • 打赏
  • 举报
回复

//没细看楼主的程序,不过阅读性太差了。if里面都一长串。
//主要思想还是冒泡排序。不过要注意的是结点空的时候。。
void *sort()
{
struct node *ptr1 = head;
struct node *ptr2 = head->next;
int temp;
while(ptr1!=NULL)
{
while(ptr2!=NULL)
{
if(ptr1->num > ptr2->num)
{
temp = ptr1->num;
ptr1->num = ptr2->num;
ptr2->num = temp;
}
ptr2=ptr2->next;

}//while ptr2
ptr1 = ptr1->next;

if(ptr1->next == NULL)
{
break;
}
else
ptr2 = ptr1->next;
}//while ptr1
return head;
}

payen_1985 2008-01-15
  • 打赏
  • 举报
回复
好像
t=s-> next;
s-> next=t-> next;
t-> next=p-> next;
p-> next=t;
通过这句话后,将目标值s从链表中当前位置抽到了节点p的后面,但是我不明白为什么要以
while(p-> next-> next!=NULL)
的方式来进行控制循环,而且这个排序函数在我的程序中运行不了,源程序如下:
#include <stdio.h>
#include <malloc.h>
#define N sizeof(struct num)
struct num
{
int data;
struct num *next;
};
struct num *integerlist(struct num *head,int d)
{
head=(struct num*)malloc(N);
head->data=d%10;
if(d==0) {return NULL;}
d/=10;
head->next=integerlist(head->next,d);
return head;
}
struct num *sort(struct num *head)
{
struct num *p,*q,*t,*s;
p=head;
while(p->next->next!=NULL)
{
for(s=p,q=p->next;q->next!=NULL;q=q->next)
{
if(s->next->data>q->next->data) s=q;
if(s!=p)
{
t=s->next;
s->next=t->next;
t->next=p->next;
p->next=t;
}
}
p=p->next;
}
return head;
}

void main()
{
struct num *head=NULL,*p=NULL;
head=integerlist(head,31895164);
head=sort(head);
p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
flyingscv 2008-01-15
  • 打赏
  • 举报
回复

if(s!=p) //if p->next.data > p->next->next.data
{
//swap(p-> next,p-> next->next)
t=s->next;
s->next=t->next;
t->next=p->next;
p->next=t;
}


flyingscv 2008-01-15
  • 打赏
  • 举报
回复
大概意思是冒泡排序
if(s!=p) //if p->next > p->next-next
{
t=s-> next; //swap(p->next p->next-next)
s-> next=t-> next;
t-> next=p-> next;
p-> next=t;
}
}
flyingscv 2008-01-15
  • 打赏
  • 举报
回复
struct   num   *sort(struct   num   *head) 
{
struct num *p,*q,*t,*s;
p=head;
while(p-> next-> next!=NULL)
{
for(s=p,q=p-> next;q-> next!=NULL;q=q-> next)
{
if(s-> next-> data> q-> next-> data) s=q;
if(s!=p)
{
t=s-> next;
s-> next=t-> next;
t-> next=p-> next;
p-> next=t;
}
}
p=p-> next;
}
return head;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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