论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

双向链表的排序

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:46:18

以前写过双向链表交换任意结点的程序,后来写了个双向链表排序的程序,没用边输入边排序的思想,是输入完毕后我按照选择法排序的思想对链表的结点进行交换.是地址交换.

#include <stdio.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);/*任意交换双向链表两个结点的地址*/
void 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);
 getch();
}

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058