openJudge | 统计学生信息(使用动态链表完成)

总时间限制: 1000ms 内存限制: 65536kB

描述

利用动态链表记录从标准输入输入的学生信息(学号、姓名、性别、年龄、得分、地址)

其中,学号长度不超过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

思路

方法一

使用头插法,将输入的学生信息插入到链表中,然后再将链表倒序输出。

方法二

使用链式栈,将输入的学生信息压入栈中,然后再将栈中的元素弹出。

Code

C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node {
	char data[9999999];
	struct node *next;
} Node;
void addNode(Node **head, char data[]) {
	Node *p = (Node*)malloc(sizeof(Node)), *q = *head;
	strcpy((*p).data, data);
	if(*head != 0) {
		*head = p;
		(*p).next = q;
	} else {
		*head = p;
        (**head).next = NULL;
	}
}
void readNode(Node **head) {
	Node *last = *head;
	while(last != 0) {
		printf("%s\n", last->data);
		last = last->next;
	}
}
int main() {
	Node *head = NULL;
	static char data[9999999];
	static int old, grade;
	while(gets(data), strcmp(data, "end")) {
        addNode(&head, data);
	}
	readNode(&head);
}

C++

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int main() {
	string str;
	stack<string> S;
	do {
		getline(cin, str);
		if(str.find("end") == -1) S.push(str);
	} while(str.find("end") == -1);
	while(!S.empty()) {
		cout << S.top() << endl;
		S.pop();
	}
}

一些感想

其实,将学号 姓名 性别 年龄 得分 地址看成是一个整体反而会好很多
这要感谢Looy_cai的6379:统计学生信息(使用动态链表完成)
至于,我之前写的是怎样的,看下面的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node {
	char id[20];
	char name[40];
	char sex;
	int old;
	int grade;
	char address[40];
	struct node *next;
} Node;
void addNode(Node **head, char id[], char name[], char sex, int old, int grade, char address[]) {
	Node *p = (Node*)malloc(sizeof(Node)), *q = *head;
	strcpy((*p).id, id);
	strcpy((*p).name, name);
	(*p).sex = sex;
	strcpy((*p).address, address);
	(*p).old = old;
	(*p).grade = grade;
	if(*head != 0) {
		*head = p;
		(*p).next = q;
	} else {
		*head = p;
		(**head).next = NULL;
	}
}
void readNode(Node **head) {
	Node *last = *head;
	while(last != 0) {
		printf("%s %s %c %d %d %s\n", last->id, last->name, last->sex, last->old, last->grade, last->address);
		last = last->next;
	}
}
int main() {
	Node *head = NULL;
	static char id[20], name[40], sex, address[40], *p=id;
	static int old, grade;
	while(scanf("%s", id), strcmp(id, "end")) {
		scanf("%s ", name);
		scanf("%c", &sex);
		scanf("%d", &old);
		scanf("%d", &grade);
		scanf("%s", address);
		addNode(&head, id, name, sex, old, grade, address);
		for(p = id; *p != 0; p++) {
			*p = 0;
		}
	}
	readNode(&head);
}
  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 建立学生信息链表的解题思路如下: 1. 定义学生信息结构体 首先,我们需要定义一个学生信息的结构体,包括学生的姓名、学号、性别、年龄等信息。 2. 定义链表结构体 其次,我们需要定义链表结构体,包括链表节点的指针和学生信息结构体。 3. 创建头节点 接着,我们需要创建头节点,头节点的作用是方便链表的操作,例如插入、删除、查找等。 4. 插入节点 然后,我们可以通过输入学生信息的方式,向链表中插入节点,每个节点包括一个学生信息结构体和一个指向下一个节点的指针。 5. 遍历链表 最后,我们可以通过遍历链表的方式,输出链表中所有节点的学生信息。 总的来说,建立学生信息链表的过程就是创建链表结构体、插入节点和遍历链表的过程。在这个过程中,我们需要注意指针的使用以及内存的分配和释放。 ### 回答2: 建立学生信息链表的解题思路如下: 1. 首先,定义一个学生信息的结构体,包括学生的姓名、学号、年龄等信息。 2. 创建一个头节点,作为链表的初始节点。 3. 通过用户输入,逐个添加学生信息节点到链表中。可以采用循环结构,在每次循环中,创建一个新的节点,并让用户输入该节点的学生信息。然后根据链表的结构,将该节点插入到链表的合适位置。可以根据学生的学号或者姓名来决定插入的位置。 4. 当添加完所有学生信息后,可以提供以下功能: - 查找:根据学号或者姓名来查找某个学生信息。遍历整个链表,找到对应学生节点,并输出相关信息。 - 修改:根据学号或者姓名来定位到某个学生的节点,并允许修改该学生信息。 - 删除:根据学号或者姓名来定位到某个学生的节点,并删除该节点。 - 遍历:遍历整个链表,输出所有学生信息。 5. 可以在每个功能的实现中加入一些输入校验的逻辑,确保用户输入的学生信息的有效性,例如学号不能重复。 6. 最后,记得在程序结束时释放链表内存,避免内存泄漏。 以上是建立学生信息链表的基本思路,具体的实现细节可以根据实际需求进行调整和完善。 ### 回答3: 建立学生信息链表可以采用以下步骤: 1. 定义学生信息的数据结构:首先需要定义学生的各种信息,如学号、姓名、年龄、性别等,可以使用一个结构体来存储这些信息。 2. 创建链表结点:每个链表结点包含一个学生信息的数据结构和一个指向下一个结点的指针。 3. 初始化链表:创建一个头结点,将头结点的指针指向NULL,表示链表为空。 4. 添加学生信息:根据用户输入的学生信息,创建一个新的链表结点,并将输入的信息存入结点中。然后将该结点的指针指向原链表的头结点,再将新结点设为头结点,即可完成添加操作。 5. 查找学生信息:遍历链表,逐个比较每个结点中的学生信息,找到与要查找的信息匹配的结点。 6. 修改学生信息:同样需要遍历链表,找到需要修改的结点,然后更新其信息。 7. 删除学生信息:遍历链表,找到需要删除的结点,将其从链表中摘除即可。 8. 输出学生信息:通过循环遍历链表,将每个结点中的学生信息输出到屏幕上。 最后,根据具体需求,可以进一步完善链表功能,如排序、插入、统计等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mryan2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值