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