1 // 2 // Created by langzi on 19-3-28. 3 // 4 5 #include <iostream> 6 using namespace std; 7 8 typedef int DataType; 9 #define Node ElemType 10 #define ERROR NULL; 11 12 13 class Node{ 14 public: 15 int data; 16 Node *next; 17 }; 18 19 //构建节点 20 21 22 class LinkList{ 23 public: 24 LinkList(); 25 ~LinkList(); 26 void create_linklist(int n); 27 void traval_list(); 28 int get_length(); 29 bool is_empty(); 30 ElemType *find(DataType dataType);//查找节点 31 void insert_end(DataType data); 32 void insert_index(DataType data,int n); 33 void del_end(); 34 void del_all(); 35 void del_data(DataType data); 36 void del_head(); 37 38 39 40 41 42 private: 43 ElemType *head; 44 45 }; 46 47 //构建一个链表 48 49 LinkList::LinkList() { 50 head=new ElemType; 51 head->data=0; 52 head->next=NULL; 53 } 54 55 56 //销毁链表 57 LinkList::~LinkList() { 58 delete(head); 59 } 60 61 //创建一个链表 62 63 void LinkList::create_linklist(int n) { 64 ElemType *pnew ,*ptemp; 65 ptemp =head; 66 if (n<0){ 67 cout<<"你输入的节点有误"<<endl; 68 69 70 } 71 for (int i = 0; i <n ; ++i) { 72 pnew =new ElemType; 73 cin>>pnew->data; 74 pnew->next=NULL; 75 ptemp->next=pnew; 76 ptemp=pnew; 77 } 78 } 79 80 //遍历一个链表 81 82 void LinkList::traval_list() { 83 if (head==NULL||head->next==NULL){ 84 cout<<"空的链表"<<endl; 85 86 } 87 ElemType *p=head; 88 while (p->next!=NULL){ 89 p=p->next; 90 cout<<p->data<<" "; 91 92 } 93 94 } 95 //获取链表的单位长度 96 int LinkList::get_length() { 97 int count=0; 98 ElemType *ptemp =head; 99 if (ptemp->next==NULL){ 100 return 0; 101 102 } 103 else{ 104 while (ptemp->next!=NULL){ 105 count++; 106 ptemp=ptemp->next; 107 } 108 } 109 return count; 110 } 111 //判断单链表是否为空 112 113 bool LinkList::is_empty(){ 114 if(head->next==NULL){ 115 return true; 116 } else 117 return false; 118 119 } 120 //查找节点 121 ElemType *LinkList::find(DataType data) { 122 ElemType *ptemp=head; 123 if (head==NULL){ 124 cout<<"kong"; 125 } 126 while (ptemp->next!=NULL){ 127 128 if(ptemp->data==data){ 129 return ptemp; 130 } 131 132 ptemp=ptemp->next; 133 134 } 135 if(ptemp->data==data){ 136 return ptemp; 137 } 138 return NULL;//未找到 139 140 } 141 //尾部插入指定的元素 插入都要定义新节点 142 void LinkList::insert_end(DataType data) { 143 ElemType *newNode =new ElemType; 144 //新节点定义完成 145 newNode->next=NULL; 146 newNode->data=data; 147 148 ElemType *temp=head; 149 if (head==NULL){ 150 head=newNode; 151 } 152 153 154 while (temp->next!=NULL){ 155 temp=temp->next; 156 157 } 158 temp->next=newNode; 159 } 160 //制定位置插入制定元素 161 void LinkList::insert_index(DataType data, int n) { 162 if(n<1||n>get_length()){ 163 cout<<"值是错误的"; 164 } else{ 165 ElemType *ptemp= new ElemType; 166 ptemp->data=data; 167 ElemType *p=head; 168 int i=1; 169 //遍历到指定的位置 170 while (i<n){ 171 p=p->next; 172 i++; 173 } 174 ptemp->next=p->next; 175 p->next=ptemp; 176 177 } 178 } 179 //尾部删除元素 180 void LinkList::del_end() { 181 ElemType *p =head; 182 //判断单链表是否为空 183 ElemType *ptemp=NULL;//占位节点,将ptemp指向p的前一个节点 184 185 if(p->next==NULL){ 186 cout<<"链表为空"; 187 188 } else 189 while (p->next!=NULL){ 190 ptemp=p; 191 p=p->next; 192 } 193 delete(p); 194 p=NULL; 195 ptemp->next=NULL; 196 } 197 //删除所有数据 198 void LinkList::del_all() { 199 ElemType *p=head->next; 200 ElemType *temp =new ElemType; 201 if (temp->next=NULL){ 202 cout<<"已经为空"; 203 204 } else{ 205 while (p!=NULL){ 206 temp=p; 207 p=p->next; 208 head->next=p; 209 //temp->next=NULL; 210 delete(temp); 211 212 213 } 214 head->next=NULL; 215 } 216 } 217 //删除指定的元素 218 void LinkList::del_data(DataType data) { 219 ElemType *p =head; 220 ElemType *temp =find(data); 221 while (p->next!=temp){ 222 p=p->next; 223 } 224 p->next=temp->next; 225 delete(temp); 226 temp=NULL; 227 228 } 229 //删除头部节点 230 231 void LinkList::del_head() { 232 ElemType *p=head; 233 if(p==NULL||p->next==NULL){ 234 cout<<"该链表为空"<<endl; 235 236 } else{ 237 ElemType *ptemp=NULL;//创建一个站位节点 238 p=p->next; 239 ptemp=p->next; 240 delete(p); 241 p=NULL; 242 head->next=ptemp; 243 } 244 } 245 246 247 248 249 250 int main(){ 251 LinkList linkList; 252 int num; 253 cin>>num; 254 255 linkList.create_linklist(num); 256 //测试遍历 257 //linkList.traval_list(); 258 //测试长度 259 //int length=linkList.get_length(); 260 //cout<<length<<endl; 261 //测试查找节点 262 //cout<<(linkList.find(4)->data); 263 264 //尾部插入指定的元素 265 //linkList.insert_end(8); 266 //linkList.traval_list(); 267 268 //制定位置插入测试 可以在头部 269 //linkList.insert_index(5,1); 270 //linkList.traval_list(); 271 272 //在尾部删除元素 273 //linkList.del_end(); 274 //linkList.traval_list(); 275 276 //删除全部的元素 277 //linkList.del_all(); 278 //linkList.traval_list(); 279 280 281 //删除头部节点 282 linkList.del_head(); 283 linkList.traval_list(); 284 285 286 287 288 289 }