链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定
鏈表的各種操作實現 鏈表逆序 鏈表排序 有序鏈表歸并 鏈表存在環的判定
鏈表基本操作實現 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
總結
以上是生活随笔為你收集整理的链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十进制转换二进制(原码)
- 下一篇: 最近有不少网友给我的书提出了问题,并要求