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
-------------------