首页 > 代码库 > 静态链表实现_详细注释
静态链表实现_详细注释
1 //SLinkList.h 2 3 #ifndef _SLINK_LIST_ 4 #define _SLINK_LIST_ 5 6 template<typename T> 7 class SLinkList 8 { 9 public: 10 SLinkList(int maxz = 100); 11 ~SLinkList(); 12 void CreateList(int n); 13 void Insert(int i, T e); 14 T Delete(int i); 15 T GetElem(int i); 16 int Locat(T e); 17 int Empty(); 18 int Full(); 19 int Length(); 20 void Clear(); 21 void ListDisplay(); 22 private: 23 struct Tcomp 24 { 25 T data; 26 int cur; //存储该元素下一个元素 数组对应的下标. 27 }; 28 Tcomp *sls; //存储数据元素的一维数组 29 int av; //备用链表表头 30 int sl; //静态链表表头 31 int maxLen; //链表可能的最大长度 32 }; 33 34 template<typename T> 35 SLinkList<T>::SLinkList(int maxsz) : maxLen(maxsz) //创建长度为maxsz空表 36 { 37 sls = new Tcomp[maxLen]; 38 sl = -1; 39 for (int i = 0; i < maxLen; i++) { //存放该元素后继所在的数组下标 40 sls[i].cur = i + 1; 41 } 42 sls[maxLen - 1].cur = -1; //表示他后面的结点为空 43 av = 0; 44 } 45 46 template<typename T> 47 SLinkList<T>::~SLinkList() 48 { 49 delete[]sls; 50 } 51 52 template<typename T> 53 void SLinkList<T>::CreateList(int n) 54 { 55 int value; 56 if (n > maxLen) throw "参数非法空间溢出"; 57 cout << "请依次输入" << n << "个元素值:\n"; 58 for (int i = 1; i <= n; i++) { //从1位置开始 59 cin >> value; 60 Insert(i, value); 61 } 62 } 63 64 template<typename T> 65 void SLinkList<T>::Insert(int i, T e) 66 { 67 int m, j = 0, k; 68 m = av; //备用结点的第一个结点 准备使用 69 if (av == -1) throw "备用链表为空"; 70 av = sls[av].cur; //得到最新表头,将 备用结点 往后移一结点,更新 71 if (sl == -1) //空链情况 72 { 73 sls[m].data = http://www.mamicode.com/e; //备用链表第一个结点的下标(m), 该下标位置的元素赋值为e 74 sls[m].cur = -1; //表示他后面(下一个)的结点为空(以后一直在他前面插入元素) 75 sl = m; //sl--数组最后一个元素的cur,用来存放第一个插入元素下标,相当于头结点 76 } 77 else if (i == 1) //插在表头 78 { 79 sls[m].data =http://www.mamicode.com/ e; 80 //置 该元素下一个元素 数组对应的下标为 上一次的头结点(就是说把该元素插入在上一次插入的元素之前) 81 sls[m].cur = sl; 82 sl = m; //sl--存放第一个插入元素的下标,相当于头结点,将当前元素下标置为头结点 83 } 84 else { 85 k = sl; //找前驱(头)结点 86 while (j < i - 1 && k != -1) //-1为尾结点标志,标志着该元素后为空 87 { 88 j++; 89 //向下一个元素位置查找 90 if (j < i - 1) k = sls[k].cur; 91 } 92 if (j != i - 1) throw "Station Exception !"; 93 sls[m].data = http://www.mamicode.com/e; //还是用上一次av得到的值来储存值,改变下一元素指向 94 sls[m].cur = sls[k].cur; //将下一元素的下标置为 通过i位置 对应的k值 的下一位置 95 sls[k].cur = m; //再用m的位置 覆盖 k的下一个元素位置, m->next, m(达到这种效果) 96 } 97 } 98 99 template<typename T>100 T SLinkList<T>::Delete(int i)101 {102 int m, j = 0, k;103 if (sl == -1) throw "Static LinkList is empty !";104 else if (i == 1) //删除链头105 {106 m = sl; //得到头结点107 sl = sls[sl].cur; //得到下一次的头结点108 sls[m].cur = av; //将m的下一个位置置为 备用结点的下标109 av = m; //将备用结点的表头,置成 头结点(相当于中间的部分被删除)110 return sls[m].data; //返回删除的结点111 }112 else113 {114 k = sl;115 while (j < i - 1 && k != -1) //找前驱结点k,删除k结点后的结点116 {117 j++; 118 if (j < i - 1) k = sls[k].cur; 119 } 120 if (j != i - 1) throw "Station Exception !";121 m = sls[k].cur; //得到k的下一结点122 sls[k].cur = sls[m].cur; //k->next = k->next->next123 sls[m].cur = av; //m->next = av(备用结点)124 av = m; //将 备用结点的表头,置成 头结点(相当于中间的部分被删除)125 return sls[m].data; 126 } 127 }128 129 template<typename T>130 int SLinkList<T>::Locat(T e)131 {132 int k = sl, j = 0; //sl--相当于首结点133 while (k != -1 && sls[k].data != e) {134 k = sls[k].cur; j++;135 }136 if (k == -1) return -1;137 else138 return j + 1;139 }140 141 template<typename T>142 void SLinkList<T>::Clear()143 {144 sl = -1; //头结点置为-1145 for (int i = 0; i < maxLen; i++) {146 sls[i].cur = i + 1; //恢复初始化147 }148 sls[maxLen - 1].cur = -1; //下一个位置为空的标志149 av = 0; //备用结点的表头设置 0150 }151 152 template<typename T>153 T SLinkList<T>::GetElem(int i)154 {155 int k = sl, j = 0; // k--指向首结点156 while (j < i && k != -1)157 {158 j++;159 if (j < i) k = sls[k].cur;160 }161 if (j == i) return (sls[k].data);162 else163 throw "Station Exception !";164 }165 166 template<typename T>167 int SLinkList<T>::Empty()168 {169 if (sl == -1) return 1;170 else 171 return 0;172 }173 174 template<typename T>175 int SLinkList<T>::Full()176 {177 //备用结点的表头等于 元素结束标志时(第一次在空链插入元素时,在最后的元素后的空元素置为-1,然后插入元素都是在元178 //素的前端插入 )179 if (av == -1) return 1;180 else return 0;181 }182 183 template<typename T>184 int SLinkList<T>::Length()185 {186 int k = sl, len = 0;187 while (k != -1) {188 len++; k = sls[k].cur;189 }190 return len;191 }192 193 template<typename T>194 void SLinkList<T>::ListDisplay()195 {196 int k = sl, kase = 0;197 while (k != -1)198 {199 cout << kase++ << "\t" << sls[k].data << endl;200 k = sls[k].cur;201 }202 }203 204 #endif
1 //main_Test_SLinkList.cpp 2 #include "SLinkList.h" 3 #include <iostream> 4 #include <cstdio> 5 using namespace std; 6 7 char pause; 8 typedef int T; 9 10 int main()11 {12 int i;13 T e;14 SLinkList<int> L(100);15 system("cls");16 int choice;17 do 18 {19 cin >> choice;20 switch (choice)21 {22 case 1:23 cout << "请输入要创建的链表中元素的个数1:" << endl;24 cin >> i; cout << endl;25 L.CreateList(i); 26 break;27 case 2:28 cout << "请输入插入元素位置:";29 cin >> i; cout << endl;30 cout << "请输入插入元素的值:"; cin >> e;31 cout << endl;32 try {33 L.Insert(i, e);34 }35 catch (char *err) {36 cout << err << endl;37 }38 break;39 case 3:40 cout << "请输入删除位置:";41 cin >> i; cout << endl;42 try {43 e = L.Delete(i);44 cout << "被删除的元素为: " << e << endl;45 }46 catch (char *err) {47 cout << err << endl;48 }49 cin.get(pause); system("pause");50 break;51 case 4:52 cout << "请输入要查询的元素位置:"; cin >> i;53 try {54 e = L.GetElem(i);55 cout << "第" << i << "个元素值为:" << e << endl;56 }57 catch (char *err) {58 cout << err << endl;59 }60 break;61 case 6:62 L.Clear(); cout << "表已清空" << endl;63 cin.get(pause);64 system("pause");65 break;66 case 10:67 L.ListDisplay(); cout << endl;68 cin.get(pause); system("pause");69 break;70 case 11:71 cout << "结束运行\n";72 break;73 default:74 break;75 }76 } while (choice != 11);77 78 return 0;79 80 }
静态链表实现_详细注释
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。