数据结构:线性表练习题(1)

 最近好忙,好长时间都没更新博客,唉,罪过罪过。

 这次博客做一个练习题,是我们学校的C++练习题,题目如下:

问题描述:

1)实现链表的排序(升序)

2)实现两个有序链表的合并:A=A∪B,要求合并后仍然有序。

提交前请将所有的提示信息去掉,只保留最后的输出结果。例如运行时:从键盘直接输入:

2 1 2
3 1 2 3 

输出结果为:

1
2
3

       分别表示第一个链表元素个数为2,元素分别为 1,2 ;第二个链表元素个数为3,元素分别为1,2,3。

       这个题比较简单,我用链表做的,有很多人说链表难,我觉得只要你弄懂了没有什么是难的。

       链表需要一个链表类和一个节点类,链表由一个一个节点组成,每个节点的地址由系统随机生成,需要一个就加一个,节点的成员变量包括data(需要节点存储的数据)和link(下一个节点的头地址),这是单链表节点的特点,至于双链表各位朋友可以上网搜索,双链表和单链表的思想是一样的,只不过双链表多了一个头指针,用来指向上一个节点的地址。

       这个题目比较简单,下面直接给出求解这个问题的完整代码:

#include <iostream>
#include <stdlib.h>
using namespace std;
class List;
class LinkNode{//链表节点类
    friend List;//定义List为友元类
public:
    LinkNode *link;//用来存储下一个节点的地址
    int data;//需要节点存储的数据
public:
    LinkNode(const int & item,LinkNode *ptr=NULL){data=item;link=ptr;}//构造函数赋初值
    LinkNode(LinkNode *ptr=NULL){link=ptr;}//函数重载
    ~LinkNode(){};//析构函数,释放节点内存
};

class List{//链表类
public:
    LinkNode *first;//头指针
    int da[1000]={0};
public:
    List(){first = new LinkNode();}
    ~List(){MakeEmpty();}//析构函数,释放链表内存
    void MakeEmpty();
    void input(int node_number);
    void Sort();
    void output();
};

void List::MakeEmpty(){
    LinkNode *q;
    while(first->link!=NULL){
        q= first->link;
        first->link = q->link;
        delete q;
    }
}

void List::input(int node_number){
    LinkNode *newnode;
    int val;
    for (int i=0;i<node_number;i++){
        cin>>val;
        da[i] = val;
        newnode = new LinkNode(val);
        newnode->link = first->link;
        first->link = newnode;
    }
}

void List::output(){
    LinkNode *q;
    q = first;
    while(q->link!=NULL){
        q = q->link;
        q->link = q->link;
        cout<<q->data<<endl;
    }
    cout<<endl;
}

void List::Sort(){
    for(int i=0;da[i]!=0;i++){
        for(int j=i+1;da[j]!=0;j++){
            if(da[j]<da[i]){
                int temp = da[i];
                da[i] = da[j];
                da[j] = temp;
            }
        }
    }
}
int main()
{
    List a,b;
    int x,y,i,j;
    int symbol=0;
    cin>>x;//链表节点个数
    a.input(x);
    a.Sort();
    cin>>y;
    b.input(y);
    b.Sort();
    for(i=0;a.da[i]!=0;i++){
            symbol = 0;
        for(j=0;b.da[j]!=0;j++){
            if(a.da[i]==b.da[j]){symbol=1;}
        }
    if (symbol==0){b.da[j]=a.da[i];}
    }
    b.Sort();
    for(i=0;b.da[i]!=0;i++){cout<<b.da[i]<<endl;}
    return 0;
}

sort函数按照节点所含的内容对节点进行排序。

在使用链式存储的时候,各位朋友记住绝对不能动first(即改变first的内容),否则会造成链表丢失,变成人工制造的垃圾。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值