经典实验--链表:跳高比赛


·一、实验目的

  实验目的:熟练掌握单向链表的创建、插入、删除等操作。

·二、实验原理

   请利用单向链表模拟比赛时跳高运动员成绩的处理。

  具体要求:

  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!");
    }
}

相关