zoukankan      html  css  js  c++  java
  • 链表的基本操作

    实习目的:熟练掌握链表的建立及基本操作

    问题描述:

    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 }

    七、简单介绍

    本博客写的比较傻瓜,比较简单,因为是早期写的程序,有些地方调用不太合理,请见谅。

  • 相关阅读:
    HDOJ 2095 find your present (2)
    HDOJ 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
    九度 1337 寻找最长合法括号序列
    九度 1357 疯狂地Jobdu序列
    HDOJ 1280 前m大的数
    九度 1343 城际公路网
    九度 1347 孤岛连通工程
    HDOJ 2151 Worm
    九度 1342 寻找最长合法括号序列II
    九度 1346 会员积分排序
  • 原文地址:https://www.cnblogs.com/shdwin/p/11066876.html
Copyright © 2011-2022 走看看