Linux标准IOday1

发布于:2025-02-10 ⋅ 阅读:(40) ⋅ 点赞:(0)

1:思维导图


2:将 student.c这个练习题,改成链表后实现

头文件link.h

#ifndef __STRUCT_H__
#define __STRUCT_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct Student{
    char name[20];
    double math;
    double chinese;
    double english;
    double physical;
    double chemical;
    double biological;
}student;
typedef struct node
{
	union
	{
		student data;
		int len;
	};
	struct node *next;
}link,*linkptr;
//创建链表
linkptr create_link();
//创建节点
linkptr create_node(student arr[],linkptr H);
//插入
void insert(student arr[],int n,linkptr H);
//将链表的信息保存到文件中
void save(linkptr H,const char *filename);
//读取文件,写入数组
void load(linkptr H,const char *filename,student brr[]);
//展示信息
void show(linkptr H);
//修改数学成绩
void setMath(linkptr H,const char *filename);
//释放链表
void myfree(linkptr H);



#endif

源文件link.c

#include "link.h"
//创建链表
linkptr create_link()
{
	linkptr H=(linkptr)malloc(sizeof(link));
	if(NULL==H)
	{
		printf("申请头结点失败!\n");
		return NULL;
	}
	H->len=0;
	H->next=NULL;
	return H;
}
//创建节点
linkptr create_node(student arr[],linkptr H)
{
	linkptr p=(linkptr)malloc(sizeof(link));
	if(NULL==p)
	{
		printf("创建节点失败!\n");
		return NULL;
	}
	p->data=arr[H->len];
	p->next=NULL;
	return p;
}
//插入
void insert(student arr[],int n,linkptr H)
{
	if(NULL==H)
	{
		printf("插入失败!\n");
		return;
	}
	linkptr q=H;
	for(int i=0;i<n;i++)
	{
		while(q->next)
		{
			q=q->next;
		}
		linkptr p=create_node(arr,H);
		p->next=q->next;
		q->next=p;
		H->len++;
	}
}
//将链表的信息保存到文件中
void save(linkptr H,const char *filename)
{
	FILE* fp=fopen(filename,"w");
	linkptr q=H;
	while(q->next)
	{
		q=q->next;
		fprintf(fp,"%s %lf %lf %lf %lf %lf %lf\n",q->data.name,q->data.math,q->data.chinese,q->data.english,q->data.physical,q->data.chemical,q->data.biological);
	}
	fclose(fp);
}
//读取文件,写入数组
void load(linkptr H,const char *filename,student brr[])
{
	int i=0;
	FILE* fp=fopen(filename,"r");
	linkptr q=H;
	while(q->next)
	{
		q=q->next;
		fscanf(fp,"%s %lf %lf %lf %lf %lf %lf\n",brr[i].name,&brr[i].math,&brr[i].chinese,&brr[i].english,&brr[i].physical,&brr[i].chemical,&brr[i].biological);
		i++;
	}
	fclose(fp);
}
//展示信息
void show(linkptr H)
{
	linkptr q=H;
	while(q->next)
	{
		q=q->next;
		printf("姓名=%s\n",q->data.name);
		printf("数学=%lf\n",q->data.math);
		printf("语文=%lf\n",q->data.chinese);
		printf("英语=%lf\n",q->data.english);
		printf("物理=%lf\n",q->data.physical);
		printf("化学=%lf\n",q->data.chemical);
		printf("生物=%lf\n",q->data.biological);
		printf("-------------------\n");
	}
}
//修改数学成绩
void setMath(linkptr H,const char *filename)
{
	int i=1;
	linkptr q=H;
	while(q->next)
	{
		double num=0;
		q=q->next;
		printf("请输入第%d个同学的数学成绩\n",i);
		scanf("%lf",&num);
		q->data.math=num;
		i++;
	}
	save(H,filename);
}
//释放链表
void myfree(linkptr H)
{
	linkptr q=H;
	while(q->next)
	{
		while(q->next)
		{
			q=q->next;
		}
		free(q);
		q=NULL;
	}
	free(H);
	H=NULL;
}

测试文件main.c

#include "link.h"
int main(int argc, const char *argv[])
{
	student arr[3]={{"lisi",99,77,55,78,67,66},
					{"wangwu",90,67,78,45,23,99},
					{"xiaol",67,45,99,78,56,90}};
	student brr[3]={0};
	linkptr H=create_link();
	insert(arr,3,H);
	save(H,"1.txt");
	load(H,"1.txt",brr);
	show(H);
	setMath(H,"filename");
	show(H);
	return 0;
}

代码截屏

测试结果

姓名=lisi
数学=99.000000
语文=77.000000
英语=55.000000
物理=78.000000
化学=67.000000
生物=66.000000
-------------------
姓名=wangwu
数学=90.000000
语文=67.000000
英语=78.000000
物理=45.000000
化学=23.000000
生物=99.000000
-------------------
姓名=xiaol
数学=67.000000
语文=45.000000
英语=99.000000
物理=78.000000
化学=56.000000
生物=90.000000
-------------------
请输入第1个同学的数学成绩
12
请输入第2个同学的数学成绩
23
请输入第3个同学的数学成绩
34
姓名=lisi
数学=12.000000
语文=77.000000
英语=55.000000
物理=78.000000
化学=67.000000
生物=66.000000
-------------------
姓名=wangwu
数学=23.000000
语文=67.000000
英语=78.000000
物理=45.000000
化学=23.000000
生物=99.000000
-------------------
姓名=xiaol
数学=34.000000
语文=45.000000
英语=99.000000
物理=78.000000
化学=56.000000
生物=90.000000
-------------------