PTA|《C语言程序设计实验与习题指导(第3版)》实验11-2-2 学生成绩链表处理 (20分)

题目

本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。

函数接口定义:

struct stud_node *createlist();
struct stud_node *deletelist( struct stud_node *head, int min_score );

函数createlist利用scanf从输入中获取学生的信息,将其组织成单向链表,并返回链表头指针。链表节点结构定义如下:

struct stud_node {
    int              num;      /*学号*/
    char             name[20]; /*姓名*/
    int              score;    /*成绩*/
    struct stud_node *next;    /*指向下个结点的指针*/
};

输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

函数deletelist从以head为头指针的链表中删除成绩低于min_score的学生,并返回结果链表的头指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next;
};

struct stud_node *createlist();
struct stud_node *deletelist( struct stud_node *head, int min_score );

int main()
{
    int min_score;
    struct stud_node *p, *head = NULL;

    head = createlist();
    scanf("%d", &min_score);
    head = deletelist(head, min_score);
    for ( p = head; p != NULL; p = p->next )
        printf("%d %s %d\n", p->num, p->name, p->score);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
80

输出样例:

2 wang 80
4 zhao 85

AC代码

  • 跳过应该删除的节点,将应该保留的节点连接。
  • 删除节点应该free()该节点,OJ系统对此没有要求,就省事没写
struct stud_node *createlist(){
    struct stud_node *p,*head=NULL,*tail=NULL;
    int tmp; 
    scanf(" %d",&tmp);	//暂存学号
    while(tmp!=0){
        p=(struct stud_node*)(malloc(sizeof(struct stud_node)));	//学号不为零,申请空间
        p->num=tmp;		//存入学号
        scanf(" %s %d",&p->name,&p->score);		//存入姓名、分数
        if(head==NULL){		//如果链表为空,初始化链表
            head=tail=p;
        }
        else{		//链表不为空,尾插法插入新的学生信息
            tail->next=p;
            tail=tail->next;
            tail->next=NULL;
        }
        scanf(" %d",&tmp);	//暂存下一个学号,用以判断是否退出函数
    }
    return head;	
}
struct stud_node *deletelist( struct stud_node *head, int min_score ){
    struct stud_node *p1,*p2;
    if(head==NULL)return NULL;		//链表为空则返回空
    while(head!=NULL){	//链表不为空,使表头指针指向第一个不小于min_scor的节点
        if(head->score<min_score){
            if(head->next!=NULL)head=head->next;
            else return NULL;
        }
        else break;
    }
    p1=head;	//p1指向最新检测的可以保留的节点
    p2=head->next;	//p2指向即将检测的节点
    while(p2!=NULL){	//指向NULL则说明链表已检测完,可以直接返回头节点
        while(p2->score<min_score){   //寻找下一个应该保留的节点        
            if(p2->next!=NULL)p2=p2->next;	//下个节点不为空,继续检测下一个节点
            else{	//下个节点为空,将上一个可以保留的节点的后继指针指向空,返回头节点
                p1->next=NULL;
                return head;
            }                
        }		//退出循环表示找到下一个可以保留的节点
            p1->next=p2;	//将上一个可以保留的节点的后继指针指向该节点
            p1=p2;	//更新最新的可以保留的节点
            p2=p2->next;	//更新下一个需要检测的节点
    }
    return head;
}
发布了188 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44421292/article/details/104815162