快速学习单链表的创建和操作(包含程序和程序注解)
主要实现的功能如下:
1、创建一个带头结点的单链表(头指针为head),输出链表中各结点的值;
2、查找单链表中的第i个结点,并输出结点元素的值;
3、在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入)
4、删除单链表中的第j个结点;
5、将单链表中的各结点就地逆序(不重建另外的一个链表);
6、输出链表中所有元素
7、将单链表中的负数移动到链表尾
0、退出
在程序总给予操作提示,并在各项操作中,做了一些数据输入数据的验证,过滤部分不合法数据和操作。
程序代码如下:
1 /* 2 *快速学习单链表的及其操作 3 *AUTHOR:CplusHua 4 *DATE:2012-10-28 DATE :2012-12-09 5 * 加入将链表中的元素移动到链表尾的功能 6 *Vertion:0.1.1 7 */ 8 #include<iostream> 9 #include "malloc.h" 10 #include <stdio.h> 11 #define ElemType int 12 using namespace std; 13 //定义线性表的单链表存储结构 14 typedef struct Lnode{ 15 ElemType data; 16 struct Lnode *next; 17 }Lnode,*LinkList; 18 enum Status 19 { 20 OK,FAILED,NULLHEAD 21 }; 22 //单链表初始化 23 LinkList LinkListInit() 24 { 25 LinkList head; 26 head=(Lnode *)malloc(sizeof(Lnode)); 27 if(NULL==head) 28 cout<<"申请空间失败!"; 29 head->next=NULL; 30 head->data=0; 31 return head; 32 } 33 //创建单链表,增加元素 34 Status LinkList_Create(LinkList head,ElemType e) 35 { 36 LinkList q; 37 q=head; 38 while(q->next!=NULL) 39 q=q->next; 40 q->next=(Lnode *)malloc(sizeof(Lnode)); 41 q->next->data=e; 42 q->next->next=NULL; 43 head->data++; 44 return OK; 45 } 46 //输出单链表中的元素 47 Status LinkList_Cout(LinkList head) 48 { 49 if(NULL==head->next) 50 { 51 cout<<"您还没有向单链表中插入任何元素!"<<endl; 52 return NULLHEAD; 53 } 54 LinkList p; 55 p=head->next; 56 while(NULL!=p->next) 57 { 58 cout<<p->data<<" "; 59 p=p->next; 60 } 61 cout<<p->data<<endl; 62 return OK; 63 } 64 //查找单链表中的第i个结点,并输出结点元素的值 65 Status LinkList_Search(LinkList head,int i,ElemType *e) 66 { 67 if(NULL==head->next) 68 { 69 cout<<"您还没有向单链表中插入任何元素!"<<endl; 70 return NULLHEAD; 71 } 72 if(i>head->data) 73 { 74 cout<<"请输入正确的范围!"<<endl; 75 return FAILED; 76 } 77 LinkList p; 78 p=head->next; 79 while(i--!=1) 80 { 81 if(NULL==p->next) 82 { 83 cout<<"超出结点范围"<<endl; 84 return FAILED; 85 } 86 p=p->next; 87 } 88 *e=p->data; 89 return OK; 90 91 } 92 //在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入) 93 Status LinkList_Insert(LinkList head,int i,ElemType e) 94 { 95 if(NULL==head->next) 96 { 97 cout<<"您还没有向单链表中插入任何元素!"<<endl; 98 return NULLHEAD; 99 } 100 if(i>head->data) 101 { 102 cout<<"请输入正确的范围!"<<endl; 103 return FAILED; 104 } 105 LinkList p,q; 106 p=head; 107 while(i-->1) 108 { 109 p=p->next; 110 } 111 q=(Lnode *)malloc(sizeof(Lnode)); 112 q->next=p->next; 113 q->data=e; 114 p->next=q; 115 head->data++; 116 return OK; 117 } 118 //删除单链表中的第j个结点 119 Status LinkList_Delete(LinkList head,int i,ElemType *e) 120 { 121 if(NULL==head->next) 122 { 123 cout<<"您还没有向单链表中插入任何元素!"<<endl; 124 return NULLHEAD; 125 } 126 if(i>head->data) 127 { 128 cout<<"请输入正确的范围!"<<endl; 129 return FAILED; 130 } 131 132 LinkList p,q; 133 p=head; 134 while(i-->1) 135 { 136 p=p->next; 137 } 138 q=p->next->next; 139 *e=p->next->data; 140 free(p->next); 141 p->next=q; 142 head->data--; 143 return OK; 144 } 145 //将单链表中的各结点就地逆序(不允许另建一个链表) 146 Status LinkList_Revorder(LinkList head) 147 { 148 if(NULL==head->next) 149 { 150 cout<<"您还没有向单链表中插入任何元素!"<<endl; 151 return NULLHEAD; 152 } 153 if(1==head->data) return OK; //只有一个元素不需要逆序 154 LinkList p,q,tmp; 155 p=head->next; 156 q=p->next; 157 while(1) 158 { 159 if(NULL==q->next)//只剩下两个元素的时候q->next为NULL 160 { 161 q->next=p; 162 break; 163 } 164 tmp=q->next; 165 q->next=p; 166 p=q; 167 q=tmp; 168 169 } 170 head->next->next=NULL; 171 head->next=q; 172 return OK; 173 } 174 //将链表中的所有负数结点移至链表尾 175 Status LinkList_Movtoend(LinkList head) 176 { 177 if(NULL==head->next) 178 { 179 cout<<"您还没有向单链表中插入任何元素!"<<endl; 180 return NULLHEAD; 181 } 182 LinkList p=head; 183 LinkList q=head; 184 while(q->next!=NULL) q=q->next;//q=rear (链表尾,作为已知条件) 185 LinkList rear=q;//链表尾 186 while(p->next!=q) 187 { 188 if(p->next->data<0) 189 { 190 rear->next=p->next; 191 p->next=p->next->next; 192 rear=rear->next; 193 rear->next=NULL; 194 } 195 else p=p->next; 196 } 197 if(p->next->data<0) 198 { 199 rear->next=p->next; 200 p->next=p->next->next; 201 rear=rear->next; 202 rear->next=NULL; 203 } 204 else p=p->next; 205 return OK; 206 } 207 int main() 208 { 209 LinkList head=LinkListInit(); 210 int opt,n=0,m=0,i=0; 211 ElemType e; 212 while(1) 213 { 214 215 if(n) 216 { 217 while(getchar()!='\n'&&getchar()!=' '); 218 while(getchar()!='\n'&&getchar()!=' '); 219 } 220 n=1; 221 cout<<"************请输入您要进行的操作的编号************"<<endl<<endl; 222 cout<<"1.创建一个带头结点的单链表(头指针为head),且遍历此链表(输出链表中各结点的值)"<<endl; 223 cout<<"2.查找单链表中的第i个结点,并输出结点元素的值"<<endl; 224 cout<<"3.在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入)"<<endl; 225 cout<<"4.删除单链表中的第j个结点"<<endl; 226 cout<<"5.将单链表中的各结点就地逆序(不允许另建一个链表)"<<endl; 227 cout<<"6.输出单链表中的元素"<<endl; 228 cout<<"7.将单链表中的负数移动到链表尾"<<endl; 229 cout<<"0.退出"<<endl<<endl; 230 cout<<"***************************************************"<<endl; 231 cin>>opt; 232 switch (opt) 233 { 234 case 1: 235 cout<<"请输入您要创建的链表的节点个数"<<endl; 236 cin>>m; 237 for(i=0;i<m;i++) 238 { 239 cin>>e; 240 LinkList_Create(head,e); 241 } 242 cout<<"单链表创建成功!"<<endl; 243 cout<<"此时的单链表为:"; 244 LinkList_Cout(head); 245 break; 246 case 2: 247 cout<<"请输入要查找的元素位置i"<<endl; 248 cin>>i; 249 if(OK==LinkList_Search(head,i,&e)) 250 cout<<"您要查找的元素是: "<<e<<endl; 251 break; 252 case 3: 253 cout<<"请输入要插入元素的位置和元素"<<endl; 254 cout<<"位置:"<<endl; 255 cin>>i; 256 cout<<"元素"<<endl; 257 cin>>e; 258 if(OK==LinkList_Insert(head,i,e)) 259 cout<<"数据插入成功!"<<endl; 260 cout<<"此时的单链表为:"; 261 LinkList_Cout(head); 262 break; 263 case 4: 264 cout<<"请输入要删除的节点的位置"<<endl; 265 cin>>i; 266 if(OK==LinkList_Delete(head,i,&e)) 267 cout<<"元素"<<e<<"已经成功删除!"<<endl; 268 cout<<"此时的单链表为:"; 269 LinkList_Cout(head); 270 break; 271 case 5: 272 LinkList_Revorder(head); 273 cout<<"逆序成功!"<<endl; 274 cout<<"此时的单链表为:"; 275 LinkList_Cout(head); 276 break; 277 case 6: 278 LinkList_Cout(head); 279 break; 280 case 7: 281 LinkList_Movtoend(head); 282 cout<<"所有负数已经移动到链表尾!"<<endl; 283 cout<<"此时的单链表为:"; 284 LinkList_Cout(head); 285 break; 286 case 0: 287 return 0; 288 default: 289 cout<<"ERROR"<<endl; 290 } 291 } 292 return 0; 293 }
我的博客:http://hua.219.me 欢迎来访!