PTA 建立学生信息链表(线性表之链表描述) —— C

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。

函数接口定义:

void input();

该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:

struct stud_node {
    int              num;      /*学号*/
    char             name[20]; /*姓名*/
    int              score;    /*成绩*/
    struct stud_node *next;    /*指向下个结点的指针*/ 
 };

单向链表的头尾指针保存在全局变量head和tail中。

输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

裁判测试程序样例:

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

struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next; }; struct stud_node *head, *tail;

void input();

int main() {
    struct stud_node *p;
	head = tail = NULL; 	
	input(); 
	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

输出样例:

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

思路:创建个临时节点指针 *temnode,其指向的空间用来存储每次输入的数据。对于第一组数据,head 和 tail 同时指向其存储空间,即 head = tail = temnode;对之后的数据 head 不再变化, tail 的下级指针指向数据存储空间 ,即 tail -> next = temnode,然后 tail 指针移位, tail = tail —>next。

注意:临时节点指针的创建有固定套路:
struct stud_node temnode = (struct stud_node)malloc(sizeof(struct stud_node));

代码:

void input() {
	int tem = 0;
	int thenum;
	while (scanf("%d",&thenum)&&thenum){
		struct stud_node *temnode = (struct stud_node*)malloc(sizeof(struct stud_node));
		temnode->num = thenum;
		scanf("%s %d", temnode->name, &temnode->score);
		if (tem == 0) {
			tem = 1;
			tail = head = temnode;
		}
		else {
			tail->next = temnode;
			tail = tail->next;
		}
	}
}

之前的错误思路:head 和 tail 同时指向一片新的存储空间,即
tail = head = (struct stud_node*)malloc(sizeof(struct stud_node));
每次输入的数据,存储到 tail 指向的空间,
再令 tail 的下级指针指向一片新的存储空间,tail 指针移位, tail = tail->next;
所有数据输入完毕,此时 tail 指向的空间没有存储数据,所以 delete tail,tail =NULL;但问题是 delete 并非真正删除 tail ,tail 会随机指向一个空间,直到程序完全结束,
所以没有数据的 tail !=NULL,输出时,会多输出一行 0 0。

代码:

void input() {
	tail = head = new stud_node();
	while (scanf("%d", &tail->num) && tail->num) {
		scanf("%s %d", tail->name, &tail->score);
		tail->next = new stud_node();
		tail = tail->next;
	}
	delete tail;
	tail = NULL;
}

(研究了一下午,终于整明白了!o( ̄▽ ̄)ブ)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习【数据结构课程】线性表知识,自己动手做的【学生信息 管理 系统】。 目的:重在功能实现,思考探索。 编程语言:C IDE:VC++6.0 基础功能:增、删、查、改。 【扩展功能: 1.数据的保存、读取; 2.账号的登入、登出; 3.对数据敏感操作的日志记录; 4.对查询结果的简单数量统计。】 缺陷:没有排序功能,统计能不够强大,对非法或刁难的数据处理效果微弱。 (感兴趣的朋友可以试着填补上述缺陷) 【水平有限,代码仅作参考。 有不足之处,还望指出,非常感谢。】 附录: 1.学生信息 类型: typedef struct { char id[11]; /*学号,12入学年份,34学院,56专业,78班级,90班内号数*/ char name[11]; /*姓名,仅考虑由字母组的名字*/ int sex; /*性别,男1,女0*/ char headTeacher[11]; /*班主任*/ int entranceScore; /*入学绩*/ char birthday[9]; /*xxxx年xx月xx日*/ char Tel[12]; /*联系电话,11位*/ char homeAddress[21]; /*家庭地址*/ } stuData; 2.文件目录: head.c linklist.c linkqueue.c list.txt log.c logData.txt login.c main.c stu.c stuData.txt user.c userData.txt 基础:C语言知识,特别强调:指针和链表的知识.txt 学生信息系统_流程图_粗糙.png 提示:阅读代码可以从head.c或main.c开始;运行程序从main.c开始,登陆账号在userData.txt设置.txt 效果图1_登陆账号.png 效果图2_登陆账号2.png 效果图3_功能选择.png 效果图4_浏览学生信息.png 效果图5_查询学生信息.png 效果图6_退出查询学生信息.png 效果图7_退出账号.png 效果图8_退出系统.png 【完毕】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值