经典实验--链表:跳高比赛
·一、实验目的
实验目的:熟练掌握单向链表的创建、插入、删除等操作。
·二、实验原理
请利用单向链表模拟比赛时跳高运动员成绩的处理。
具体要求:
1)每位运动员只跳一次,每当跳完便记录他的成绩,成绩按从大到小顺序排列;
2)当每一个新成绩出来时,从大到小输出所有跳过的运动员的成绩;
3)全部成绩出来以后,如果发现运动员服用了兴奋剂,则取消(删除)其成绩。
4)最后按照成绩从大到小顺序输出运动员的名字和成绩。
·三、主要数据结构
struct sportsman
int num; //学号
char name[30];//姓名
int score; //成绩
struct portsman * next;
};
·三、实验结果及分析
1、测试结果截图
(1)第一组测试数据及结果截图、
(2)第二组测试数据及结果截图
(3)第三组测试数据及结果截图
·四、源文件
#include#include #define LEN sizeof(struct Student) struct Student { int num; float score; struct Student *next; }; int n; int main() { struct Student *creat(); void print(struct Student *head); struct Student del(struct Student *head); struct Student *pt; pt=creat(); print(pt); *pt = del(pt); print(pt); return 0; } struct Student del(struct Student *head) { int num; struct Student *pre,*p; printf("Please input the number you want to delete:"); scanf("%d",&num); //查找链表中的结点p,p->num = num ,前驱pre pre = head; p = head->next; while(p&&p->num!=num) { pre = p; p = p->next; } if(!p) printf("Not found!\n"); else { //删除p所指结点 pre->next = p->next; free(p); } return *head; } struct Student *creat()//带头结点的单链表 { struct Student *head,*p1,*p2,*p;//p2 指向当前插入位置的前驱 ,p1 指向新插入的结点 // 第一步:创建带头结点的空链表 head = (struct Student *)malloc(sizeof(struct Student)) ; head->next = NULL; p2 = head; //输入元素 int num; float score; scanf("%d,%f",&num,&score); n = 0; while(num!=0) { p1=(struct Student *)malloc(LEN); p1->num = num; p1->score = score; n=n+1; //找p2 p2 = head; p=head->next; while( p && score < p->score ) { p2 = p; p = p->next; } p1->next = p2->next; p2->next=p1; scanf("%d,%f",&num,&score); } return(head); } void print(struct Student *head)//带头结点的单链表 { struct Student *p; p=head->next; if(p!=NULL) { printf("Scores are:\n"); do { printf("num:%d,score:%.2f\n",p->num,p->score); p=p->next; }while(p!=NULL); } else { printf("Empty!"); } }