• 线性表ADT实现


    ■ 线性表ADT实现

    假设线性表ADT的数据元素类型为正整数,采用带头结点的单链式存储结构。线性表ADT实现的大部分代码已经给出,请补充写出类的两个成员函数insert和reverse。 注意:只需提交需要补充的函数代码,其他代码不能自己重写和修改。

    insert函数:在元素值从小到大有序的线性表中插入一个元素,仍然保持有序。

    reverse函数:实现线性表元素的倒置,即将线性表中数据元素的顺序反转。

    线性表元素输入时,以 endTag 作为结束标志。

    例如输入: 3 8 7 2 4 9 1 6 5 0

    则输出:9 8 7 6 5 4 3 2 1

    预置代码如下: (其中/* */ 部分是要补充的insert和reverse函数)

    #include<iostream>
    
    #include<stdlib.h>
    
    using namespace std;
    
    typedef int ElemType;  //数据元素类型
    
    class List; //前视定义,否则友元无法定义
    
    //结点类定义
    
    class LinkNode
    
    {  friend  class List; 
    
       private: 
    
         LinkNode *link; 
    
         ElemType data;  
    
       public: 
    
         LinkNode (LinkNode *ptr = NULL)    {link=ptr;}
    
         LinkNode(const ElemType & item, LinkNode *ptr = NULL){  data=item;link=ptr;} 
    
         ~LinkNode(){}; 
    
    }; 
    
    //单链表类定义 
    
    class List   
    
    {  private:    
    
         LinkNode *first; //指向链表头结点的指针          
    
       public:
    
         List (ElemType x) { first = new LinkNode (x);}   // 带头结点
    
         ~List (){ MakeEmpty();}         //析构函数
    
         void MakeEmpty ( );      //线性表置空    
    
         void insert(ElemType val);   //在有序线性表中插入元素val
    
         void reverse();   //线性表的倒置
    
         void output();    //线性表的输出               
    
    }; 
    
    void List:: MakeEmpty ( )
    
     { LinkNode *q;
    
       while (  first->link != NULL ) 
    
    	{ q = first->link;  //指向别摘下结点 
    
          first->link = q->link;//从链中摘下结点
    
          delete q;        //释放摘下的结点 
    
        }
    
    };	
    
    void List ::output ( )
    
    {  LinkNode  *p=first->link; 
    
       while(p!=NULL)
    
       { if(p==first->link) cout<<p->data;
    
         else  cout<<" "<<p->data;
    
         p=p->link;
    
       }
    
       cout<<endl;
    
    }
    
    
    /*
    
    **************************************************
    
    请写出 insert 成员函数
    
    **************************************************
    
    **************************************************
    
    请写出 reverse 成员函数
    
    **************************************************
    
    */
    
    int  main()
    
    {   List list(0);
    
        ElemType endTag=0;
    
        ElemType val;
    
        //下面通过不断读入元素,插入到有序单链表中,建立从小到大的有序单链表
    
        cin>>val;
    
        while(val!=endTag) 
    
         {  list.insert(val);     //在有序表中插入一个元素
    
            cin>>val;  
    
          }
    
        list.reverse ();   //线性表倒置
    
        cout<<"The result is:"<<endl;
    
        list.output ();
    
        return 0;
    
    }
    
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    typedef int ElemType;  //数据元素类型
    class List; //前视定义,否则友元无法定义
    
    //结点类定义
    class LinkNode {
        friend class List;
    
    private:
        LinkNode *link;
        ElemType data;
    public:
        LinkNode(LinkNode *ptr = NULL) { link = ptr; }
    
        LinkNode(const ElemType &item, LinkNode *ptr = NULL) {
            data = item;
            link = ptr;
        }
    
        ~LinkNode() {};
    };
    
    //单链表类定义
    
    class List {
    private:
        LinkNode *first; //指向链表头结点的指针
    public:
    
        List(ElemType x) { first = new LinkNode(x); }   // 带头结点
        ~List() { MakeEmpty(); }         //析构函数
        void MakeEmpty();      //线性表置空
        void insert(ElemType val);   //在有序线性表中插入元素val
        void reverse();   //线性表的倒置
        void output();    //线性表的输出
        int Length() const;
    
        LinkNode *Search(ElemType x);
    
        LinkNode *Locate(int i);
        void Delete(int i,ElemType &x);
    };
    void  List::Delete(int i,ElemType &x) {
        LinkNode *p = Locate(i - 1), *q;
        q = p->link;
        p->link = q->link;
        x = q->data;
        delete q;
    }
    LinkNode *List::Locate(int i) {
        LinkNode *p = first;
        int j = 0;
        while (p != NULL && j < i) {
            p = p->link;
            j++;
        }
        return p;
    }
    LinkNode *List::Search(ElemType x) {
        LinkNode *p = first->link;
        while (p != NULL && p->data != x) {
            p = p->link;
        }
        return p;
    }
    void List:: MakeEmpty ( ) {
        LinkNode *q;
    
        while (first->link != NULL) {
            q = first->link;  //指向别摘下结点
    
            first->link = q->link;//从链中摘下结点
    
            delete q;        //释放摘下的结点
    
        }
    };
    
    int List::Length()const {
        LinkNode *p = first;
        int cnt = 0;
        while (p->link != NULL) {
            cnt++;
            p = p->link;
        }
        return cnt;
    }
    void List ::output ( ) {
        LinkNode *p = first->link;
        while (p != NULL) {
            if (p == first->link) cout << p->data;
            else cout << " " << p->data;
            p = p->link;
        }
        cout << endl;
    }
    
    void List ::insert(ElemType val) {
        LinkNode *q = new LinkNode(val);//将要插入的元素
    
        LinkNode *pre = first;
    
        LinkNode *p = first->link;//first是头节点,p是除头节点外的第一个节点
    
        while (p != NULL && p->data < val) {
            pre = p;
            p = p->link;
        }
        pre->link = q;
        q->link = p;
    }
    
    void List ::reverse() {
        LinkNode *t, *p;
    
        t = p = first->link;
    
        first->link = NULL;
    
        while (p != NULL) {
            t = t->link;
    
            p->link = first->link;
    
            first->link = p;
    
            p = t;
        }
    }
    
    int  main() {
        List list(0);
    
        ElemType endTag = 0;
    
        ElemType val;
    
        //下面通过不断读入元素,插入到有序单链表中,建立从小到大的有序单链表
    
        cin >> val;
    
        while (val != endTag) {
            list.insert(val);     //在有序表中插入一个元素
            cin >> val;
        }
    
        list.reverse();   //线性表倒置
    
        cout << "The result is:" << endl;
    
        list.output();
    
        return 0;
    
    }
    
  • 相关阅读:
    win10系统激活 快捷方式
    echarts 图表自适应外部盒子大小
    JS开发常用工具函数 总结
    课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    基于mykernel 2.0编写一个操作系统内核
    框架复习_SpringMvc
    框架复习_Mybatis
    框架复习_Spring
    IDEA调试
  • 原文地址:https://www.cnblogs.com/Accpted/p/13085952.html
Copyright © 2020-2023  润新知