• [数据结构] 单链表


     数据结构的练习与巩固
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    1
    //结点定义 2 template <class T> 3 struct LinkNode 4 { 5 T data; //***可定义多个用来存储数据的变量 6 LinkNode<T>* link; 7 8 LinkNode(LinkNode<T>* ptr = NULL) 9 {link = ptr;} 10 LinkNode(const T& item, LinkNode<T> *ptr = NULL) 11 {data = item; link = ptr;} 12 };
      1 //单链表定义
      2 template <class T>
      3 class List: public LinearList<T>
      4 {
      5 protected:
      6     LinkNode<T>* first;         //链表首项
      7 
      8 public:
      9     List() 
     10          { first = new LinkNode<T>; }      //创建第一个结点,并将首项指针指向此结点
     11     List(const T& x)
     12          { first = new LinkNode<T>(x); }   //带有数值的构造函数
     13     List(List<T>& L);                      //复制构造函数
     14     ~List()                                //析构函数
     15          { makeEmpty(); }
     16     void makeEmpty();                      //删除链表
     17     int Length()const;                     //得到长度
     18 
     19     LinkNode<T>* getHead()const            //得到首项结点
     20          { return first; }
     21     LinkNode<T>* Search(T x);              //搜索数据为x的结点
     22     LinkNode<T>* Locate(int i);            //定位位置为i的结点
     23     bool getData(int i, T& x);             //得到位置为i的结点的数据
     24     bool Insert (int i, T& x);             //在位置i处插入数据为x的新结点
     25     bool Remove (int i, T& x);             //移除位置在i的结点,并获取该点数据
     26     bool IsEmpty()const                    //判断是否是空指针,只要知道首项指针的link是否为空即可
     27          {return first->link == NULL ? true : false;}
     28     bool IsFull()const                     //判断链表是否满,默认不会满
     29          {return false;}
     30     void Sort();                           //整理单链表
     31     void Input();                          //逐项创建单链表
     32     void Output();                         //逐项输出单链表
     33     List<T>& opertator = (List<T> & L);    //重构 = 
     34 }
     35 
     36 template <class T> 
     37 void List<T>::makeEmpty()
     38 {
     39     LinkNode<T>* q;
     40     while (first->link != NULL)
     41     {
     42         q = first->link;         //从头开始逐项删除
     43         first->link = q->link;
     44         delete p;
     45     }
     46 }
     47 
     48 template <class T>
     49 int List<T>::Length()const
     50 {
     51     LinkNode<T>* p = first->link; //从头开始计数
     52     int count = 0;
     53     while (p != NULL)             //当该节点为非空结点时
     54     {
     55         count++;
     56         p = p->link;              //p指向下一位
     57     }
     58     return count;
     59 }
     60 
     61 template <class T>
     62 LinkNode<T>* List<T>::Search(T x)
     63 {
     64     LinkNode<T>* p = first->link;  //从头开始找 所要找的结点
     65     while (p != NULL)              //当结点非空的时候
     66         if (p->data == x)break;    //当结点数据与所查找数据一致时
     67         else p = p->link;          //如果不一致,则移至下一位
     68     return p;                      //当到结尾依旧没找到时,会指向空结点(最后一位是空结点)
     69 }
     70 
     71 template <class T>
     72 LinkNode<T>* List<T>::Locate(int i)
     73 {
     74     if (i < 0)return NULL;
     75     LinkNode<T>* p = first;        //从头开始数
     76     int j = 0;                     //创建一个用于计数的变量
     77     while (p != NULL && j < i)     //当没有到结尾的时候,继续向后移动
     78     {
     79         p = p->link;
     80         j++;
     81     }
     82     return p;                      //当到结尾依旧没找到时,会指向空结点(最后一位是空结点)
     83 }
     84 
     85 template <class T>
     86 bool List<T>::getData()
     87 {
     88     if (i <= 0)return NULL;         //如果输入的位置不符合规范,则返回0值
     89     LinkNode<T>* p = Locate(i);     //定位i处
     90     if (p == NULL)                  //如果该处是空结点,则返回0值
     91         { return false; }
     92     else 
     93         { x = p->data; return true; }
     94 }
     95 
     96 template <class T>
     97 bool List<T>::Insert(int i, T&x)
     98 {
     99     LinkNode<T>* p = Locate(i);
    100     if (p == NULL)return false;
    101     else 
    102     {
    103         New = new LinkNode<T>(x);
    104         if (New == NULL) 
    105              { cerr << "错误:申请了空结点" << endl; exit(1); }
    106         New->link = p->link;      //插入新结点,前后关系变化
    107         p->link = New;
    108         return true;
    109     }
    110 }
    111 
    112 template <class T>
    113 bool List<T>::Remove(int i, T&x)
    114 {
    115     LinkNode<T>* p = Locate(i - 1);    //定位所删节点的前一位
    116     if (p == NULL || p->link == NULL)  //如果此处或此处后一位,为空结点
    117         return false;
    118     LinkNode<T>* q = p->link;          //令q指向所删节点
    119     x = q->data;                       //提取所删节点数据
    120     p->link = q->link;                 //前后关系变化
    121     delete q;                          //删除该节点
    122     return true;
    123 }
    124 
    125 template <class T>
    126 List<T>& List<T>::Operator = (List<T> & L)
    127 {
    128     T value;
    129     LinkNode<T>* srcptr = L.getHead();     //令源头指针指向源链表头部
    130     LinkNode<T>* destptr = first = new LinkNode<T>;  //创建新结点(新单链表)并让首相指针指向该结点
    131     while (srcptr->link != NULL)           //当源指针 仍未指向 源链表 的结尾空指针时
    132     {
    133         value = srcptr->link->data;        //令value=该结点的值
    134         destptr->link = new LinkNode<T>(value); //创建新结点并将value赋予
    135         destptr = destptr->link;           //向后移一位
    136         srcptr = strpt->link;              //向后移一位
    137     }
    138     destptr->link = NULL;                  //结尾指针指向空
    139     return *this;                          //返回这个复制链表
    140 }
    141 
    142 //补充函数
    143 template <class T>
    144 void List<T>::inputFront(T endTag)    //前插法建立单链表
    145 {
    146     LinkNode<T>* newNode;                 //创建新结点
    147     T value;                              
    148     makeEmpty();                          //置空单链表
    149     cin >> value;
    150     while (value != endTag)               //当没有输入停止符时
    151     {
    152         newNode = new LinkNode<T>(value); //创建新结点
    153         if (newNode == NULL)              //当创建了空结点时
    154         {
    155             cerr << "error" << endl; exit(1);
    156         }
    157         newNode->link = first->link;      //前后关系变化
    158         first->link = newNode;
    159         cin >> value;                     //输入新value
    160     }
    161 }
    162 
    163 template <class T>
    164 void List<T>::inputRear(T endTag)    //后插法建立单链表
    165 {
    166     LinkNode<T>* newNode, * last;
    167     T value; 
    168     makeEmpty();
    169     cin >> value;
    170     last = first;
    171     while (value != endTag)               //当没有输入停止符时
    172     {
    173         newNode = new LinkNode<T>(value); //创建新结点
    174         if(newNode==NULL)                 //当创建了空结点时
    175         {
    176             cerr << "error" << endl; exit(1);
    177         }
    178         last->link = newNode;             //前后关系变化
    179         last = newNode;
    180         cin >> value;                     //输入新value
    181     }
    182 }
  • 相关阅读:
    JSP具体条款——response对象
    智课雅思词汇---三、aud和auto和bene是什么意思
    如何实现无刷新图片上传
    智课雅思词汇---二、词根acu和acr
    FormData是什么
    ajax如何上传文件(整理)
    js插件---评分插件Rating如何使用
    js插件---Amaze UI dialog如何使用
    js插件---layer.js使用体验是怎样
    算法答疑---06:月度开销
  • 原文地址:https://www.cnblogs.com/nagishiro/p/13137687.html
Copyright © 2020-2023  润新知