zoukankan      html  css  js  c++  java
  • 【数据结构】1-1 线性表

    //单链表.cpp
    #include"LinkList.h"
    #include<iostream>
    template<class T>
    LinkList<T>::LinkList()
    {
        head = new Node<T>;
        head->link = NULL;
    }
    template<class T>
    void LinkList<T>::Clear()
    {
        if (head != NULL)
        {
            Node<T> *p;
            p = head->link;
            while (p != NULL)
            {
                Node<T> *del = p;
                p = p->link;
                delete del;
            }
            head=NULL;
        }
    }
    template<class T>
    LinkList<T>::LinkList(T data[], int  mSize)
    {
        head = new Node<T>;
        head->data = data[0];
        head->link = NULL;
        Node<T> *end = head;
        //头结点创建并初始化完毕
        for (int i = 1; i < mSize; i++)
        {
            Node<T> *p = new Node<T>;
            p->data = data[i];
            p->link = NULL;
            end->link = p;
            end = p;
        }
    
    }
    template<class T>
    bool LinkList<T>::Insert(int pos, const T&x)
    {
        int cont = 1;
        Node<T> *p = head;
        bool flag = false;
        while (p != NULL&&cont<=pos-1)
        {
            if (cont == pos - 1)
            {
                Node<T> *add = new Node<T>;
                add->data = x;
                add->link = p->link;
                p->link = add;
                flag = true;
                break;
            }
            else
            {
                cont++;
                p = p->link;
            }
    
        }
        return flag;
    }
    template<class T>
    bool LinkList<T>::Remove(int pos, T&x)
    {
        int cont = 1;
        Node<T> *p = head;
        bool flag = false;
        while (p != NULL && cont <= pos - 1)
        {
            if (cont == pos - 1)
            {
                Node<T> *del = p->link;
                p->link = p->link->link;
                x=del->data;
                delete del;
                flag = true;
                break;
            }
            else
            {
                cont++;
                p = p->link;
            }
    
        }
        return flag;
    }
    template<class T>
    bool LinkList<T>::Replace(int pos, const T&x)
    {
        int cont = 1;
        Node<T> *p = head;
        bool flag = false;
        while (p != NULL && cont <= pos)
        {
            if (cont == pos)
            {
                p->data = x;
                flag = true;
                break;
            }
            else
            {
                cont++;
                p = p->link;
            }
    
        }
        return flag;
    }
    template<class T>
    int LinkList<T>::Length()const
    {
        int cont = 0;
        Node<T> *p = head;
        while (p != NULL)
        {
            cont++;
            p = p->link;
        }
        return cont;
    }
    template<class T>
    bool LinkList<T>::IsEmpty() const
    {
        return head == NULL;
    }
    template<class T>
    void LinkList<T>::Output() const
    {
        Node<T> *p = head;
        int cont = 0;
        while (p != NULL)
        {
            cout << p->data << "    ";
            p = p->link;
            cont++;
            if (cont % 10 == 0)
                cout << endl;
        }
        cout << endl;
    }
    template<class T>
    bool LinkList<T>::search(const T&x) const
    {
        bool flag = false;
        Node<T> *p = head;
        while (p != NULL)
        {
            if (p->data == x)
            {
                flag = true;
                break;
            }
            p = p->link;
        }
        return flag;
    }

    头文件:

    //LinkList.h
    #include<iostream>
    using namespace std;
    template<class T>
    struct Node   //结点结构
    {
        T data;   //结点数据
        Node*link;
        Node() { link = NULL; }
        Node(T e, Node *next = NULL)
        {
            data = e;
            link = next;
        }
    };
    template<class T>
    class LinkList     //带表头结点的单链表类
    {
    private:
        Node<T> *head;              //链表指针
    public:
        LinkList();    //构造带表头结点的空单链表
        LinkList(T data[], int  mSize);//构造有mSize个元素的单链表
        ~LinkList() { Clear(); }            //析构函数
        bool Insert(int pos, const T&x);   //在单链表第pos个元素前插入元素x
        bool Remove(int pos, T&x);    //删除单链表第pos个元素
        bool Replace(int pos, const T&x);  //将修改单链表第pos个元素为x
        int Length()const;      //求表长
        bool IsEmpty() const;  //判空操作
        void Clear();        //清空操作
        void Output() const;    //输出链表
        bool search(const T&x) const;//查找元素x在表中是否存在
    }; 

    测试代码:

    //测试.cpp
    #include"单链表.cpp"
    #include<ctime>
    void menu()//模拟菜单选项
    {
        cout << "********************************************************" << endl;
        cout << "*            1 ------------输出链表                                                                      *" << endl;
        cout << "*            2 ------------插入元素                                                                      *" << endl;
        cout << "*            3 ------------删除元素                                                                      *" << endl;
        cout << "*            4 ------------销毁链表                                                                      *" << endl;
        cout << "*            5 ------------查找                                                                               *" << endl;
        cout << "*            0 ------------退出系统                                                                      *" << endl;
        cout << "********************************************************" << endl;
    }
    const int N = 20;
    int main()
    {
        srand((unsigned)time(NULL));//以系统当前时间初始化随机数发生器
        int data[N];
        for (int i = 0; i < N; i++)
            data[i]=rand()%100;//用随机数发生器产生100以内的整数
        LinkList<int> L(data, N);//创建N个元素的单链表
        menu();
        while (1)  //模拟菜单工作方式
        {
            int select;
            cout << "请输入您的选择:";    
            cin >> select;
            switch (select)
            {
            case 1:        //输出单链表
                if (L.IsEmpty())
                {
                    cout << "链表为空!" << endl;
                }
                else
                    L.Output();
                break;
            case 2:       //插入
                int pos, elem;
                cout << "请输入插入位置:";
                cin >> pos;
                cout << "插入元素:";            
                cin >> elem;
                if (L.Insert(pos, elem))     //插入成功
                    cout << "在第" << pos << "个元素前成功插入" << elem << endl;
                else   //插入失败
                    cout << "插入位置不合法!" << endl;
                break;
            case 3:       //删除
                cout << "请输入删除位置:";    cin >> pos;
                int x;
                if (L.Remove(pos, x))//删除单链表的第pos个元素
                    cout << "单链表的第" << pos << "个元素" << x << "已被删除。" << endl;
                else
                    cout << "删除位置不合法!" << endl;
                break;
            case 4:       //销毁链表
                char OK;
                cout << "确定要销毁链表吗?(y/n)" << endl;    
                cin >> OK;
                if (OK == 'y' || OK == 'Y')    L.Clear();
                break;
            case 5:       //查找
                cout << "请输入查找元素:";        
                cin >> elem;
                if (L.search(elem))
                    cout << "查找成功!" << endl;
                else
                    cout << "查找失败!" << endl;
                break;
            case 0:       //退出
                exit(0);
            default:
                cout << "您输入的选项有误,请重新输入:";
            }
        }
        return 0;
    }

     测试结果:

  • 相关阅读:
    HOJ 2139 Spiderman's workout(动态规划)
    FZU 2107 Hua Rong Dao(dfs)
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
  • 原文地址:https://www.cnblogs.com/robotpaul/p/9977950.html
Copyright © 2011-2022 走看看