题目:

  每个学生的信息卡片包括学号、姓名和成绩三项。定义存储学生信息的单向链表的结点类型;编写函 数,由文件依次读入 n(n≥0)个学生的信息,创建一个用于管理学生信息的单向链表;编写函数,对 该链表进行整理,保证该单向链表的结点顺序满足学号从小到大的顺序。

算法的设计与分析:

  1. 定义学生类型结构体(含有分量id,name,score),定义链表节点结构体(含有分量student结构体stu和指向下一个节点的指针next)
  2. 从文件读取,采用fopen方法返回FILE指针,用fscanf方法读取数据并创建节点组成链表
    1. 还可以使用freopen的方法,直接scanf即可
    2. 或者用我一开始的土方法,用fgets函数读取一行,用stroke分割该行字符串,将字符串转化成int,创建结构体。比上面的方法复杂多了。
  3. 按学号排序,采用插入排序的方法,插入排序,以sorted(初始为第一个元素)为边界,将sorted后的一个节点插在前面已经排好的链表中,直到sorted后没有节点

注意:

  1. char* 结构体*等指针要用必须分配空间
    1. 分配空间通常使用malloc函数,A* a=(*A)malloc(sizeof(A))
  2. malloc申请的空间要free掉,free(a)
  3. malloc和free这一对与new和delete这一对非常像,c++里动态分配空间用new,c里要用malloc

源代码(talk is cheap,show me the code)(屁话少说,放码过来)

 #include <stdio.h>
#include<malloc.h>
#define NAME_MAX 20 //名字的最长长度 typedef struct my_student {
int id;
char* name;
int score;
} student;
typedef struct my_list_node {
student stu;
struct my_list_node *next;
} Node; Node* getStuFromFile(char *path) {
//从文件中读取学生数据创建单链表并返回头指针
FILE *stu_file;
stu_file = fopen(path, "r");
if (stu_file == NULL) {//如果路径不正确
printf("file path error!");
return ;
}
//循环从文件中读取数据创建节点
Node* head = (Node*)malloc(sizeof(Node));//哨兵节点
Node* current_node = head;//用于循环赋值时表示当前节点
while (!feof(stu_file)) {
Node* temp = (Node*)malloc(sizeof(Node));
//id ,name,score分别表示临时节点的student的id等
int* id =&( temp->stu.id);
temp->stu.name = (char*)malloc(sizeof(char)*NAME_MAX);
char* name = temp->stu.name;
int* score = &(temp->stu.score);
//从文件中读取临时节点的各个数据并赋值
fscanf(stu_file, "%d %s %d", id, name, score);
//将临时节点设为当前节点的子节点
current_node->next = temp;
current_node = current_node->next;
}
current_node->next = ;
fclose(stu_file);
return head;
}
void showStuInfor(Node* node) {
//递归打印每个学生的信息
if (node != ) {
printf("%d %s %d\n", node->stu.id, node->stu.name, node->stu.score);
if (node->next != ) {
//递归
showStuInfor(node->next);
}
}
} void insertNode(Node* preL, Node* preR) {
//在preL节点后插入preR后的节点
Node* insert= preR->next;
preR->next = preR->next->next;
insert->next = preL->next;
preL->next = insert;
}
void sortListByStuId(Node *head) {
//插入排序,以sorted为边界,将sorted后的一个节点插在前面已经排好的链表中,直到sorted后没有节点 //初始化sorted有一个节点,算是已经排好序
Node* sorted = head->next;
//将sorted后的一个节点插到前面
while (sorted->next != ) {
Node* insert = sorted->next;
Node* loc = head;
//从head开始遍历该插入到什么地方
while (insert->stu.id > loc->next->stu.id) {
loc = loc->next;
}
//如果loc与sorted不相等执行插入,如果相等说明要插入的元素比sorted之前的都大,直接让sorted后移即可
if (loc != sorted) {
insertNode(loc, sorted);
}
else {
sorted = sorted->next;
}
}
}
void freeNodes(Node* head) {
//递归释放malloc申请的空间
if (head != ) {
if (head->next != ) {
//释放name占用的空间
free(head->next->stu.name);
//递归释放
freeNodes(head->next);
}
free(head);
}
}
void test() {
//测试函数
//从文件中读取学生数据并打印
char path[] = "D:\\student.txt";
Node* students = getStuFromFile(path);
showStuInfor(students->next);
printf("\n sorted:\n");
//按学号排序后打印学生数据
sortListByStuId(students);
showStuInfor(students->next);
freeNodes(students);
} int main() {
test();
}

The end

《程序设计基础》实验题目2 c文件读取(反序列化?) 链表排序的更多相关文章

  1. 微信小程序开发——活动规则类文案文件读取及自动转换为小程序排版代码

    前言: 最近做的小程序活动规则内容比较多,且一直处于修改中.由于小程序并不支持类似Html5中的预排版,所以,活动规则内容修改较大的时候,仍需要对新的内容用小程序的<text>组件做下排版 ...

  2. PowerShell中进行文件读取,信息排序,分类计数。

    这是国外某大学QA的一道作业题,读取mainlog文件中的每一行信息,并获取有效的信息,也就是每条信息中第四个@后面的内容,然后进行分类与计数,要求是用Perl写,但我是用PowerShell完成的, ...

  3. 【代码审计】大米CMS_V5.5.3 任意文件读取漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  4. 【代码审计】XYHCMS V3.5任意文件读取漏洞分析

      0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...

  5. 【代码审计】QYKCMS_v4.3.2 任意文件读取漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

  6. Java基础-输入输出-2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt

    2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt ...

  7. 从零开始学 Web 之 HTML5(三)网络监听,全屏,文件读取,地理定位接口,应用程序缓存

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  8. Creating Dialogbased Windows Application (4) / 创建基于对话框的Windows应用程序(四)Edit Control、Combo Box的应用、Unicode转ANSI、Open File Dialog、文件读取、可变参数、文本框自动滚动 / VC++, Windows

    创建基于对话框的Windows应用程序(四)—— Edit Control.Combo Box的应用.Unicode转ANSI.Open File Dialog.文件读取.可变参数.自动滚动 之前的介 ...

  9. 在C#程序中,创建、写入、读取XML文件的方法

    一.在C#程序中,创建.写入.读取XML文件的方法 1.创建和读取XML文件的方法,Values为需要写入的值 private void WriteXML(string Values) { //保存的 ...

随机推荐

  1. LeetCode 953. Verifying an Alien Dictionary (验证外星语词典)

    题目标签:HashMap 题目给了我们一个 order 和 words array,让我们依照order 来判断 words array 是否排序. 利用hashmap 把order 存入 map, ...

  2. 还在自建Redis缓存?那你就out了

    Redis 是什么?简单来说,Redis是一个开源的内存数据库,支持Key-Value等多种数据结构,可用于缓存.事件发布或订阅.高速队列等场景.Redis使用ANSIC语言编写,支持网络,提供字符串 ...

  3. WPF学习笔记:ComboBox的数据绑定

    UI <UserControl x:Class="UnitViews.UserMeUV" xmlns="http://schemas.microsoft.com/w ...

  4. 【bzoj1821】[JSOI2010]Group 部落划分 Group

    题目大意:要求把n个点分成m块,使得每一块之间的距离的最小值最大 n^2枚举所有点之间距离 然后sort一下 并查集维护连通关系 一开始e[]开MAXN然后WA了测了4ms,然后开MAXN<&l ...

  5. python pass 的用法

    python pass用法 1.空语句 do nothing 2.保证格式完整 3.保证语义完整 4.以if语句为例: C/C++中写法: if(true) ; // do nothing else ...

  6. LCT教程

    lct是一种动态树,用来维护一些动态加边删边的操作的东西.他主要用到几个操作,其实这个算法和树链刨分有点像,但是不能用线段树简单维护,所以我们要用多棵平衡树来维护树上的一个个子树,然后就进行一些很秀的 ...

  7. [Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. 利用Kibana来查看和管理Elasticsearch的索引(Kibana使用篇)

    经过前面几篇的学习,我们已经知道如何在Kibana里边对Elasticsearch进行操作了,那么如何查看已存在的索引呢,我们来看, 在Management里边可以看到我们刚刚创建的sdb索引.另外还 ...

  9. Spark RDD/Core 编程 API入门系列之简单移动互联网数据(五)

    通过对移动互联网数据的分析,了解移动终端在互联网上的行为以及各个应用在互联网上的发展情况等信息. 具体包括对不同的应用使用情况的统计.移动互联网上的日常活跃用户(DAU)和月活跃用户(MAU)的统计, ...

  10. Web程序安全机制

    ASP.NET提供了一个多层的安全模型,这个模型能够非常容易的保护Web应用程序. 安全策略没有必要非常复杂,但是需要应用安全策略的地方却是非常广泛的.程序员需要保证自己的应用程序不能被骗取,而把私有 ...