实验11-2-2-链表 学生成绩链表处理

jmuCIE 软件23 2023-12-25 20:19:34

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

函数接口定义:


 

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

首先利用尾插法创建一个链表,使其中包含所有学生的信息,并返回这个链表的头指针。

struct stud_node *createlist()
{
	struct stud_node *pt;
	pt = (struct stud_node *)malloc(sizeof(struct stud_node));
	struct stud_node *head,*tail;
	head = tail = NULL;
	scanf("%d", &pt->num);
	while (pt->num != 0)
	{
		scanf("%s %d", pt->name, &pt->score);
		if (head == NULL)
			head = pt;
		else
			tail->next = pt;

		tail = pt;
		pt = (struct stud_node *)malloc(sizeof(struct stud_node));
		scanf("%d", &pt->num);
	}
	return head;
}

第二个函数要求我们删除掉低于平均成绩的学生的信息。

首先先考虑在开头的不符合条件的学生,利用free()函数将节点删除

struct stud_node*p1, *p2;
	while (head!=NULL&&head->score<min_score)
	{
		p1 = head;
		head = head->next;
		free(p1);
	}

然后对在头节点后的情况进行考虑,但在此之前,头指针可能已经为空指针。所以要先对这种情况做处理

	if (head==NULL)
	{
		return NULL;
	}

接下来就可以考虑头节点后的情况

如果不符合条件,则用

p1->next=p2->next;
free(p2);

 将该结点删除

如果满足则对下个节点进行处理

总代码如下:

struct stud_node *createlist()
{
	struct stud_node *pt;
	pt = (struct stud_node *)malloc(sizeof(struct stud_node));
	struct stud_node *head,*tail;
	head = tail = NULL;
	scanf("%d", &pt->num);
	while (pt->num != 0)
	{
		scanf("%s %d", pt->name, &pt->score);
		if (head == NULL)
			head = pt;
		else
			tail->next = pt;

		tail = pt;
		pt = (struct stud_node *)malloc(sizeof(struct stud_node));
		scanf("%d", &pt->num);
	}
	return head;
}
struct stud_node *deletelist(struct stud_node *head, int min_score)
{
	struct stud_node*p1, *p2;
	while (head!=NULL&&head->score<min_score)
	{
		p1 = head;
		head = head->next;
		free(p1);
	}

	if (head==NULL)
	{
		return NULL;
	}
	p1 = head;
	p2 = p1->next;

	while (p2!=NULL)
	{
		if (p2->score<min_score)
		{
			p1->next = p2->next;
			free(p2);
		}
		else
		{
			p1 = p2;
		}
		p2 = p1->next;
	}

	return head;
}

 

...全文
180 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

212

社区成员

发帖
与我相关
我的任务
社区描述
程序设计基础课程教学群
c语言c++ 高校 福建省·厦门市
社区管理员
  • xmzq001
  • 鹿饮涧鸣
  • jiangxiaoju
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请加入学习社区的软件23级同学修改社区昵称为学号+姓名,以便登记作业提交情况。

试试用AI创作助手写篇文章吧