鏈表的基本操作


實習目的:熟練掌握鏈表的建立及基本操作

問題描述:

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)
        {
            if(p1->data==p->data)//在A中進行查找,若找到則標志f=1,否則將B中元素插入A;
            {
                f=1;
                break;
            }
            p1=p1->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 }

七、簡單介紹

 

本博客寫的比較傻瓜,比較簡單,因為是早期寫的程序,有些地方調用不太合理,請見諒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM