[数据结构] 单链表

 数据结构的练习与巩固
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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 }

 

posted @ 2020-06-15 20:37  蔚蓝の天空  阅读(61)  评论(0编辑  收藏  举报