网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
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程序的秘籍(强!).
.CB非可视组件的消息处理技巧.
.LINUX C语言开发简介.
.在RichEdit中实现超链接.
.在C++Builder中使用DLL.
.c++中函数重载的相关知识.
.行==列==对角线 ◎ 魔幻矩阵.
.C编写Windows服务程序的五个步骤.
.取得汉字的笔画的源码(1).
.C++中函数指针数组的妙用.
.CB设置环境选项设置.
.VC++中利用磁盘序列号识别正版软.
.C++箴言:类型转换时定义非成员函.
.C++ BUILDER 动态建立.
.C语言入门之函数(2).
.C语言初学者的困惑--如何由dos向.
.程序配置信息的保存.
.nsd启动.
.C语言初学者入门讲座 第十讲 函数.
.通过覆盖__atexit进行缓冲区溢出.

合并两个带头结点的有序循环链表合并为一个带头结点的有序循环链表

发表日期:2008-3-8


#include<stdio.h>   //预编译命令
#include<iostream.h>
strUCt list//定义结构体
{
 int num;
 list*next;
};
list*head,*end;         //定义全局变量 list*creat()//创建链表的函数
{
 list*p=NULL;
 list*q=NULL;
 head=NULL;
 int num;
 printf("Input number:\n");
 scanf("%d",&num);
 while(num!=0)
 {
  p=new list;      //开辟空间
  p->num=num;
  if(head==NULL)
   head=p;
  else
   q->next=p;
  q=p;
  scanf("%d",&num);
 }
 end=q;   //将链表的结尾最后一个结点赋给end
 end->next=head;  //让最后一个结点的的下个结点的地址不为空而指向头指针
 return(head);
} void print(list*head)//打印循环链表的函数
{
 int k=0;
 list*r=head;
 do
 {
  cout.width(2);
  k=k+1;
  cout<<k<<":"<<r->num<<endl;
  r=r->next;
 }while(r!=head);
} void insert(list*pHead,list*pNode)   //插入接点的函数
{
 list*q,*r;
 //第一种情况,链表为空
 if(pHead==NULL)
 {
  pHead=pNode;    //链表头指向pNode
  return;      //完成插入操作,返回
 }  //第二种情况,pNode结点num的值小于链表头结点num的值
 //则将pNode的值插到链表头部
 if(pNode->num<=pHead->num)
 {
  pNode->next=pHead;   
  pHead=pNode;    
  return;
 }
 //第三种情况,循环查找正确位置
 r=pHead;
 q=pHead->next;
 while(q!=pHead)
 {
  if(pNode->num>q->num)
  {
   r=q;
   q=q->next;
  }
  else
   break;
 }
 r->next=pNode;
 pNode->next=q;
} list*together(list*p1,list*p2)      //定义两个链表合并的函数
{
 list*q,*r;
 q=p2;
 
 do
 {
  r=new list;   //开辟空间
  r->num=q->num;  //将q的值赋给r
  r->next=NULL;       //让r的下一个指针的地址为空,目的是使它成为一个独立的结点
  insert(p1,r);  //调用插入结点的函数
  q=q->next;   //指针向后拨一个接点
 }while(q!=p2);   //当在最后一个结点时停止循环
 return(p1);    //返回头指针
} void main()   //主函数
{
 list*list1,*list2;
 printf("Input list1\n");
 printf("If number is 0,stop inputing\n");
 printf("数据请从小到大输入\n");
 list1=creat();    //调用创建链表的函数
 print(list1);    //打印第一个链表

 printf("Input list2\n");
 printf("If number is 0,stop inputing\n");
 printf("数据请从小到大输入\n");
 list2=creat();   //调用创建链表的函数
 print(list2);   //打印第二个循环链表  head=together(list1,list2);    //调用合并两个链表的函数
 printf("The new list is:\n");
 print(head);       //打印最后结果
}

上一篇:Windows的动态链接库原理及使用1 人气:580
下一篇:Windows中控制台程序的全屏模式开关 人气:563
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐