-
设计内容
建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。程序能实现以下功能:
-
建立链表
-
显示链表
-
查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息。
-
删除链表中指定学号的结点。
-
在链表中指定的位置插入一个新结点(学号不能和其他结点重复)。
2. 具体代码
1 #include<stdio.h> 2 3 #include<stdlib.h> 4 5 #include<malloc.h> 6 7 #include<string.h>/*头文件*/ 8 9 10 11 12 13 struct Node 14 15 { 16 17 char name[20]; 18 19 long id; 20 21 char gender[10]; 22 23 int age; 24 25 int score; 26 27 struct Node *next; 28 29 };/*创建结构体*/ 30 31 32 33 34 35 typedef struct Node ListNode;/*声明*/ 36 37 ListNode *build(int n) /*创建链表*/ 38 39 { 40 41 ListNode *head; 42 43 ListNode *p,*pre; 44 45 int i; 46 47 head=(ListNode *)malloc(sizeof(ListNode));/*为头节点分配内存空间*/ 48 49 head->next=NULL; 50 51 pre=head; 52 53 for(i=1;i<=n;i++)/*通过for循环不断加入新的结点*/ 54 55 { 56 57 printf("请输入第 %d 个学生的信息:\n",i); 58 59 p=(ListNode *)malloc(sizeof(ListNode)); 60 61 printf("请输入姓名:\n");/*输入数据*/ 62 63 scanf("%s",&p->name); 64 65 printf("请输入学号:\n"); 66 67 scanf("%ld",&p->id); 68 69 printf("请输入性别:\n"); 70 71 scanf("%s",&p->gender); 72 73 printf("请输入年龄:\n"); 74 75 scanf("%d",&p->age); 76 77 printf("请输入分数:\n"); 78 79 scanf("%d",&p->score); 80 81 pre->next=p; 82 83 pre=p; 84 85 } 86 87 p->next=NULL; 88 89 return head;/*返回这个链表的首地址*/ 90 91 } 92 93 94 95 void output(ListNode *h) /*输出链表*/ 96 97 { 98 99 ListNode *p; 100 101 if(h==NULL) 102 103 printf("无数据\n"); 104 105 else 106 107 { 108 109 p=h->next; 110 111 while(p) 112 113 { 114 115 printf("%s,%ld,%s,%d,%d",p->name,p->id,p->gender,p->age,p->score); 116 117 p=p->next; 118 119 printf("\n"); 120 121 } 122 123 } 124 125 } 126 127 128 129 void Insert(ListNode *h,int n) /*插入链表结点*/ 130 131 { 132 133 ListNode *q,*p; 134 135 int j,i; 136 137 printf("插入数据的位置:\n"); 138 139 scanf("%d",&i); 140 141 if(i<1 || i>n+1) 142 143 printf("错误,请重新输入.\n"); 144 145 else 146 147 { 148 149 j=0; 150 151 p=h; 152 153 while(j<i-1) 154 155 { 156 157 p=p->next; 158 159 j++; 160 161 } 162 163 q=(ListNode *)malloc(sizeof(ListNode));/*为要插入的结点分配内存空间*/ 164 165 printf("请输入姓名:\n");/*赋值操作*/ 166 167 scanf("%s",&q->name); 168 169 printf("请输入学号:\n"); 170 171 scanf("%ld",&q->id); 172 173 printf("请输入性别:\n"); 174 175 scanf("%s",&q->gender); 176 177 printf("请输入年龄:\n"); 178 179 scanf("%d",&q->age); 180 181 printf("请输入分数:\n"); 182 183 scanf("%d",&q->score); 184 185 q->next = p->next; /*调整指针域*/ 186 187 p->next=q; 188 189 } 190 191 } 192 193 194 195 void deletes(ListNode *h,int n) /*函数功能:删除链表结点*/ 196 197 { 198 199 ListNode *p,*q; 200 201 int j,i; 202 203 printf("请输入要删除的数据的位置:"); 204 205 scanf("%d",&i); 206 207 if(i<1 || i>n)/*如果位置超出了1和n的范围的话则打印出错误信息*/ 208 209 printf("错误,请重新输入.\n"); 210 211 else 212 213 { 214 215 j=0; 216 217 p=h; 218 219 while(j<i-1) 220 221 { 222 223 p=p->next; 224 225 j++; 226 227 } 228 229 q=p->next; 230 231 p->next=q->next; 232 233 free(q);//释放q指向的结点 234 235 printf("第%d个数据已删除:\n",i); 236 237 } 238 239 } 240 241 242 243 find(ListNode *h)/*按序号查找链表*/ 244 245 { 246 247 int ii,ij; 248 249 printf("请输入要查询的序号:\n"); 250 251 scanf("%d",&ii); 252 253 ListNode *p; 254 255 p=h->next; 256 257 if(p==NULL) 258 259 printf("未找到\n"); 260 261 else 262 263 ij=1; 264 265 while(p!=NULL&&ij<ii) 266 267 { 268 269 p=p->next; 270 271 ij++; 272 273 } 274 275 if(ii==ij) 276 277 output(p); 278 279 else 280 281 printf("未找到:\n"); 282 283 } 284 285 286 287 288 289 void txtleletters() /*主标题*/ 290 291 { 292 293 printf("1.建立 \n"); 294 295 printf("2.显示 \n"); 296 297 printf("3.查找 \n"); 298 299 printf("4.插入 \n"); 300 301 printf("5.删除 \n"); 302 303 printf("6.退出 \n"); 304 305 printf("请输入要选择功能的序号:"); 306 307 } 308 309 310 311 312 313 314 315 void main() /*主函数*/ 316 317 { 318 319 ListNode *h; 320 321 ListNode *f; 322 323 h=NULL; 324 325 int i, n; 326 327 txtleletters(); 328 329 while (1) 330 331 { 332 333 printf("\n"); 334 335 scanf("%d",&i); 336 337 switch(i) 338 339 { 340 341 case 1: 342 343 printf("请输入创建链表节点的个数:\n"); /*输入创建链表结点的个数*/ 344 345 scanf("%d",&n); 346 347 h=build(n); 348 349 printf("现有成员的信息:\n"); 350 351 output(h); 352 353 txtleletters(); 354 355 break; 356 357 case 2: 358 359 printf("现有成员信息: \n"); 360 361 output(h); 362 363 txtleletters(); 364 365 break; 366 367 case 3: 368 369 find(h); 370 371 txtleletters(); 372 373 break; 374 375 case 4: 376 377 Insert(h,n); 378 379 printf("现有成员信息:\n"); 380 381 output(h); 382 383 txtleletters(); 384 385 break; 386 387 case 5: 388 389 deletes(h,n); 390 391 printf("现有成员信息: \n"); 392 393 output(h); 394 395 txtleletters(); 396 397 break; 398 399 case 6: 400 401 return; 402 403 break; 404 405 default: 406 407 printf("错误的选项,请重新选择:\n"); 408 409 } 410 411 } 412 413 }