文件操作+线性链表+冒泡排序实验
现有结构体定义如下:
struct stuInfo
{
char id[12]; //数据成员
char name[15];
float score;
struct stuInfo *next; //指针成员
};
任务及要求:
(1)首先完成线性链表的定义和创建,确保链表的第一个节点为哨兵节点,不存放有效的数据;
(2)利用文件的相关操作,动态开辟节点存储空间,将存放在磁盘某个路径中的文件“stuinfo.txt”信息逐条读入,并依次存入到线性链表的每个节点中,信息如下;
00001 张三 100
00002 李四 99
00003 王五 100
00004 王六 89
00005 江涛 98
00006 陈琪 88
00007 祁廷 91
(3)接下来,将学号为‘00004’的节点删除;
(4)再接下来,利用冒泡排序,对链表继续升序排序;
(5)将完整的线性链表信息从头到尾依次存储到磁盘某个路径下的“score.txt”文件中,存储格式和“stuinfo.txt”文件相同。文件操作+线性链表+冒泡排序实验
现有结构体定义如下:
struct stuInfo
{
char id[12]; //数据成员
char name[15];
float score;
struct stuInfo *next; //指针成员
};
任务及要求:
(1)首先完成线性链表的定义和创建,确保链表的第一个节点为哨兵节点,不存放有效的数据;
(2)利用文件的相关操作,动态开辟节点存储空间,将存放在磁盘某个路径中的文件“stuinfo.txt”信息逐条读入,并依次存入到线性链表的每个节点中,信息如下;
00001 张三 100
00002 李四 99
00003 王五 100
00004 王六 89
00005 江涛 98
00006 陈琪 88
00007 祁廷 91
(3)接下来,将学号为‘00004’的节点删除;
(4)再接下来,利用冒泡排序,对链表继续升序排序;
(5)将完整的线性链表信息从头到尾依次存储到磁盘某个路径下的“score.txt”文件中,存储格式和“stuinfo.txt”文件相同。
供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stuInfo{
char id[12]; //数据成员
char name[15];
float score;
struct stuInfo* next;//指针成员
};
void createList(struct stuInfo** L)//创建链表
{
(*L) = (struct stuInfo*)malloc(sizeof(struct stuInfo));
(*L)->next = NULL;
}
void readfile(struct stuInfo *L) //读文件到链表
{
FILE* fp;
struct stuInfo* pL = L, * pnew = NULL;
fp = fopen("stuinfo.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
while (pL->next) pL = pL->next;
while (1) {
pnew = (struct stuInfo*)malloc(sizeof(struct stuInfo));
pnew->next = NULL;
if (fscanf(fp, "%12s%15s%f", pnew->id, pnew->name, &pnew->score) != 3) {
free(pnew);
break;
}
else {
pL->next = pnew;
pL = pnew;
}
}
fclose(fp);
}
void deletestuid(struct stuInfo* L) //删除学号为xxxxx的结点
{
int flg = 0;
char id[12] = { 0 };
struct stuInfo* pL = L, * pT = NULL;
printf("请输入要删除的学号:");
scanf("%s", id);
while (pL->next) {
if (strcmp(pL->next->id, id) == 0) {
pT = pL->next;
pL->next = pT->next;
free(pT);
flg = 1;
}
else
pL = pL->next;
}
if (!flg)
printf("未找到学号:%s 的记录。\n", id);
else
printf("删除成功!\n");
}
void bbsortList(struct stuInfo* L)//按成绩冒泡排序函数
{
struct stuInfo* pL, * tail = NULL, * pNext;
while ((L->next->next) != tail) {
pL = L;
pNext = L->next;
while (pNext->next != tail)
{
if (pNext->score > pNext->next->score)
{
pL->next = pNext->next;
pNext->next = pNext->next->next;
pL->next->next = pNext;
pNext = pL->next;
}
pNext = pNext->next;
pL = pL->next;
}
tail = pNext;
}
}
void writefile(struct stuInfo* L) //写文件,将链表内容保存到文件
{
FILE* fp;
struct stuInfo* pL = L;
fp = fopen("score.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
while (pL->next) {
fprintf(fp, "%s %s %f\n", pL->next->id, pL->next->name, pL->next->score);
pL = pL->next;
}
fclose(fp);
}
void printList(struct stuInfo* L)
{
struct stuInfo* p = L;
while (p->next) {
printf("%s %s %7.2f\n", p->next->id,p->next->name, p->next->score);
p = p->next;
}
}
int main()
{
struct stuInfo* L = NULL;//(1)线性链表的定义
createList(&L); //(1) 线性表创建
readfile(L); //(2) 将存放在磁盘的文件“stuinfo.txt”信息逐条读入存入到线性链表中
deletestuid(L); //(3) 将学号为‘xxxxx’的节点删除
bbsortList(L); //(4) 冒泡排序,对链表升序排序
writefile(L); //(5) 将线性链表信息存储到磁盘“score.txt”文件中
printList(L);
return 0;
}