實習目的:熟練掌握鏈表的建立及基本操作
問題描述:
1)實現鏈表的排序(升序)
2)實現兩個有序鏈表的合並:A=A∪B,要求合並后仍然有序。
提交前請將所有的提示信息去掉,只保留最后的輸出結果。例如運行時:從鍵盤直接輸入:
2 1 2
3 1 2 3
輸出結果為:
1
2
3
分別表示第一個鏈表元素個數為2,元素分別為 1,2 ;第二個鏈表元素個數為3,元素分別為1,2,3。
例如:
輸入 | Result |
---|---|
2 2 1 3 1 2 3 |
1 2 3 |
第一問是通過對鏈表的操作,利用冒泡排序,完成該操作。
對於第二問則是利用查找來實現A=A∪B
實現過程:
一、首先構造鏈表
1 class List; 2 class LinkNode 3 { 4 friend List; 5 private: 6 LinkNode *link;//指向下一個節點 7 int data;//結點內容 8 public: 9 LinkNode (LinkNode *ptr = NULL) 10 { 11 link=ptr; 12 } 13 LinkNode(const int & item, LinkNode *ptr = NULL) 14 { 15 data=item; 16 link=ptr; 17 } 18 ~LinkNode() {}; 19 }; 20 class List 21 { 22 private: 23 LinkNode *first;//頭指針 24 public: 25 List () 26 { 27 first = new LinkNode (); 28 }//構造函數,開辟新空間 29 30 void qsort ( int n);//排序 31 void Insert (int x );//插入 32 void Union(List b);//並運算 33 void input(int endTag);//輸入 34 void output();//輸出 35 };
二、利用前插法構建鏈表
1 void List :: input (int n) 2 { 3 LinkNode *newnode; 4 int val;//讀取內容 5 while(n--) 6 { 7 cin>>val; 8 newnode=new LinkNode (val);//創建新節點 9 newnode->link=first->link;//將新節點指向頭結點的下一位 10 first->link=newnode;//頭結點指向新節點 11 12 } 13 }
三、利用冒泡進行排序
void List ::qsort ( int n) { while(n--)//進行n循環 { LinkNode *p=first->link; while(p->link!=NULL)//進行一次遍歷 { if(p->data>=p->link->data)//如果該點值小於下一個點值,data內容進行交換 { int temp=p->data; p->data=p->link->data; p->link->data=temp; } p=p->link; } } }
四、利用查找進行合並
void List ::Union(List b)
{
LinkNode *p=first->link;
while(p!=NULL)
{
LinkNode *p1=b.first->link;
bool f=0;
while(p1!=NULL)
{
{
LinkNode *p=first->link;
while(p!=NULL)
{
LinkNode *p1=b.first->link;
bool f=0;
while(p1!=NULL)
{
if(p1->data==p->data)//在A中進行查找,若找到則標志f=1,否則將B中元素插入A;
{
f=1;
f=1;
break;
}
}
p1=p1->link;
}
if(f==0)
{
b.Insert(p->data);//插入函數
}
p=p->link;
}
if(f==0)
{
b.Insert(p->data);//插入函數
}
p=p->link;
}
}
}
附錄:插入函數
1 void List ::Insert (int x ) 2 { 3 LinkNode *newnode; ; 4 5 newnode=new LinkNode (x); 6 newnode->link=first->link; 7 first->link=newnode; 8 9 10 }
五、進行輸出
1 void List ::output ( ) 2 { 3 LinkNode *p=first->link; 4 while(p!=NULL) 5 { 6 cout<<p->data<<endl; 7 p=p->link; 8 } 9 }
六、主程序
1 int main() 2 { 3 4 List a; 5 int n; 6 cin>>n; 7 a.input(n); 8 a.qsort(n); 9 List b; 10 int m; 11 cin>>m; 12 b.input(m); 13 b.qsort(m); 14 a.Union(b); 15 b.qsort(m+n); 16 b.output(); 17 18 19 return 0; 20 21 }
七、簡單介紹
本博客寫的比較傻瓜,比較簡單,因為是早期寫的程序,有些地方調用不太合理,請見諒。