#include <stdio.h> #include <string.h> #include <malloc.h> int count = 0; struct Student { char num[15]; char name[30]; int score; struct Student *next; }; struct Student *Head; struct Student *creatLink(void); void insert(struct Student *head, int n); void detel(struct Student *head); void printLink(struct Student *head); void menu() { int choose, n; printf("----------------------------------------------------\n"); printf("| 菜单 |\n"); printf("| 1,输入学生成绩。 |\n"); printf("| 2,插入学生成绩。 |\n"); printf("| 3,删除学生。 |\n"); printf("| 4,打印成绩表。 |\n"); printf("| 0,退出。 |\n"); printf("----------------------------------------------------\n"); loop: scanf("%d", &choose); switch(choose) { case 0: system("exit"); break; case 1: Head = creatLink(); menu(); break; case 2: printf("请输入在第几项插入元素:\n"); scanf("%d", &n); insert(Head, n); menu(); break; case 3: detel(Head); menu(); break; case 4: printLink(Head); menu(); break; default: printf("输入错误,请从新输入!!!\n"); goto loop; break; } } struct Student *creatLink(void) { struct Student *head, *stu, *linkTail; head = linkTail = NULL; stu = (struct Student*)malloc(sizeof(Student)); printf("输入end结束:\n"); printf("学号 姓名 成绩\n"); scanf("%s", stu->num); while( strcmp("end", stu->num) ) { scanf(" %s %d", stu->name, &stu->score); count++; if( head == NULL ) { head = stu; } else { linkTail->next = stu; } linkTail = stu; stu = (struct Student *)malloc(sizeof(Student)); scanf("%s", stu->num); } stu->next = linkTail->next = NULL; printf("成功创建成绩表,学生人数为:%d\n", count); return (head); } void insert(struct Student *head, int n) //在链表的第n项后插入新的元素 { struct Student *linkTail, *linkInsert; int i = 1; count++; if( n > count ) n = count; printf("请输入插入学生的信息:\n"); printf("学号 姓名 成绩\n"); linkInsert = (struct Student*)malloc(sizeof(Student)); scanf("%s %s %d", linkInsert->num, linkInsert->name, &linkInsert->score); if( n <= 0 || Head==NULL ) { linkInsert->next = head; Head = linkInsert; } else { linkTail = head; while( i < n ) { linkTail = linkTail->next; i++; } linkInsert->next = linkTail->next; linkTail->next = linkInsert; if( n >= count ) linkInsert->next = NULL; } } void detel(struct Student *head) { struct Student *linkTail, *linkHead; if( head == NULL ) { printf("成绩表为空,无可删除学生!!!\n"); } else { linkHead = linkTail = head; count--; printf("请输入要删除学生的学号:\n"); char num[15]; scanf("%s", num); while( strcmp(linkTail->num, num)!=0 && linkTail->next!=NULL ) { linkHead = linkTail; linkTail = linkTail->next; } if( strcmp(linkTail->num, num)!=0 ) printf("对不起,没有查到学号为%s的学生,请检查是否输入有误。\n", num); else printf("已成功删除学号为%s的学生信息。\n"); if( head == linkTail ) Head = linkTail->next; else linkHead->next = linkTail->next; } } void printLink(struct Student *head) //打印链表 { struct Student *last; last = head; printf("成绩表为:\n"); printf("学号 姓名 成绩\n"); while( last != NULL ) { printf("%-10s%-20s%3d\n", last->num, last->name, last->score); last = last->next; } last = NULL; } int main() { menu(); return 0; }
对链表的综合操作
最新推荐文章于 2022-04-06 15:10:48 发布