• 【数据结构】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;
    }

     测试结果:

  • 相关阅读:
    全球疫情可视化
    ListView(1)
    《浪潮之巅》阅读笔记02
    Intern Day12
    Intern Day11
    Intern Day10
    Intern Day10
    Intern Day10
    PTA1065
    Intern Day10
  • 原文地址:https://www.cnblogs.com/robotpaul/p/9977950.html
Copyright © 2020-2023  润新知