1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 typedef int/*这里为线性表数据元素类型*/ ElemType; 5 struct node {//单链表节点类型 6 ElemType data; 7 struct node *next; 8 }; 9 typedef struct node SLink; 10 //为单链表结点类型struct node定义一个易记忆类型名SLink 11 12 //初始化单链表 13 void CreatList(SLink *L)/* &表示L是引用参数,*表示L是指针,L是指向LinkList数据的指针*/{ 14 L = (SLink*)malloc(sizeof(SLink));//sizeof()是求一个类型的字节大小的,比如 sizeof(int )就是4. 15 //创建头结点 16 L->next = NULL; 17 } 18 //销毁单链表 19 void DestroyList(SLink *L) { 20 SLink* pre = L, *p = pre->next; 21 while (p != NULL) { 22 free(pre); 23 pre=p; 24 p = p->next; 25 } 26 free(pre); 27 } 28 //求单链表长度 29 int GetLength(SLink *L) { 30 SLink* pre = L; 31 SLink* p = pre->next; 32 int i=1; 33 while (p!= NULL) { 34 p = p->next; 35 i++; 36 } 37 return printf("该单链表长度为%d", i); 38 } 39 //求单链表中的第i个元素 40 int GetElem(SLink*& L) { 41 SLink* pre = L; 42 SLink* p = pre->next; 43 int n; 44 printf("请输入你想查找的位置 "); 45 scanf("%d", &n); 46 if (n <= 0) { 47 return printf("你所输入的位置有误 "); 48 } 49 for (int i = 1; i < n; i++) { 50 p = p->next; 51 } 52 if (p == NULL)/*NULL常用来表示空指针*/ { 53 return printf("这个位置没有数字 "); 54 } 55 return printf("查找成功值为%d ", p->data); 56 57 } 58 //按值查找 59 int Locate(SLink*& L) { 60 SLink* pre = L; 61 SLink* p = pre->next; 62 int m,i=1; 63 printf("请输入你想查找的值 "); 64 scanf("%d", &m); 65 while (p->data != m&&p!=NULL) { 66 p = p->next; 67 i++; 68 } 69 if (p == NULL) { 70 return printf("没有找到该值 "); 71 } 72 return printf("该值的位置在第%d个 ", i); 73 } 74 //在指定位置插入元素 75 int insElem(SLink*& L){ 76 SLink* pre = L; 77 SLink* p = pre->next; 78 int i,m; 79 SLink *NewNode = (SLink*)malloc(sizeof(SLink)); 80 printf("请输入你想插入第几个位置后面 "); 81 scanf("%d", &i); 82 for (int k = 1; k < i; k++) { 83 p = p->next; 84 } 85 if (p == NULL) { 86 return printf("插入失败,未找到该结点"); 87 } 88 printf("请输入你想插入的值 "); 89 scanf("%d", &m); 90 NewNode->data=m; 91 //p->next = NewNode; 92 //NewNode->next = p->next->next; 93 NewNode->next = p->next; 94 p->next = NewNode; 95 return printf("插入成功"); 96 97 } 98 //删除元素 99 int DleElem(SLink*& L) { 100 SLink* pre = L; 101 SLink* p = pre->next; 102 SLink* q; 103 int n; 104 printf("请输入你想删除的数据位置 "); 105 scanf("%d", &n); 106 for (int i = 2; i < n; i++) { 107 p=p->next; 108 } 109 //这是删除p所在的后一个的结点; 110 if (p == NULL) { 111 return printf("你所输入的位置不规范 "); 112 } 113 q = p->next; 114 p->next=q->next; 115 free(q) ; 116 117 return printf("删除成功 "); 118 } 119 //输出单链表 120 int DisElem(SLink*& L) { 121 SLink* pre = L, * p,*q; 122 p = pre->next; 123 q=p->next; 124 if(p==NULL){ 125 return printf("链表中暂时没有元素 "); 126 } 127 while (p!= NULL) { 128 int i=1; 129 printf("%d ",p->data); 130 p=p->next; 131 } 132 printf(" "); 133 printf("输出成功 "); 134 } 135 //创建和输入单链表 136 int CreateAndInputElemT(SLink*& L) { 137 L = (SLink*)malloc(sizeof(SLink)); 138 L->next = NULL; 139 int n,m; SLink* S,*p=L; 140 printf("请输入你想输入的长度 "); 141 scanf("%d", &n); 142 for (int i = 0; i < n; i++) { 143 S = (SLink*)malloc(sizeof(SLink)); 144 printf("请输入第%d个数", i + 1); 145 printf(" "); 146 scanf("%d", &m); 147 S->data = m; 148 p->next=S; 149 p=p->next; 150 } 151 p->next=NULL; 152 153 printf("创建成功 "); 154 } 155 //改变元素 156 int Change(SLink *&L){ 157 SLink *pre=L; 158 SLink *p=pre->next; 159 int n,m; 160 printf("请输入你想改变的数位置 "); 161 scanf("%d",&n); 162 for(int i=1;i<n;i++){ 163 p=p->next; 164 } 165 if(p==NULL){ 166 return printf("该位置超出链表范围 "); 167 } 168 printf("请输入你想改成的数字 "); 169 scanf("%d",&m); 170 p->data=m; 171 return printf("恭喜你改成功! "); 172 } 173 //求最大值 174 int GetMax(SLink *&L){ 175 SLink *pre=L,*p; 176 p=pre->next; 177 int Max; 178 Max=p->data; 179 for(;p!=NULL;){ 180 if(p->data>Max){ 181 Max=p->data; 182 } 183 p=p->next; 184 } 185 return printf("该链表的最大值为%d ",Max); 186 } 187 //将链表里奇数都删掉 188 int Delji(SLink *&L){ 189 SLink *pre=L,*q; 190 for(;pre!=NULL;){ 191 q=pre->next; 192 if(q->data%2!=0){//输入有限制-128至127. 193 pre->next=q->next; 194 free(q); 195 pre=pre->next; 196 } 197 } 198 return printf("删除成功 "); 199 } 200 //主函数 201 int main() { 202 SLink *L; 203 while(true){ 204 printf("||||||||||||||||||||||||||||||||||||||||||||||| "); 205 printf("|| 1:创建并输入单链表 || "); 206 printf("|| 2:从指定位置删除一个数 || "); 207 printf("|| 3:查询数的位置 || "); 208 printf("|| 4:将元素插入指定位置 || "); 209 printf("|| 5:改变某位置元素 || "); 210 printf("|| 6:打印顺序表 || "); 211 printf("|| 7: 求该链表的最大值 || "); 212 printf("|| 8: 删除链表中的奇数 || "); 213 printf("|| 9: 销毁链表 || "); 214 printf("|| (输入-1退出系统) || "); 215 printf("||||||||||||||||||||||||||||||||||||||||||||||| "); 216 int n; 217 printf("请输入操作序号: "); 218 scanf("%d",&n); 219 switch(n){ 220 case 1 : 221 CreateAndInputElemT(*& L); 222 break; 223 case 2 : 224 DleElem(*& L); 225 break; 226 case 3 : 227 Locate(*& L); 228 break; 229 case 4 : 230 insElem(*& L); 231 break; 232 case 5 : 233 Change(*& L); 234 break; 235 case 6 : 236 DisElem(*& L); 237 break; 238 case 7 : 239 GetMax(*& L); 240 break; 241 case 8 : 242 Delji(*&L); 243 break; 244 case 9 : 245 DestroyList(L); 246 break; 247 case -1: 248 return 0; 249 250 } 251 252 } 253 254 }