链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定
链表基本操作实现 c语言版本, 该程序在visual c++ 6.0上调试通过!
本人写该程序完全是为学习交流之用,还望大家多多指教。 可以随便引用,或修改本程序,但需注明请注明出处!多谢!
引用地址:http://blog.sina.com.cn/maxiaof
/*
Author: Jacky Ma
Date : 23th,May,07
*/
/*
主要实现
1 链表的创建,
2 逆置
3 排序
4 有序链表的归并
5 两链表连接
6 循环链表的判定
*/
#include <iostream>
#include <time.h>
using namespace std;
///////////////////////////////////////////////
//链表节点结构
struct linknode
{
int data;
linknode *next;
};
//链表节点结构
///////////////////////////////////////////////
///////////////////////////////////////////////
//创建单链表
linknode * create(int n)
{
linknode *internode=(linknode*)malloc(sizeof(linknode));
linknode *head=internode;
internode->data=0;
for(int i=1;i<n;i++)
{
linknode *midnode=(linknode*)malloc(sizeof(linknode));
internode->next=midnode;
midnode->data=i;
internode=midnode;
}
internode->next=NULL;
return head;
}
//创建单链表
///////////////////////////////////////////////
///////////////////////////////////////////////
//连接链表
linknode * linkcontact(linknode *head1,linknode *head2)
{
linknode *p=head1;
linknode *q;
while(p!=NULL)
{
q=p;
p=p->next;
}
q->next=head2;
return head1 ;
}
//连接链表
///////////////////////////////////////////////
///////////////////////////////////////////////
//链表逆序
linknode * linkrever(linknode *head)
{
if(head==NULL){ cout<<"This is an empty link"<<endl; return 0;}
if(head->next==NULL){return head;}
linknode *p,*q,*bq;
p=head;
q=p->next;
p->next=NULL;
while(q!=NULL)
{
bq=q->next;
q->next=p;
p=q;
q=bq;
}
head=p;
return head;
}
//链表逆序
///////////////////////////////////////////////
///////////////////////////////////////////////
//链表排序用插入法
linknode *linksort(linknode *head)
{
if(head==NULL){ cout<<"This is an empty link"<<endl; return 0;}
if(head->next==NULL){return head;}
linknode *p,*q,*qb,*hp,*pb;
p=head; //p指向前链表
hp=p;
q=p->next; //隔离链表,第一个节点首先分离出来
p->next=NULL; //
while(q!=NULL)
{
int i=0;
while(p!=NULL)
{
if(q->data>=p->data)//继续向前走
{
pb=p;
p=p->next;
i++;
continue;
}
else if(q->data<p->data)//要进行插入
{
if(0==i) //在插入第一个位置
{
qb=q->next;
q->next=p;
p=q;
q=qb;
hp=p;
}
else //插入其他位置
{
qb=q->next;
q->next=p;
pb->next=q;
q=qb;
p=hp;
}
break;
}
}
if(p==NULL) //直接插入最后
{
qb=q->next;
q->next=NULL;
pb->next=q;
q=qb;
p=hp;
}
}
head=hp;
return head;
}
//链表排序用插入法
///////////////////////////////////////////////
///////////////////////////////////////////////
//有序单链表合并后有序
linknode * linkmerge(linknode *head1,linknode *head2)
{
if(head1==NULL||head2==NULL){cout<<" the links are empty"<<endl; return 0;}
linknode *p=head1;
linknode *q=head2;
linknode *bp;//纪录p的前一个节点
linknode *bq;//记录q后的一个节点
linknode *headp;
if(q->data<p->data)//插入第一要特殊处理只可能有一个插入第一个
{
bq=q->next;
q->next=p;
p=q;
q=bq;
}
headp=p;
while(q!=NULL&&p!=NULL)
{
if(p->data<q->data)
{
bp=p;
p=p->next;
continue;
}
else
{
bq=q->next;
q->next=p;
bp->next=q;
p=q;
q=bq;
}
}
if(q==NULL) { }
else if(p==NULL){ bp->next=q; }
return headp;
}
//有序单链表合并后有序
///////////////////////////////////////////////
///////////////////////////////////////////////
//判断链表是否有环
bool linkcir(linknode *str)
{
linknode *p=str;
linknode *q=str->next;
while(q!=NULL)
{
if(p==q)
{
cout<<"链表中存在环被发现"<<endl;
return true;
}
q=q->next->next;
p=p->next;
}
return false;
}
//判断链表是否有环
///////////////////////////////////////////////
////////////////////////////////////////////////
//输出单链表的值
void printlinkdata( linknode *node)
{
linknode *p=node;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//输出单链表的值
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
void main()
{
int L1=5;
int L2=10;
int L3=15;
linknode *linkhead1=create(L1);
linknode *linkhead2=create(L2);
linknode *linkhead3=create(L3);
linknode *p1,*p2,*p3;
p1=linkhead1;
p2=linkhead2;
p3=linkhead3;
srand((unsigned)time(NULL));//产生种子,每一次序列都不相同
while(p1!=NULL)
{
p1->data=(int)(100*rand()/(RAND_MAX+1.0)); //随机产生样本序列
p1=p1->next;
}
while(p2!=NULL)
{
p2->data=(int)(100*rand()/(RAND_MAX+1.0)); //随机产生样本序列
p2=p2->next;
}
while(p3!=NULL)
{
p3->data=(int)(100*rand()/(RAND_MAX+1.0)); //随机产生样本序列
p3=p3->next;
}
linknode *pinter1,*pinter2,*pinter3,*pinter4;
cout<<"链表1排序前序列"<<endl;
printlinkdata(linkhead1);
cout<<"链表1排序后序列"<<endl;//验证排序函数
pinter1=linksort(linkhead1);
printlinkdata(pinter1);
cout<<"链表2原始序列"<<endl;
printlinkdata(linkhead2);
cout<<"链表2逆置后序列"<<endl;//验证逆置位函数
pinter2=linkrever(linkhead2);
printlinkdata(pinter2);
cout<<"链表2逆置后排序后序列"<<endl;
pinter2=linksort(pinter2);
printlinkdata(pinter2);
cout<<"链表1,2排序后序列合并后结果"<<endl;//验证有序序列合并后有序
pinter3=linkmerge(pinter1,pinter2);
printlinkdata(pinter3);
cout<<"链表3原始序列"<<endl;
printlinkdata(linkhead3);
cout<<"链表1,2排序后序列合并后结果和链表3原始序列的连接"<<endl;//验证链表连接函数
pinter4=linkmerge(pinter3,linkhead3);
printlinkdata(pinter4);
cout<<"链表1,2排序后序列合并后结果和链表3原始序列连接后的链表创建一个环"<<endl;
linknode *p=pinter4->next->next;
linknode *q=pinter4->next;
for(int i=0; i<10; i++)
{
q=q->next;
}
q->next=p;
cout<<linkcir(pinter4);//验证判定链表中环存在性
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zxywd/archive/2010/04/15/5488901.aspx