用C++ “包装” 后的单向链表操作
下面是用以实现类的代码:
Node.h
1 #ifndef __NODE_H__ 2 /*单向 链表*/ 3 #define __NODE_H__ 4 5 typedef struct _NODE 6 { 7 int data; 8 struct _NODE *next; 9 }node; 10 11 class Node 12 { 13 public: 14 Node(); 15 ~Node(); 16 //外部使用的公有函数部分 17 public: 18 19 /*重载add,分别为在表后插入和按照指定位置插入*/ 20 Node* add(int data); 21 Node* add(int index, int data); 22 23 /*删除数据,注意是删除所有值为data的数据*/ 24 void delData(int data); 25 26 //重载delIndex,一个按照索引删除是安全的,就是用户已知要删除的数据和其位置,另一个就是完全删除,不论位置上的数据是否已知 27 void delIndex(int index); 28 void delIndex(int index,int data); 29 30 void display(); 31 32 private: 33 node *bak; 34 node *first; 35 node *current; 36 node *previous; 37 38 private: 39 bool isOver(node *first); 40 }; 41 42 #endif //__NODE_H__
Node.cpp
1 #include "Node.h" 2 #include <iostream> 3 4 Node::Node() 5 { 6 bak = nullptr; 7 first = nullptr; 8 current = nullptr; 9 previous = nullptr; 10 } 11 12 /*添加数据节点*/ 13 Node* Node::add(int data) 14 { 15 if (!first) 16 { 17 current = new node; 18 current->data = data; 19 current->next = nullptr; 20 first = current; 21 } 22 else 23 { 24 previous = current; 25 current = new node; 26 current->data = data; 27 current->next = nullptr; 28 previous->next = current; 29 } 30 return this; 31 } 32 33 Node* Node::add(int index, int data) 34 { 35 int num = 0; 36 short flag; 37 bak = first; 38 node *cur = nullptr; 39 node *pre = nullptr; 40 if (first) 41 { 42 while (first) 43 { 44 ++num; 45 pre = first; /*保存当前位置*/ 46 47 if (index == num) /*如果索引的位置已经存在,标志为 1 */ 48 { 49 flag = 1; 50 break; 51 } 52 if (isOver(first)) /*如果已经到了链表的结尾*/ 53 { 54 flag = 3; /*索引的位置不存在,标志为 3 ,此时num计数的正是链表中数据的个数*/ 55 if (index==num+1) 56 { 57 flag = 2; /*如果索引的位置不存在,但是在链表的结尾,相当与在表后新加上一个数据,标志为 2 */ 58 } 59 break; 60 } 61 first = first->next; 62 } 63 } 64 else 65 { 66 if (index == 1) 67 { 68 add(1); 69 return this; 70 } 71 std::cout << "链表尚且为空" << std::endl; 72 return this; 73 } 74 switch (flag) 75 { 76 case 1: 77 cur = new node; 78 //数据交换 79 num = pre->data; 80 pre->data = data; 81 cur->data = num; 82 //位置交换 83 cur->next = pre->next; 84 pre->next = cur; 85 break; 86 87 case 2: 88 add(data); 89 break; 90 91 case 3: 92 std::cout << "索引的位置 " << index << " 越界" << std::endl; 93 } 94 first = bak; 95 return this; 96 } 97 98 void Node::delData(int data) 99 { 100 int num = 0; 101 int i = 1; 102 bak = first; 103 node *next = nullptr; 104 if (first) 105 { 106 while (first) 107 { 108 if (i == 1) 109 { 110 if (first->data == data) 111 { 112 ++num; 113 next = first->next; 114 delete first; 115 first = next; 116 bak = first; 117 continue; /*若没有continue的话,将会在第一个是被删数据的时候漏掉第二个数据*/ 118 } 119 if (first->next) 120 { 121 if (first->next->data == data) 122 { 123 ++num; 124 next = first->next->next; 125 delete first->next; 126 first->next = next; 127 } 128 } 129 ++i; //此句不能放在上面的continue前面,因为上面的操作完成后,first仍然指向的是第一个节点,也就是头节点,所以必须再次进入此语句进行判断,否则会漏掉数据 130 } 131 else 132 { 133 if (first->next) 134 { 135 if (first->next->data == data) 136 { 137 ++num; 138 next = first->next->next; 139 delete first->next; 140 first->next = next; 141 } 142 } 143 } 144 first = first->next; 145 } 146 } 147 else 148 { 149 std::cout << "链表没有数据可以删除" << std::endl; 150 return ; 151 } 152 std::cout << "共删除了 " << num << " 个数据" << std::endl; 153 first = bak; 154 } 155 156 void Node::delIndex(int index) 157 { 158 bak = first; 159 bool over = true; 160 node *next = nullptr; 161 int num=0; 162 if (first) 163 { 164 while (first) 165 { 166 if (index == 1) 167 { 168 over = false; 169 next = first->next; 170 delete first; 171 first = next; 172 bak = first; 173 break; 174 } 175 ++num; 176 if (index == num + 1) 177 { 178 if (first->next) 179 { 180 over = false; 181 next = first->next->next; 182 delete first->next; 183 first->next = next; 184 break; 185 } 186 else 187 { 188 break; 189 } 190 } 191 first = first->next; 192 } 193 } 194 else 195 { 196 std::cout << "链表没有数据可以删除" << std::endl; 197 return; 198 } 199 if (over) 200 { 201 std::cout << "第 " << index <<" 号索引不存在" << std::endl; 202 } 203 first = bak; 204 } 205 206 void Node::delIndex(int index, int data) 207 { 208 bak = first; 209 bool over = true; 210 node *next = nullptr; 211 int num = 0; 212 if (first) 213 { 214 while (first) 215 { 216 if (index == 1 && data==first->data) 217 { 218 over = false; 219 next = first->next; 220 delete first; 221 first = next; 222 bak = first; 223 break; 224 } 225 ++num; 226 if (index == num + 1) 227 { 228 if (first->next && first->next->data==data) 229 { 230 over = false; 231 next = first->next->next; 232 delete first->next; 233 first->next = next; 234 break; 235 } 236 else 237 { 238 break; 239 } 240 } 241 first = first->next; 242 } 243 } 244 else 245 { 246 std::cout << "链表没有数据可以删除" << std::endl; 247 } 248 if (over) 249 { 250 std::cout << "第 " << index << " 号满足条件 data = "<< data <<" 的索引不存在" << std::endl; 251 } 252 first = bak; 253 } 254 255 /*输出类中所有的数据,并按照编号打印*/ 256 void Node::display() 257 { 258 int index = 1; 259 bak = first; 260 if (first) 261 { 262 while (first) 263 { 264 std::cout << index++<<" -> "<<first->data << std::endl; 265 first = first->next; 266 } 267 std::cout << "总计 " << index-1 << " 个数据." << std::endl; 268 } 269 else 270 { 271 std::cout << "链表为空" << std::endl; 272 } 273 first = bak; 274 } 275 276 bool Node::isOver(node *first) 277 { 278 if (!first->next) 279 { 280 return true; 281 } 282 return false; 283 } 284 285 Node::~Node() 286 { 287 delete first; 288 delete current; 289 delete previous; 290 std::cout << "进入析构函数,准备退出" << std::endl; 291 }
测试文件 main.cpp
#include "Node.h" #include<iostream> int main(void) { Node *link = new Node; link->add(1); link->add(2, 2); link->add(1)->add(2)->add(3); link->add(2, 12)->add(2,13); link->display(); link->delData(1); link->display(); link->delIndex(2); link->display(); link->delIndex(1, 2); link->display(); system("pause"); return 0; }
代码未经严格测试,因此可能在某些情况下发生错误。希望有朋友发现的话及时指出,不胜感激。
以上。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。