NOI3.2数据结构之指针和链表 6379:统计学生信息(使用动态链表完成)

题目来源:http://noi.openjudge.cn/ch0302/6379/

描述
利用动态链表记录从标准输入输入的学生信息(学号、姓名、性别、年龄、得分、地址)其中,学号长度不超过20, 姓名长度不超过40, 性别长度为1, 地址长度不超过40

输入
包括若干行,每一行都是一个学生的信息,如:
00630018 zhouyan m 20 10.0 28#460
输入的最后以"end"结束

输出
将输入的内容倒序输出
每行一条记录,按照
学号 姓名 性别 年龄 得分 地址
的格式输出

样例输入
00630018 zhouyan m 20 10 28#4600
0063001 zhouyn f 21 100 28#460000
0063008 zhoyan f 20 1000 28#460000
0063018 zhouan m 21 10000 28#4600000
00613018 zhuyan m 20 100 28#4600
00160018 zouyan f 21 100 28#4600
01030018 houyan m 20 10 28#4600
0630018 zuyan m 21 100 28#4600
10630018 zouan m 20 10 28#46000
end

样例输出
10630018 zouan m 20 10 28#46000
0630018 zuyan m 21 100 28#4600
01030018 houyan m 20 10 28#4600
00160018 zouyan f 21 100 28#4600
00613018 zhuyan m 20 100 28#4600
0063018 zhouan m 21 10000 28#4600000
0063008 zhoyan f 20 1000 28#460000
0063001 zhouyn f 21 100 28#460000
00630018 zhouyan m 20 10 28#4600

思路
建立链表后用一个ReverseList函数将链表反向,再打印链表即可

代码

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

typedef struct student
{
	char num[20];
	char name[40];
	char sex;
	int age;
	float score;
	char address[40];
	struct student *next;
 } Node;
 
 #define LEN sizeof(Node)
 
 Node *creatList()
 {
 	Node *pHead,*pEnd,*pNew;
 	char s[10] = "end";
 	pHead = pEnd = (Node*)malloc(LEN);
 	int count = 1;
 	while(1)
 	{
 		if(count == 1)
 		{
 			scanf("%s",&pEnd->num);
 			if(strcmp(pEnd->num,s) == 0)
 				break;
 			scanf("%s %c %d %f %s",&pEnd->name,&pEnd->sex,
			 &pEnd->age,&pEnd->score,&pEnd->address);
			pEnd->next = NULL;
			count++;
		 }
		 else
		 {
		 	pNew = (Node*)malloc(LEN);
		 	scanf("%s",&pNew->num);
		 	if(strcmp(pNew->num,s) == 0)
		 		break;
		 	scanf("%s %c %d %f %s",&pNew->name,&pNew->sex,
			 &pNew->age,&pNew->score,&pNew->address);
			 pNew->next = NULL;
			 pEnd->next = pNew;
			 pEnd = pNew;
			 count++;
		 }
	 }
	 return pHead;
 }
 
 Node *ReverseList(Node *pHead)
 {
 	Node *p = pHead,*q = p->next,*r;
 	p->next = NULL;
 	while(q)
 	{
 		r = q->next;
 		q->next = p;
 		p = q;
 		q = r;
	 }
	return p;
 }
 
 void PrintList(Node *pHead)
 {
 	Node *p = pHead;
 	while(p)
 	{
 		printf("%s %s %c %d %g %s\n",p->num,p->name,p->sex,
		 	p->age,p->score,p->address);
		p = p->next;
	 }
 }
 
 int main()
 {
 	Node *pHead = creatList();
 	pHead = ReverseList(pHead);
 	PrintList(pHead);
 	return 0;
 }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值