链表就是一个一个的结,每个结是一个struct数据,读写都是整个struct地read()和write(),唯一要注意的是,在往文件写和读的时候,要按照顺序写、用同样的顺序读,读回来的时候,结点的指针要修改为实际内存的地址(读一个结点分配一个结点的内存,取得它的地址写入链中)。
授人以渔,不授人以鱼。
# include <stdio.h>//提取输入输出函数 # include <stdlib.h>//提取fflush(stdin)清空缓冲区以及 # include <malloc.h>//提取动态定义内存的函数 # define student_1 sizeof (struct student)//宏定义结构体的大小方便使用 # define NULL 0//宏定义为0 为了后面的空指针指向链表末尾 # include <windows.h> //暂时不知道为什么定义~一会看见了改正 //首先程序功能是 学生数据管理 所以 需要的功能尽量写上去 //突然发现~ 10天没写的程序是那么的陌生~不知道原来我是怎么的思路~然后~备注写的很烂~我发现~看来需要 改正啊~诶~ void wait_1 (void);//此函数用于输出制作人界面函数无实际作用请忽略 int wait_2 (void);//此函数用于输出主菜单然后调用函数 void wait_3 (void);//此函数用于输出主菜单 int getchar_1 (void);//此函数用于使用户输入一个整数值然后返回其值 int judge_1 (int z);//此函数用于判断用户输入的值 用于主菜单 int judge_no (void);//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值 void bigan_1 (int z);//此函数用于对用户的正确输入进行判断调用用户选择的功能(主菜单) void game_1 (void);//此函数用于用户对第一个功能的选择后调用的函数其功能为定义一个链表并将头指针的值保存然后调用后续函数 struct student * godis (void);//此函数用于建立链表 并返回 头指针 加长!!!!!!!!!!!!!!!!!建立链表的!!!!!!!!!!!! void wait_1_1 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示 void getchar_1_1 (struct student *);//此函数用于输入姓名函数 void wait_1_2 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示 void getchar_1_2 (struct student *);//此函数用于输入学生性别 void wait_1_3 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示 void getchar_1_3 (struct student *);//此函数用于用户输入学生数学成绩 void wait_1_4 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示 void getchar_1_4 (struct student *);//此函数用于用户输入学生语文成绩 void wait_1_5 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示 void getchar_1_5 (struct student *);//此函数用于用户输入学生英语成绩 void wait_1_6 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示 void getchar_1_6 (struct student *);//此函数用于用户输入学生微机成绩 void endschar (void);//无用函数请忽略他吧 为了好看而已 void hello_1 (void);//此函数用于输出学生信息输入完一组后的选项让用户选择 void getchar_1_x (void);//此函数用于让用户输入hello_1的选择并且判断 void judge_1_x (int a);//此函数用于对用户的正确输入进行判断调用用户选择的功能(第一分菜单) void goto_1 ();//此函数用于继续输入数据 void changes_1_x ();//此函数用于更改先前用户输入的数据 void putchar_1 ();//此函数用于输出先前输入的链表 void game_2 (void); void game_3 (void); void game_4 (void); void game_5 (void); void esc_esc (void); void save_1 (void);//此函数用于函数用于储存信息 void read_1 (void);//此函数用于读取原来程序所保存的值 如果未保存 此函数可以忽略 struct student * head, * p1, * p2; //全局定义结构体指针 方便传递使用以及更改 int i = 1;//定义变量i用于保存学生的学号 struct student//定义结构体 此结构体为学生信息储存及建立链表所需 { char name[22];//学生姓名 char sex[1];//学生性别 float score_1;//学生数学成绩 float score_2;//学生语文成绩 float score_3;//学生英语成绩 float score_4;//学生微机成绩 int number;//学生学号 struct student * next;//指向结构体的指针用于建立链表的连接 }; int main (void)//主函数 程序进入口 为了调用后面的菜单和最后结束储存 { int a;//定义变量a 用于储存用户对于主菜单的选择 wait_1 ();//调用函数用于输出制作人界面 a = wait_2 ();//输出主菜单然后调用函数输入以及判断输入信息 bigan_1 (a);//此函数用于对用户的正确输入进行判断调用用户选择的功能 save_1 ();//调用函数用于储存信息 printf ("\n谢谢使用\n");//输出谢谢使用此时函数结束 free (head);//释放前面的动态内存 return 0;//返回值为0让计算机确认程序结束 } void wait_1 (void)//此函数用于输出制作人界面函数无实际作用请忽略 { printf ("*******************************************************************************\n"); printf ("*******************************************************************************\n"); printf ("*** O(∩_∩)O 欢迎使用学生系统 O(∩_∩)O ***\n"); printf ("*** O(∩_∩)O 本系统正在调试期 O(∩_∩)O ***\n"); printf ("*** O(∩_∩)O 谢谢使用 O(∩_∩)O ***\n"); printf ("**************************************小偌*************************************\n"); printf ("****************************这个程序的功能会尽力完善***************************\n"); printf ("**********************************~~~~(>_<)~~~~**************制作人: 小偌*****\n"); printf ("*******************************************************************************\n"); printf ("\n\n\n请按回车继续......"); getchar (); system("cls");//清除窗口文字用于方便使用 } int wait_2 (void)//此函数用于输出主菜单然后调用函数 { int z, t;//定义变量z t 用于保存用户输入的值和判断正确后的值 wait_3 ();//输出选择 z = getchar_1 ();//取的输入值 t = judge_1(z);//此函数用于判断用户输入的值 用于主菜单 return t;//返回值t 是用户输入正确后的值 } void wait_3 (void)//此函数用于输出主菜单 { printf ("\n\n\n"); printf ("****************************卍卍卍卍卍卍卍卍卍卍********************************\n"); printf ("*卍卍卍**卍****/////////****卍1.录入学生数据 卍******/////////******卍卍卍**卍*\n"); printf ("*****卍**卍****/////////****卍2.学生数据查询 卍******/////////**********卍**卍*\n"); printf ("*卍卍卍卍卍****/////////****卍3.学生数据更改 卍******/////////******卍卍卍卍卍*\n"); printf ("*卍**卍********/////////****卍4.数据排序选择 卍******/////////******卍**卍*****\n"); printf ("*卍**卍卍卍****/////////****卍5.单科成绩查询 卍******/////////******卍**卍卍卍*\n"); printf ("***************/////////****卍6.退出管理程序 卍******/////////*****************\n"); printf ("****************************卍卍卍卍卍卍卍卍卍卍********************************\n"); } int getchar_1 (void)//此函数用于使用户输入一个整数值然后返回其值 { int z;//定义变量z用于存储用户输入的值 fflush(stdin);//清空磁盘缓冲区 printf ("\n\n请输入您的选择后按回车键.......");//提示输入信息 scanf ("%d",&z);//输入使用整数输入 system("cls");//清除窗口文字用于方便使用 return z;//返回值z为用户输入的值 } int judge_1 (int z)//此函数用于判断用户输入的值 用于主菜单 { for (;1;)//无限循环直至用户输入正确退出循环 { system("cls");//清除窗口文字用于方便使用 if (z<1) { wait_3 ();//输出主菜单让用户确定先前输入 z = judge_no ();//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值 } else if (z>6) { wait_3 ();//输出主菜单让用户确定先前输入 z = judge_no ();//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值 } else { break; } } return z;//返回值z是主菜单正确的输入值 } int judge_no (void)//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值 { int z;//定义变量z用于存储用户输入的值 printf ("\n对不起,您的输入有误请重新输入...");//提示输入信息 fflush(stdin);//清空磁盘缓冲区 scanf ("%d",&z);//输入使用整数输入 return z;//返回值z是用户重新输入的值 } void bigan_1 (int z)//此函数用于对用户的正确输入进行判断调用用户选择的功能(主菜单) { switch (z)//用于调用用户选择 { case 1: { game_1 ();//调用函数用于用户对第一个功能的选择后调用的函数其功能为定义一个链表并将头指针的值保存然后调用后续函数 break; } case 2: { game_2 (); break; } case 3: { game_3 (); break; } case 4: { game_4 (); break; } case 5: { game_5 (); break; } default : { esc_esc (); } } } void game_1 (void)//此函数用于用户对第一个功能的选择后调用的函数其功能为定义一个链表并将头指针的值保存然后调用后续函数 { read_1 ();//读取原来程序所保存的值 如果未保存 此函数可以忽略 head = godis ();//生成一个链表 p1 = head;//将头指针的值付给结构体指针 p2 = head;//将头指针的值付给结构体指针 head->number = i;//将学号自动加一免除用户输入的麻烦 getchar_1_1 (p1);//调用函数进行输入 endschar ();//调用函数输出无用请忽略 hello_1 ();//调用函数用于输出学生信息输入完一组后的选项让用户选择 getchar_1_x ();//调用函数其作用为让用户输入hello_1的选择并且判断 } struct student * godis (void)//此函数用于建立链表 并返回 头指针 加长!!!!!!!!!!!!!!!!!建立链表的!!!!!!!!!!!! { struct student * p; p = (struct student *) malloc (student_1); return p; } void getchar_1_1 (struct student * p1)//此函数用于输入姓名函数 (此处采用连续调用输入方便阅读) { wait_1_1 ();//输出输入提示 fflush(stdin);//清空磁盘缓冲区 scanf ("%s", &(p1->name));//输入学生姓名 printf ("%s", p1->name);//将先前用户的输入输出是用户发现输入错误后及时更改 getchar_1_2 (p1);//调用函数继续下面的输入 } void wait_1_1 (void)//此函数用于输出用户输入提示 { system("cls");//清屏 printf ("\n"); printf ("*******************************************************************************\n"); printf ("你好欢迎使用\n请输入学生名字按回车结束......"); } void getchar_1_2 (struct student * p1)//此函数用于输入学生性别 { wait_1_2 ();//输出输入提示 fflush(stdin);//清空磁盘缓冲区 scanf ("%s", &(p1->sex));//输入学生性别 printf ("%s", p1->sex);//将先前用户的输入输出是用户发现输入错误后及时更改 getchar_1_3 (p1);//调用函数继续下面的输入 } void wait_1_2 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示 { printf ("\n"); printf ("*******************************************************************************\n"); printf ("你好欢迎使用\n请输入学生性别(如:男)按回车结束......"); } void getchar_1_3 (struct student * p1)//此函数用于用户输入学生数学成绩 { wait_1_3 ();//输出输入提示 fflush(stdin);//清空磁盘缓冲区 scanf ("%f", &(p1->score_1));//输入学生数学成绩 printf ("%f", p1->score_1);//将先前用户的输入输出是用户发现输入错误后及时更改 getchar_1_4 (p1);//调用函数继续下面的输入 } void wait_1_3 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示 { printf ("\n"); printf ("*******************************************************************************\n"); printf ("你好欢迎使用\n请输入学生数学成绩按回车结束......"); } void getchar_1_4 (struct student * p1)//此函数用于用户输入学生语文成绩 { wait_1_4 ();//输出输入提示 fflush(stdin);//清空磁盘缓冲区 scanf ("%f", &(p1->score_2));//输入学生语文成绩 printf ("%f", p1->score_2);//将先前用户的输入输出是用户发现输入错误后及时更改 getchar_1_5 (p1);//调用函数继续下面的输入 } void wait_1_4 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示 { printf ("\n"); printf ("*******************************************************************************\n"); printf ("你好欢迎使用\n请输入学生语文成绩按回车结束......"); } void getchar_1_5 (struct student * p1)//此函数用于用户输入学生英语成绩 { wait_1_5 ();//输出输入提示 fflush(stdin);//清空磁盘缓冲区 scanf ("%f", &(p1->score_3));//输入学生英语成绩 printf ("%f", p1->score_3);//将先前用户的输入输出是用户发现输入错误后及时更改 getchar_1_6 (p1);//调用函数继续下面的输入 } void wait_1_5 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示 { printf ("\n"); printf ("*******************************************************************************\n"); printf ("你好欢迎使用\n请输入学生英语成绩按回车结束......"); } void getchar_1_6 (struct student * p1)//此函数用于用户输入学生微机成绩 { wait_1_6 ();//输出输入提示 fflush(stdin);//清空磁盘缓冲区 scanf ("%f", &(p1->score_4));//输入学生微机成绩 printf ("%f\n", p1->score_4);//将先前用户的输入输出是用户发现输入错误后及时更改 } void wait_1_6 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示 { printf ("\n"); printf ("*******************************************************************************\n"); printf ("你好欢迎使用\n请输入学生计算机成绩按回车结束......"); } void endschar (void)//无用函数请忽略他吧 为了好看而已 { printf ("\n*******************************************************************************\n"); } void hello_1 (void)//此函数用于输出学生信息输入完一组后的选项让用户选择 { printf ("上一位学生信息输入完毕\n"); printf ("1.继续输入\n"); printf ("2.更改先前输入(只能更改最后一次输入 谢谢 如需改写前面请回主菜单)\n"); printf ("3.将先前输入的学生信息输出\n"); printf ("4.回主菜单\n"); printf ("*******************************************************************************\n"); printf ("请选择........"); } void getchar_1_x (void)//此函数用于让用户输入hello_1的选择并且判断 { int a;//定义变量a用于存储用户的输入 fflush(stdin);//清空磁盘缓冲区 scanf ("%d", & a);//输入整数的用户选择 for (;1;)//判断用户输入如果正确就进行调用用户选择功能否则提示用户出错并重新输入 { if (a>4) { a = judge_no ();//调用函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值 } else if (a<1) { a = judge_no ();//调用函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值 } else { system("cls");//清屏 break; } } judge_1_x (a); } void judge_1_x (int a)//此函数用于对用户的正确输入进行判断调用用户选择的功能(第一分菜单) { int b;//定义变量b用于储存用户正确输入的值 switch (a)//用于调用用户选择 { case 1: { goto_1 ();//调用函数用于用户的继续输入 break; } case 2: { changes_1_x ();//调用函数用于用户更改先前的输入 break; } case 3: { putchar_1 ();//调用函数用于输出用户先前输出的值 break; } default : { save_1 ();//调用函数用于储存信息 b = wait_2 ();//调用函数用于输出主菜单然后调用函数 bigan_1 (b);//调用函数用于对用户的正确输入进行判断调用用户选择的功能(主菜单) } } } void goto_1 ()//继续输入 { p2 = godis ();//调用函数使其生成一个结构体 p1->next = p2;//将上一个结构体与生成的结构体连接 p1 = p2;//将上一个结构体的指针换到下一个结构体 p1->number = ++i;//学号自加免去用户操作麻烦 getchar_1_1 (p1);//调用函数用于输入姓名函数 (此处采用连续调用输入方便阅读) endschar ();//调用函数输出无用请忽略 hello_1 ();//调用函数用于输出学生信息输入完一组后的选项让用户选择 getchar_1_x ();//调用函数用于让用户输入hello_1的选择并且判断 } void changes_1_x ()//此函数用于更改先前用户输入的数据 { getchar_1_1 (p2);//调用函数用于输入姓名函数 (此处采用连续调用输入方便阅读) hello_1 ();//调用函数用于输出学生信息输入完一组后的选项让用户选择 getchar_1_x ();//调用函数用于让用户输入hello_1的选择并且判断 } void putchar_1 ()//输出 { int j = 0;//定义变量j用于后面for循环的使用 i-1 为实际链表长度 struct student * p; p = head;//使指针归于头指针 for (;j<=i-1;)//循环直到最后一个链表结束 { printf ("学号:%d \n姓名:%s \n性别:%s \n数学成绩:%f \n语文成绩:%f \n英语成绩:%f \n计算机成绩:%f\n",p->number,p->name,p->sex,p->score_1,p->score_2,p->score_3,p->score_4); endschar ();//调用函数输出无用请忽略 p = p->next;//使指针p1指向下一个元素 j++;//j自加 } fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面 hello_1 ();////调用函数用于输出学生信息输入完一组后的选项让用户选择 getchar_1_x ();//调用函数用于让用户输入hello_1的选择并且判断 } void game_2 (void) {} void game_3 (void) {} void game_4 (void) {} void game_5 (void) {} void esc_esc (void) { printf ("\n\n退出中......"); } void save_1 (void)//此函数用于函数用于储存信息 {} void read_1 (void)//此函数用于读取原来程序所保存的值 如果未保存 此函数可以忽略 {}