Link.h
#ifndef _LINK_0411 #define _LINK_0411 #include <string> #include <iostream> //定义数据类型为整型 typedef int ElementType; //定义结点 struct Node { ElementType data; Node * next; }; //带头结点链表 class Link { public: Link(); ~Link(); //选择排序 void select_sort(); //冒泡排序 void bubble_sort(); //头部插入 void insert_head(ElementType data); //尾部插入 void insert_tail(ElementType data); //查找结点,返回序号,如果不存在返回-1 int find(ElementType data); //删除结点 bool delete_node(int pos); //逆置 void reverse(); //打印链表 void display(); //打印提示信息 void printhelp(); //返回长度 int size(); private: //头结点指针 Node * pHead; //链表长度 size_t iSize; }; #endif
Link.cpp
1 #include "Link.h" 2 3 Link::Link():pHead(NULL), iSize(0) 4 { 5 pHead = new Node; 6 pHead->next = NULL; 7 } 8 9 Link::~Link() 10 { 11 Node * tmpNode = NULL; 12 Node * p = pHead->next; 13 while (p != NULL) 14 { 15 tmpNode = p->next; 16 delete p; 17 p = tmpNode; 18 } 19 delete tmpNode; 20 tmpNode = NULL; 21 22 delete pHead; 23 p = NULL; 24 25 iSize = 0; 26 } 27 28 /********************************** 29 链表选择排序(递增) 30 ***********************************/ 31 void Link::select_sort() 32 { 33 Node * p , *q; 34 int temp; 35 36 for (p = pHead; p != NULL; p = p->next) 37 for (q = p->next; q != NULL; q = q->next) 38 { 39 if (p->data > q->data) 40 { 41 temp = p->data; 42 p->data = q->data; 43 q->data = temp; 44 } 45 } 46 } 47 48 /********************************** 49 链表冒泡排序(递增) 50 ***********************************/ 51 void Link::bubble_sort() 52 { 53 Node *p; 54 int temp; 55 56 /************************************************************************/ 57 /* 冒泡排序是每次从头开始比较相邻的两个数,大小相反则交换,结束的 */ 58 /* 条件是这一轮中没有发生交换,flag用来记录是否发生了交换 */ 59 /************************************************************************/ 60 int flag; 61 while (true) 62 { 63 flag = 0; 64 for (p = pHead; p->next != NULL; p = p->next) 65 { 66 if (p->data > p->next->data) 67 { 68 temp = p->data; 69 p->data = p->next->data; 70 p->next->data = temp; 71 flag = 1; 72 } 73 } 74 if (flag == 0) 75 break; 76 } 77 } 78 79 /******************************** 80 链表头部插入 81 *****************************/ 82 void Link::insert_head(ElementType data) 83 { 84 Node * tmpNode = new Node; 85 tmpNode->data = data; 86 87 tmpNode->next = pHead->next; 88 pHead->next = tmpNode; 89 90 iSize++; 91 92 tmpNode = NULL; 93 } 94 95 /******************************** 96 链表尾部插入 97 *****************************/ 98 void Link::insert_tail(ElementType data) 99 { 100 Node * tmpNode = new Node; 101 tmpNode->data = data; 102 tmpNode->next = NULL; 103 104 Node * p = NULL; 105 p = pHead; 106 while (p->next != NULL) 107 { 108 p = p->next; 109 } 110 111 p->next = tmpNode; 112 iSize++; 113 114 //delete tmpNode; 115 tmpNode = NULL; 116 //delete p; 117 p = NULL; 118 } 119 120 /******************************** 121 打印链表 122 *****************************/ 123 void Link::display() 124 { 125 int count = 1; 126 Node * tmpNode = NULL; 127 128 tmpNode = pHead->next; 129 while (tmpNode != NULL) 130 { 131 std::cout<<tmpNode->data<<" "; 132 tmpNode = tmpNode->next; 133 134 /******************************** 135 * 输出格式控制,每行10个 136 **********************************/ 137 if (count % 10 == 0) 138 { 139 std::cout<<std::endl; 140 } 141 count++; 142 } 143 std::cout<<std::endl; 144 tmpNode = NULL; 145 } 146 147 /******************************** 148 查找结点 149 *****************************/ 150 int Link::find(ElementType data) 151 { 152 int pos = 0; 153 Node * tmpNode = NULL; 154 155 tmpNode = pHead->next; 156 while (tmpNode != NULL) 157 { 158 if ( tmpNode->data == data) 159 { 160 return pos; 161 } 162 tmpNode = tmpNode->next; 163 pos++; 164 } 165 166 tmpNode = NULL; 167 return -1; 168 } 169 170 /******************************** 171 删除结点 172 *****************************/ 173 bool Link::delete_node(int pos) 174 { 175 //序号超过链表范围则报错退出 176 if (pos > iSize -1) 177 { 178 return false; 179 } 180 else 181 { 182 int k = 0; 183 Node * tmpNode = NULL; 184 tmpNode = pHead; 185 while ( k < pos) 186 { 187 tmpNode = tmpNode->next; 188 k++; 189 } 190 Node * p = NULL; 191 p = tmpNode->next; 192 193 tmpNode->next = tmpNode->next->next; 194 delete p; 195 p = NULL; 196 iSize--; 197 return true; 198 } 199 } 200 201 /******************************** 202 返回链表的长度 203 *****************************/ 204 int Link::size() 205 { 206 return iSize; 207 } 208 209 /******************************** 210 链表的逆置 211 *****************************/ 212 void Link::reverse() 213 { 214 Node * preNode = NULL; 215 Node * curNode = NULL; 216 Node * afterNode = NULL; 217 218 if ( iSize == 1 || iSize == 0) 219 { 220 return; 221 } 222 else if ( iSize >= 2) 223 { 224 preNode = pHead->next; 225 curNode = preNode->next; 226 afterNode = curNode->next; 227 228 preNode->next = NULL; 229 230 while (afterNode != NULL) 231 { 232 curNode->next = preNode; 233 234 preNode = curNode; 235 curNode = afterNode; 236 237 afterNode = afterNode->next; 238 } 239 240 /******************************************************************** 241 * 将当前结点的next置为前一个结点的过程是在每一次循环的开始,而最后一次 242 * 循环后无法进入下一次循环,需要补一次设置curNode的next的过程 243 *********************************************************************/ 244 curNode->next = preNode; 245 246 pHead->next = curNode; 247 } 248 preNode = NULL; 249 curNode = NULL; 250 afterNode = NULL; 251 } 252 253 void Link::printhelp() 254 { 255 std::cout<<"*****************************************\n"; 256 std::cout<<"当前链表为:"<<std::endl; 257 if (iSize == 0) 258 std::cout<<"NULL"<<std::endl; 259 else 260 display(); 261 std::cout<<"输入你的选择:\n" 262 "0.从头部插入结点\n" 263 "1.从尾部插入结点\n" 264 "2.逆置链表\n" 265 "3.打印链表\n" 266 "4.删除结点\n" 267 "5.输出链表长度\n" 268 "6.查找结点\n" 269 "7.选择排序\n" 270 "8.冒泡排序\n" 271 "9.退出"<<std::endl; 272 std::cout<<"*****************************************\n"; 273 }
main函数
// linklist.cpp : 定义控制台应用程序的入口点。 // #include "Link.h" int main(int argc, char * argv[]) { Link myLink; int pos; char choice; ElementType find_num = 3; int delchoice; for (int i = 0 ; i < 48; i ++) { myLink.insert_head(rand()%100); } myLink.printhelp(); std::cout<<"请选择:"; while ( std::cin>> choice) { switch(choice) { case '0': case '1': std::cout<<"\n暂无此功能!\n"; break; case '2': myLink.reverse(); std::cout<<"\n逆置成功!\n"; break; case '3': myLink.display(); std::cout<<"\n打印成功!\n"; break; case '4': std::cout<<"\n输入要删除的节点序号:"; std::cin>>delchoice; if (myLink.delete_node(delchoice) == true) { std::cout<<"\n删除成功!\n"; } else { std::cout<<"\n删除失败!\n"; } break; case '5': std::cout<<"链表长为:"<<myLink.size()<<std::endl; break; case '6': goto exit; break; case '7': myLink.select_sort(); break; case '8': myLink.bubble_sort(); break; case '9': goto exit; break; default: break; } myLink.printhelp(); std::cout<<"请选择:"; } exit: system("pause"); return 0; }
运行: