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->score和min_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);
}
}

浙公网安备 33010602011771号