链表排序问题 25

单向链表排序,不是将链表的内容排序,而是排序链表的地址(交换链表的地址),希望高手们指导我一下。如果可以请举一个比较简洁的例子,并加以注释,非常感谢!... 单向链表排序,不是将链表的内容排序,而是排序链表的地址(交换链表的地址),希望高手们指导我一下。如果可以请举一个比较简洁的例子,并加以注释,非常感谢! 展开
 我来答
caijackey
2010-06-05 · TA获得超过177个赞
知道小有建树答主
回答量:443
采纳率:0%
帮助的人:243万
展开全部
对内存数据交换比较占用时间,所以交换节点的方法会快些。一般用选择排序进行操作。代码如下:
#include <stdio.h>
#include<malloc.h>
typedef struct Link/*双向链表结构体*/
{
int data;
struct Link *lift;
struct Link *right;
}linkx,*linky;
linky Init();/*建立双向链表*/
void PrLink(linky p);/*输出双向链表*/
linky Sort(linky head);/*对双向链表排序*/
linky Swap(linky head,linky one,linky two);/*任意交换双向链表两个结点的地址*/
int main(void)
{
linky head;
head=Init();
head=Sort(head);
PrLink(head);
}
linky Init()/*建立链表*/
{
linky p,q,head;
int n=0;
head=p=q=(linky)malloc(sizeof(linkx));
// clrscr();
printf("please input 10 num: ");
scanf("%d",&p->data);/*输入数据*/
head->lift=NULL;
n++;
while(n!=10)/*一直输入到规定的数字个数停止*/
{
q=p;
p=(linky)malloc(sizeof(linkx));
scanf("%d",&p->data);/*输入数据*/
q->right=p;
p->lift=q;
n++;
}
p->right=NULL;
return(head);
}
linky Swap(linky head,linky one,linky two)/*任意交换两个结点*/
{linky temp;
if(one->lift==NULL&&two->right==NULL)/*首和尾巴的交换*/
{
if(one->right==two)/*只有两个结点的情况下*/
{
two->right=one;
two->lift=NULL;
one->lift=two;
one->right=NULL;
head=two;
}
else/*有间隔的首尾交换*/
{
one->right->lift=two;
two->lift->right=one;
two->right=one->right;
one->lift=two->lift;
two->lift=one->right=NULL;
head=two;/*尾结点成为头结点*/
}
}
else if(two->right==NULL)/*尾和任意一个交换*/
{
if(one->right==two)/*交换最后两个结点*/
{
one->lift->right=two;
two->lift=one->lift;
two->right=one;
one->lift=two;
one->right=NULL;
}
else/*和前面其他结点交换*/
{
temp=two->lift;
temp->right=one;
one->lift->right=two;
one->right->lift=two;
two->lift=one->lift;
two->right=one->right;
one->lift=temp;
one->right=NULL;
}
}
else if(one->lift==NULL)/*头和任意一个交换*/
{
if(one->right==two)/*交换头两个结点*/
{
two->right->lift=one;
one->right=two->right;
one->lift=two;
two->right=one;
two->lift=NULL;
head=two;
}
else/*头结点和后面其他结点交换*/
{
temp=one->right;
temp->lift=two;
one->lift=two->lift;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=NULL;
head=two;/*交换的结点成为头结点*/
}
}
else/*当中的任意两个交换*/
{
if(one->right==two)/*交换连在一起的两个结点*/
{
temp=one->lift;
one->lift->right=two;
one->right->lift=two;
one->lift=two;
one->right=two->right;
two->right->lift=one;
two->right=one;
two->lift=temp;
}
else/*交换隔开的两个结点*/
{
one->lift->right=two;
one->right->lift=two;
one->lift=two->lift;
temp=one->right;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=one->lift;
}
}
return(head);
}
linky Sort(linky head)/*对链表排序*/
{
linky i,j,t,p;
int max;
p=head;
for(i=p;i->right!=NULL;i=i->right)/*用选择法的思想对这些结点排序*/
{
max=i->data;
for(j=i->right;j!=NULL;j=j->right)
if(j->data<max)
{
max=j->data;
t=j;
}
if(max!=i->data)/*如果没有找到比i小的结点*/
{
head=Swap(head,i,t);/*因为最终返回的是头结点,而头结点又有可能变化,所以每次头结点返回*/
i=t;
}
}
return(head);
}
void PrLink(linky p)/*输出链表*/
{
linky q;
printf("Now the link: ");
do
{
q=p;
printf("%d ",p->data);
p=p->right;
free(q);/*释放输出结点*/
}
while(p!=NULL);
getchar();
}
nifh80s
2010-05-23 · TA获得超过152个赞
知道小有建树答主
回答量:133
采纳率:100%
帮助的人:71.9万
展开全部
这就是变换链表节点的指向,可以把每个节点的地址存在一个数组里,使用冒泡排序或其他排序方法进行排列,然后修改每个链表节点的指向,即next指针。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
妫孤阚修永
2020-03-11 · TA获得超过1104个赞
知道小有建树答主
回答量:1937
采纳率:90%
帮助的人:9.4万
展开全部
typedef
struct
rank
class;
class
*sort(class
*head)
/*排序函数*/
{//假设你的链表有头结点
class
*p,
*q;
class
*q2,*h2,*t;
p=h2=head;
for(p=p->next;p!=null;)
{
q2=q=h2;//第二个的头
q=q->next;
while(q!=null&&q->maxnum>p->maxnum)
{q2=q;q=q->next;}
t=p;//取当前
p=p->next;//p指下一个
t->next=q2->next;//把t插入第二个链表
q2->next=t;
}
return
h2;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
桂晋越痴凝
2019-04-02 · TA获得超过1216个赞
知道小有建树答主
回答量:1979
采纳率:100%
帮助的人:9.7万
展开全部
看题目要求了
链表的插入很有优势,小量数据可以选用插入排序
使用归并算法效率最高,大数据量用归并
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式