因为觉得C语言老师讲链表讲的太匆忙了,况且PPT太乱太杂,看不懂
因此特地重写了次这周三上机有关链表操作的三题。(所写题目默认已排序,不考虑排序)
问题 A: 在单链表中按学号查成绩
时间限制: 1 Sec 内存限制: 128 MB
提交: 62 解决: 43
[提交][状态][讨论版]
题目描述
写一个建立单链表的函数,设链表的表元素包含学号、姓名、一门课的成绩,写一个按照学号查学生成绩的函数;最后写一个主函数,先调用建立函数,再调用查询函数,显示查到的学生的姓名和成绩。
输入
前几行是一组学生信息,每行一个学生包括学号、姓名、成绩,当输入学号为0结束;
最后一行是一个学号,是待查询的学生学号
输出
查到的学生成绩信息,一行包括学号,姓名,成绩。
如果没找到则输出Not found
样例输入
1 Wangli 77
3 Lishi 88
4 Zhangsan 87
5 Cuidi 90
7 Zhaowu 67
8 Wuwei 86
0
7
样例输出
7 Zhaowu 67
1 #include <stdio.h> 2 #include <malloc.h> 3 #define NULL 0 4 #define LEN sizeof(struct student) 5 struct student 6 { 7 int num; 8 char name[15]; 9 int score; 10 struct student *next; 11 }*head,*p1,*p2,*p; 12 /* p1:指向后继结点的首地址的指针变量 13 p2:指向结点成员next的指针变量。 next的值是下一个结点的首地址。 */ 14 struct student *creat(void) 15 { 16 int t; 17 p1=p2=(struct student *) malloc(LEN); 18 scanf("%d%s%d",&p1 ->num,&p1 ->name, &p1 ->score); 19 //head=NULL; 20 head=p1; 21 while(1) 22 { 23 p2 ->next=p1;//对当前成员下一成员地址赋值 24 p2=p1;//将p1中包含当前成员信息存储在p2 25 p1=(struct student *)malloc(LEN);//再次对p1动态开辟 26 scanf("%d",&p1->num); 27 if(p1->num==0)//如果满足题意学号为0 28 break; 29 scanf("%s%d",&p1 ->name, &p1 ->score); 30 } 31 p2 ->next=NULL;//对链表作终止处理 32 scanf("%d",&t); 33 p=head; 34 if(p!=NULL) 35 do{ 36 if(p->num==t){ 37 printf("%d %s %d ",p->num,p->name,p->score); 38 break; 39 } 40 p=p->next;//使指针指向下一成员 41 } 42 while(p!=NULL); 43 return(head); 44 } 45 int main() 46 { 47 creat(); 48 return 0; 49 }
问题 B: 单链表中插入记录
时间限制: 1 Sec 内存限制: 128 MB
提交: 56 解决: 33
[提交][状态][讨论版]
题目描述
写一个建立单链表的函数,设链表的表元素包含学号、姓名、一门课的成绩,要求按学号从小到大输入链表结点数据;写一个插入一条学生记录的函数;最后写一个主函数,先调用建立函数,然后输入要插入的学生信息,再调用插入函数,最后输出显示插入后的链表全部信息。
输入
前几行是一组学生信息,每行一个学生包括学号、姓名、成绩,当输入学号为0结束;
最后一行是一条学生记录,是待插入的学生学号、姓名、成绩插入
输出
插入后链表信息,每行一条记录; 如果该学号已存在,则输出“Record exists!”
样例输入
1 Wangli 77
3 Lishi 88
4 Zhangsan 87
5 Cuidi 90
7 Zhaowu 67
8 Wuwei 86
0
2 Xuchen 75
样例输出
1 Wangli 77
2 Xuchen 75
3 Lishi 88
4 Zhangsan 87
5 Cuidi 90
7 Zhaowu 67
8 Wuwei 86
1 #include <stdio.h> 2 #include <malloc.h> 3 #define NULL 0 4 #define LEN sizeof(struct student) 5 struct student 6 { 7 int num; 8 char name[15]; 9 int score; 10 struct student *next; 11 }*head,*p1,*p2,*p,*stu; 12 /* p1:指向后继结点的首地址的指针变量 13 p2:指向结点成员next的指针变量。 next的值是下一个结点的首地址。 */ 14 struct student *creat(void) 15 { 16 p1=p2=(struct student *) malloc(LEN); 17 scanf("%d%s%d",&p1 ->num,&p1 ->name, &p1 ->score); 18 //head=NULL; 19 head=p1; 20 while(1) 21 { 22 p2 ->next=p1;//对当前成员下一成员地址赋值 23 p2=p1;//将p1中包含当前成员信息存储在p2 24 p1=(struct student *)malloc(LEN);//再次对p1动态开辟 25 scanf("%d",&p1->num); 26 if(p1->num==0)//如果满足题意学号为0 27 break; 28 scanf("%s%d",&p1 ->name, &p1 ->score); 29 } 30 p2 ->next=NULL;//对链表作终止处理 31 32 return(head); 33 } 34 void print(struct student *head) 35 { 36 int flag=1; 37 p=head; 38 if(p!=NULL) 39 do{ 40 if(p->num>stu->num&&flag==1){ 41 printf("%d %s %d ",stu->num,stu->name,stu->score); 42 flag=0; 43 } 44 printf("%d %s %d ",p->num,p->name,p->score); 45 p=p->next;//使指针指向下一成员 46 } 47 while(p!=NULL); 48 } 49 int main() 50 { 51 creat(); 52 stu=(struct student *) malloc(LEN); 53 scanf("%d%s%d",&stu->num,stu->name,&stu->score); 54 print(head); 55 return 0; 56 }
问题 C: 单链表删除结点
时间限制: 1 Sec 内存限制: 128 MB
提交: 50 解决: 34
[提交][状态][讨论版]
题目描述
写一个建立单链表的函数,设链表的表元素包含学号、姓名、一门课的成绩,写一个按照学号删除学生记录的函数;最后写一个主函数,先调用建立函数,输入待删除学生的学号,调用删除记录的函数,最后显示删除操作后的链表信息。
输入
前几行是一组学生信息,每行一个学生包括学号、姓名、成绩,当输入学号为0结束;
最后一行是一个学号,是待删除的学生学号
输出
删除后的学生成绩表,每一行包括一个学生学号,姓名,成绩。
如果没找到则输出Not found
样例输入
1 Wangli 77
3 Lishi 88
4 Zhangsan 87
5 Cuidi 90
7 Zhaowu 67
8 Wuwei 86
0
8
样例输出
1 Wangli 77
3 Lishi 88
4 Zhangsan 87
5 Cuidi 90
7 Zhaowu 67
1 #include <stdio.h> 2 #include <malloc.h> 3 #define NULL 0 4 #define LEN sizeof(struct student) 5 struct student 6 { 7 int num; 8 char name[15]; 9 int score; 10 struct student *next; 11 }*head,*p1,*p2,*p,*stu; 12 /* p1:指向后继结点的首地址的指针变量 13 p2:指向结点成员next的指针变量。 next的值是下一个结点的首地址。 */ 14 struct student *creat(void) 15 { 16 p1=p2=(struct student *) malloc(LEN); 17 scanf("%d%s%d",&p1 ->num,&p1 ->name, &p1 ->score); 18 //head=NULL; 19 head=p1; 20 while(1) 21 { 22 p2 ->next=p1;//对当前成员下一成员地址赋值 23 p2=p1;//将p1中包含当前成员信息存储在p2 24 p1=(struct student *)malloc(LEN);//再次对p1动态开辟 25 scanf("%d",&p1->num); 26 if(p1->num==0)//如果满足题意学号为0 27 break; 28 scanf("%s%d",&p1 ->name, &p1 ->score); 29 } 30 p2 ->next=NULL;//对链表作终止处理 31 32 return(head); 33 } 34 void print(struct student *head,int del_num) 35 { 36 int flag=1; 37 p=head; 38 if(p!=NULL) 39 do{ 40 if(p->num!=del_num){ 41 printf("%d %s %d ",p->num,p->name,p->score); 42 } 43 p=p->next;//使指针指向下一成员 44 } 45 while(p!=NULL); 46 } 47 int main() 48 { 49 int del_num; 50 creat(); 51 printf("input records: "); 52 scanf("%d",&del_num); 53 print(head,del_num); 54 return 0; 55 }