程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 合並兩個帶頭結點的有序循環鏈表合並為一個帶頭結點的有序循環鏈

合並兩個帶頭結點的有序循環鏈表合並為一個帶頭結點的有序循環鏈

編輯:C語言基礎知識
#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: ");
   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 ");
   printf("If number is 0,stop inputing ");
   printf("數據請從小到大輸入 ");
   list1=creat();    //調用創建鏈表的函數
   print(list1);    //打印第一個鏈表
  
   printf("Input list2 ");
   printf("If number is 0,stop inputing ");
   printf("數據請從小到大輸入 ");
   list2=creat();   //調用創建鏈表的函數
   print(list2);   //打印第二個循環鏈表  head=together(list1,list2);    //調用合並兩個鏈表的函數
   printf("The new list is: ");
   print(head);       //打印最後結果
  }
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved