7-1 成绩大于等于某值的学生信息输出

7-1 成绩大于等于某值的学生信息输出

分数 20
作者 王秀
单位 福州大学
输入若干个学生信息(包括学号、姓名和成绩),输入学号为0时输入结束,建立一个单向链表,再输入一个成绩值,将成绩大于等于该值的学生信息输出。

提示:

定义函数struct stud_node *Creat_Stu_Doc()完成创建链表

定义函数struct stud_node *DeleteDoc(struct stud_node *head,int min_score)将分数低于min_score的结点删除

定义函数void Ptrint_Stu_Doc(struct stud_node *head)打印链表

输入输出示例:括号内为说明,无需输入输出

输入样例:

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

输出样例:

2 wang 80
4 zhao 85

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

解题思路

接收用户输入
由于判断输入截至点为0,我们可以使用两次scnaf函数进行接收数据,如下:

int id,score;
char name[100];
while(1)
{
scanf("%d", &id);
if(id==0)
  break;
scanf("%s %d",&name,&score);
}

设计存储结构
如下为学生信息存储的单链表存储结构

typedef struct stud_node
{
	int id;
	int score;
	char name[100];
	struct stud_node* next;
} stud_node;

创建链表
我们使用头插法进行创建即可,注意这一步和接收用户输入都可以放在Creat_Stu_Doc函数中。

将分数低于min_score的结点删除
这里和平时我们单个数据删除有所区别,因为单链表只能删除某一个节点的后继节点。我们假设待删除结点为s,前驱结点为p,那么我们需要比较p->next->scoremin_score的值,s被删除之后,p->next 就是下一个结点了,指针不需要后移。

打印链表
在遍历之前,我们需要反转链表,这里我用的是就地逆置的方法,也就是设置head的尾指针为NULL,然后将每一个结点使用头插法插入到上一个结点的前面完成逆置。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stud_node
{
	int id;
	int score;
	char name[100];
	struct stud_node* next;
} stud_node;

struct stud_node *Creat_Stu_Doc();
struct stud_node *DeleteDoc(struct stud_node *head,int min_score);
void Ptrint_Stu_Doc(struct stud_node *head);
void DeleteAfter_LinkList(struct stud_node * p);
int main()
{
	int min;
	stud_node* head = Creat_Stu_Doc();
	scanf("%d", &min);
	head = DeleteDoc(head,min);
	Ptrint_Stu_Doc(head);
	return 0;
}

struct stud_node *Creat_Stu_Doc()
{
	int id,score;
	char name[100];
	stud_node *head = (stud_node*)malloc(sizeof(stud_node));
	head->next = NULL;
	while(1)
	{
		scanf("%d", &id);
		if(id==0)
			break;

		scanf("%s %d",&name,&score);
		// 创建一个新节点s,成员变量初始化赋值。
		stud_node* s = (stud_node*)malloc(sizeof(stud_node));
		s->score = score;
		s->id = id;
		strcpy(s->name,name);

		// 头插法创建
		s->next = head->next;
		head->next = s;


	}
	return head;
}

struct stud_node *DeleteDoc(struct stud_node *head,int min_score)
{
	stud_node *p = head;
	stud_node *s;
	while(p->next!=NULL)
	{
		if(p->next->score<min_score)
		{
			s = p->next;
			p->next = s->next; // 修改p的后继节点
			s->next = NULL;
		}
		else
			p = p->next;
	}
	return head;
}

void Ptrint_Stu_Doc(struct stud_node *head)
{
	// 就地反转
	stud_node* p,*q;
	p  = head->next;
	head->next = NULL;
	while(p!=NULL)
	{
		q = p;
		p = p->next;
		q->next = head->next;
		head->next = q;
	}


	for( p = head->next; p !=NULL; p =p->next)
	{
		printf("%d %s %d\n",p->id,p->name,p->score);
	}
}
posted @ 2022-11-25 16:37  蠢蛋快跑  阅读(258)  评论(0)    收藏  举报