标签:
1 *单链表的创建及操作 2 #include<iostream> 3 #include "malloc.h" 4 #include <stdio.h> 5 #define ElemType int 6 using namespace std; 7 //定义线性表的单链表存储结构 8 typedef struct Lnode{ 9 ElemType data; 10 struct Lnode *next; 11 }Lnode,*LinkList; 12 enum Status 13 { 14 OK,FAILED,NULLHEAD 15 }; 16 //单链表初始化 17 LinkList LinkListInit() 18 { 19 LinkList head; 20 head=(Lnode *)malloc(sizeof(Lnode)); 21 if(NULL==head) 22 cout<<"申请空间失败!"; 23 head->next=NULL; 24 head->data=0; 25 return head; 26 } 27 //创建单链表,增加元素 28 Status LinkList_Create(LinkList head,ElemType e) 29 { 30 LinkList q; 31 q=head; 32 while(q->next!=NULL) 33 q=q->next; 34 q->next=(Lnode *)malloc(sizeof(Lnode)); 35 q->next->data=e; 36 q->next->next=NULL; 37 head->data++; 38 return OK; 39 } 40 //输出单链表中的元素 41 Status LinkList_Cout(LinkList head) 42 { 43 if(NULL==head->next) 44 { 45 cout<<"您还没有向单链表中插入任何元素!"<<endl; 46 return NULLHEAD; 47 } 48 LinkList p; 49 p=head->next; 50 while(NULL!=p->next) 51 { 52 cout<<p->data<<" "; 53 p=p->next; 54 } 55 cout<<p->data<<endl; 56 return OK; 57 } 58 //查找单链表中的第i个结点,并输出结点元素的值 59 Status LinkList_Search(LinkList head,int i,ElemType *e) 60 { 61 if(NULL==head->next) 62 { 63 cout<<"您还没有向单链表中插入任何元素!"<<endl; 64 return NULLHEAD; 65 } 66 if(i>head->data) 67 { 68 cout<<"请输入正确的范围!"<<endl; 69 return FAILED; 70 } 71 LinkList p; 72 p=head->next; 73 while(i--!=1) 74 { 75 p=p->next; 76 } 77 *e=p->data; 78 return OK; 79 80 } 81 //在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入) 82 Status LinkList_Insert(LinkList head,int i,ElemType e) 83 { 84 if(NULL==head->next) 85 { 86 cout<<"您还没有向单链表中插入任何元素!"<<endl; 87 return NULLHEAD; 88 } 89 if(i>head->data) 90 { 91 cout<<"请输入正确的范围!"<<endl; 92 return FAILED; 93 } 94 LinkList p,q; 95 p=head; 96 while(i-->1) 97 { 98 p=p->next; 99 } 100 q=(Lnode *)malloc(sizeof(Lnode)); 101 q->next=p->next; 102 q->data=e; 103 p->next=q; 104 head->data++; 105 return OK; 106 } 107 //删除单链表中的第j个结点 108 Status LinkList_Delete(LinkList head,int i,ElemType *e) 109 { 110 if(NULL==head->next) 111 { 112 cout<<"您还没有向单链表中插入任何元素!"<<endl; 113 return NULLHEAD; 114 } 115 if(i>head->data) 116 { 117 cout<<"请输入正确的范围!"<<endl; 118 return FAILED; 119 } 120 121 LinkList p,q; 122 p=head; 123 while(i-->1) 124 { 125 p=p->next; 126 } 127 q=p->next->next; 128 *e=p->next->data; 129 free(p->next); 130 p->next=q; 131 head->data--; 132 return OK; 133 } 134 //将单链表中的各结点就地逆序(不允许另建一个链表) 135 Status LinkList_Revorder(LinkList head) 136 { 137 if(NULL==head->next) 138 { 139 cout<<"您还没有向单链表中插入任何元素!"<<endl; 140 return NULLHEAD; 141 } 142 if(1==head->data) return OK; //只有一个元素不需要逆序 143 LinkList p,q,tmp; 144 p=head->next; 145 q=p->next; 146 while(1) 147 { 148 if(NULL==q->next)//只剩下两个元素的时候q->next为NULL 149 { 150 q->next=p; 151 break; 152 } 153 tmp=q->next; 154 q->next=p; 155 p=q; 156 q=tmp; 157 158 } 159 head->next->next=NULL; 160 head->next=q; 161 return OK; 162 } 163 int main() 164 { 165 LinkList head=LinkListInit(); 166 int opt,n=0,m=0,i=0; 167 ElemType e; 168 while(1) 169 { 170 171 if(n) 172 { 173 while(getchar()!=‘\n‘&&getchar()!=‘ ‘); 174 while(getchar()!=‘\n‘&&getchar()!=‘ ‘); 175 } 176 n=1; 177 cout<<"************请输入您要进行的操作的编号************"<<endl<<endl; 178 cout<<"1.创建一个带头结点的单链表(头指针为head),且遍历此链表(输出链表中各结点的值)"<<endl; 179 cout<<"2.查找单链表中的第i个结点,并输出结点元素的值"<<endl; 180 cout<<"3.在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入)"<<endl; 181 cout<<"4.删除单链表中的第j个结点"<<endl; 182 cout<<"5.将单链表中的各结点就地逆序(不允许另建一个链表)"<<endl; 183 cout<<"6.输出单链表中的元素"<<endl; 184 cout<<"7.退出"<<endl<<endl; 185 cout<<"***************************************************"<<endl; 186 cin>>opt; 187 switch (opt) 188 { 189 case 1: 190 cout<<"请输入您要创建的链表的节点个数"<<endl; 191 cin>>m; 192 for(int i=0;i<m;i++) 193 { 194 cin>>e; 195 LinkList_Create(head,e); 196 } 197 cout<<"单链表创建成功!"<<endl; 198 cout<<"此时的单链表为:"; 199 LinkList_Cout(head); 200 break; 201 case 2: 202 cout<<"请输入要查找的元素位置i"<<endl; 203 cin>>i; 204 if(OK==LinkList_Search(head,i,&e)) 205 cout<<"您要查找的元素是: "<<e<<endl; 206 break; 207 case 3: 208 cout<<"请输入要插入元素的位置和元素"<<endl; 209 cout<<"位置:"<<endl; 210 cin>>i; 211 cout<<"元素"<<endl; 212 cin>>e; 213 if(OK==LinkList_Insert(head,i,e)) 214 cout<<"数据插入成功!"<<endl; 215 cout<<"此时的单链表为:"; 216 LinkList_Cout(head); 217 break; 218 case 4: 219 cout<<"请输入要删除的节点的位置"<<endl; 220 cin>>i; 221 if(OK==LinkList_Delete(head,i,&e)) 222 cout<<"元素"<<e<<"已经成功删除!"<<endl; 223 cout<<"此时的单链表为:"; 224 LinkList_Cout(head); 225 break; 226 case 5: 227 LinkList_Revorder(head); 228 cout<<"逆序成功!"<<endl; 229 cout<<"此时的单链表为:"; 230 LinkList_Cout(head); 231 break; 232 case 6: 233 LinkList_Cout(head); 234 break; 235 case 7: 236 return 0; 237 default: 238 cout<<"ERROR"<<endl; 239 } 240 } 241 return 0; 242 243 }
标签:
原文地址:http://www.cnblogs.com/wangmengmeng/p/4781029.html