网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.C++ Builder 使用动作.
.取得系统中网卡MAC地址的三种方法.
.定义函数对象.
.递归下降纯解释器编写的困惑.
.WINDOWS窗口的客户区域拖动技术及.
.程序中传递密码给数据库文件.
.C++语言常见问题解答(2).
.打印Memo的文本信息.
.C++入门解惑——为什么学习C++.
.全国计算机编程大赛复赛试题1.
.ASPDotNet.
.Linux 和 Unix 安全编程:环境变量.
.More Effective C++:不同new和d.
.深度探索C++对象模型(7).
.继承派生多态.
.第六章 树和二叉树 题解.
.C++中将ListView中的内容导出到W.
.挑战30天C++入门极限-引 言.
.C语言程序设计基础之预处理.
.“Hello world!”的N种写法.

双向链表的排序

发表日期:2008-3-8


以前写过双向链表交换任意结点的程序,后来写了个双向链表排序的程序,没用边输入边排序的思想,是输入完毕后我按照选择法排序的思想对链表的结点进行交换.是地址交换. #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++——图(1&2&3&4) 人气:760
下一篇:陀螺 人气:481
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐