《程序设计基础10.ppt》由会员分享,可在线阅读,更多相关《程序设计基础10.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础第十章 文件与数据存储学习目标学习目标掌握文件的基本概念掌握文件的基本概念掌握文件的基本概念掌握文件的基本概念学会使用常用的文件操作函数进行文件读写学会使用常用的文件操作函数进行文件读写学会使用常用的文件操作函数进行文件读写学会使用常用的文件操作函数进行文件读写会使用文件存储、访问和管理数据会使用文件存储、访问和管理数据会使用文件存储、访问和管理数据会使用文件存储、访问和管理数据2清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.1 文件的基本概念数据的保存与持久化数据的保存与
2、持久化在程序结束时数据仍有效在程序结束时数据仍有效在程序结束时数据仍有效在程序结束时数据仍有效文件的定义文件的定义一组相关信息的集合一组相关信息的集合一组相关信息的集合一组相关信息的集合存储于某种存储介质上存储于某种存储介质上存储于某种存储介质上存储于某种存储介质上具有某种特定格式,其中的信息也具有相同的含具有某种特定格式,其中的信息也具有相同的含具有某种特定格式,其中的信息也具有相同的含具有某种特定格式,其中的信息也具有相同的含义,需要用不同的方法存取义,需要用不同的方法存取义,需要用不同的方法存取义,需要用不同的方法存取文件结构体与文件指针文件结构体与文件指针3清华大学计算中心清华大学计算
3、中心http:/计计算算机机程程序序设设计计基基础础文件的类型顺序文件与随机文件顺序文件与随机文件顺序文件:只能顺序访问其中的信息顺序文件:只能顺序访问其中的信息顺序文件:只能顺序访问其中的信息顺序文件:只能顺序访问其中的信息 例:存储在磁带上的文件只能顺序访问例:存储在磁带上的文件只能顺序访问例:存储在磁带上的文件只能顺序访问例:存储在磁带上的文件只能顺序访问随机文件:可以随机访问文件的任一部分信息,随机文件:可以随机访问文件的任一部分信息,随机文件:可以随机访问文件的任一部分信息,随机文件:可以随机访问文件的任一部分信息,可以指定读写位置可以指定读写位置可以指定读写位置可以指定读写位置二进
4、制文件与文本文件二进制文件与文本文件文本文件:信息以字符形式存储,有分行信息,文本文件:信息以字符形式存储,有分行信息,文本文件:信息以字符形式存储,有分行信息,文本文件:信息以字符形式存储,有分行信息,阅读目标为程序员与程序阅读目标为程序员与程序阅读目标为程序员与程序阅读目标为程序员与程序二进制文件:文件以二进制码存储,无分行信息,二进制文件:文件以二进制码存储,无分行信息,二进制文件:文件以二进制码存储,无分行信息,二进制文件:文件以二进制码存储,无分行信息,阅读目标为程序阅读目标为程序阅读目标为程序阅读目标为程序4清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基
5、基础础10.2 基本文件操作文件打开与关闭操作文件打开与关闭操作文件打开与关闭操作文件打开与关闭操作 FILE*FILE*fopenfopen(const char*(const char*filenamefilename,const char*,const char*modemode););intint fclosefclose(FILE*(FILE*fpfp););文件状态与缓冲区操作文件状态与缓冲区操作文件状态与缓冲区操作文件状态与缓冲区操作 intint feoffeof(FILE*(FILE*fpfp););intint fflushfflush(FILE*(FILE*fpfp);)
6、;文件指针操作文件指针操作文件指针操作文件指针操作 void void rewindrewind(FILE*(FILE*fpfp););intint fseekfseek(FILE*(FILE*fpfp,long,long offsetoffset,intint fromwherefromwhere););long long ftellftell(FILE*(FILE*fpfp););5清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.2 基本文件操作文件读写操作文件读写操作文件读写操作文件读写操作 intint fprintffprintf(FILE*(F
7、ILE*fpfp,const char*,const char*fmtfmt,);,);intint fscanffscanf(FILE*(FILE*fpfp,const char*,const char*fmtfmt,);,);intint fgetcfgetc(FILE*(FILE*fpfp););char*char*fgetsfgets(char*(char*strstr,intint n n,FILE*,FILE*fpfp););intint putcputc(intint chch,FILE*,FILE*fpfp););char char fputsfputs(char*(char*
8、strstr,FILE*,FILE*fpfp););intint freadfread(void*(void*bufbuf,intint sizesize,intint countcount,FILE*,FILE*fpfp););intint fwritefwrite(void*(void*bufbuf,intint sizesize,intint countcount,FILE*,FILE*fpfp););6清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件打开操作函数原型函数原型FILE*FILE*fopenfopen(const char*(const
9、char*filenamefilename,const char*,const char*modemode););返回值返回值调用成功返回文件指针,调用成功返回文件指针,调用成功返回文件指针,调用成功返回文件指针,失败返回失败返回失败返回失败返回NULLNULL函数参数函数参数filenamefilename:文件名字符串,可以包含路径名文件名字符串,可以包含路径名文件名字符串,可以包含路径名文件名字符串,可以包含路径名modemode:文件打开模式文件打开模式文件打开模式文件打开模式7清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件打开模式modemode
10、:文件打开模式文件打开模式文件打开模式文件打开模式 r r:读,若文件不存在,返回读,若文件不存在,返回读,若文件不存在,返回读,若文件不存在,返回NULLNULL ww:写,若文件不存在,创建,若已存在,删除写,若文件不存在,创建,若已存在,删除写,若文件不存在,创建,若已存在,删除写,若文件不存在,创建,若已存在,删除 a a:追加,若文件不存在,创建,若已存在,添加到文件追加,若文件不存在,创建,若已存在,添加到文件追加,若文件不存在,创建,若已存在,添加到文件追加,若文件不存在,创建,若已存在,添加到文件尾部尾部尾部尾部 r r+、ww+:读写,若文件不存在,创建,若已存在,覆盖读写,
11、若文件不存在,创建,若已存在,覆盖读写,若文件不存在,创建,若已存在,覆盖读写,若文件不存在,创建,若已存在,覆盖 a a+:读与追加,若文件不存在创建,若已存在,覆盖读与追加,若文件不存在创建,若已存在,覆盖读与追加,若文件不存在创建,若已存在,覆盖读与追加,若文件不存在创建,若已存在,覆盖 b b:二进制格式二进制格式二进制格式二进制格式示示示示 例例例例“rbrb”:读模式打开二进制文件读模式打开二进制文件读模式打开二进制文件读模式打开二进制文件“ww+”+”:读写模式打开文本文件读写模式打开文本文件读写模式打开文本文件读写模式打开文本文件8清华大学计算中心清华大学计算中心http:/计
12、计算算机机程程序序设设计计基基础础文件打开示例文件打开应用文件打开应用#include#include#include#include intint mainmain()()FILE*FILE*fpfp;char char filenamefilename40,40,modemode4;4;while(1)while(1)/*/*输入文件名和打开方式输入文件名和打开方式输入文件名和打开方式输入文件名和打开方式*/*/printfprintf(“(“n nEnterEnter a filename:“);a filename:“);getsgets(filenamefilename););/*/
13、*输入文件名输入文件名输入文件名输入文件名*/*/printfprintf(“(“n nEnterEnter a mode(max 3 characters):“);a mode(max 3 characters):“);getsgets(mode mode););/*/*输入打开方式输入打开方式输入打开方式输入打开方式*/*/9清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件打开示例 /*/*打开文件打开文件打开文件打开文件*/*/if(if(fpfp=fopenfopen(filenamefilename,modemode)!=)!=NULLNULL)p
14、rintfprintf(“(“n nSuccessfulSuccessful opening%opening%s s in mode%in mode%s s.n n“,“,filenamefilename,mode mode););/*/*输出成功信息输出成功信息输出成功信息输出成功信息*/*/fclosefclose(fpfp ););/*/*关闭文件关闭文件关闭文件关闭文件*/*/elseelse fprintffprintf(stderrstderr,“,“n nErrorError opening file%opening file%s s in mode%in mode%s s.n
15、n“,“,filenamefilename,mode mode););/*/*输出不成功信息输出不成功信息输出不成功信息输出不成功信息*/*/*/*询问是否结束询问是否结束询问是否结束询问是否结束*/*/putsputs(“Enter x to exit,any other to continue.“);(“Enter x to exit,any other to continue.“);if(if(getcgetc(stdinstdin)=x)break;)=x)break;else continue;else continue;10清华大学计算中心清华大学计算中心http:/计计算算机机程
16、程序序设设计计基基础础预定义的标准文件标准文件:输入输出流标准文件:输入输出流stdinstdin:标准输入设备,一般为键盘标准输入设备,一般为键盘标准输入设备,一般为键盘标准输入设备,一般为键盘stdoutstdout:标准输出设备,一般为屏幕标准输出设备,一般为屏幕标准输出设备,一般为屏幕标准输出设备,一般为屏幕stderrstderr:标准错误输出设备,一般为屏幕标准错误输出设备,一般为屏幕标准错误输出设备,一般为屏幕标准错误输出设备,一般为屏幕stdprnstdprn:标准打印设备,一般为缺省打印机标准打印设备,一般为缺省打印机标准打印设备,一般为缺省打印机标准打印设备,一般为缺省打印
17、机stdauxstdaux:标准标准标准标准11清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件关闭操作函数原型函数原型关闭单个文件:关闭单个文件:关闭单个文件:关闭单个文件:intint fclosefclose(FILE*(FILE*fpfp););关闭除标准文件之外的所有文件:关闭除标准文件之外的所有文件:关闭除标准文件之外的所有文件:关闭除标准文件之外的所有文件:intint fcloseallfcloseall();();文件缓冲区文件缓冲区外部块设备与内部数据流间的接口(中转站)外部块设备与内部数据流间的接口(中转站)外部块设备与内部数据流间的接
18、口(中转站)外部块设备与内部数据流间的接口(中转站)清理文件缓冲区:清理文件缓冲区:清理文件缓冲区:清理文件缓冲区:intint fflushfflush(FILE*(FILE*fpfp););清理所有文件的缓冲区:清理所有文件的缓冲区:清理所有文件的缓冲区:清理所有文件的缓冲区:intint fflushallfflushall();();12清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件关闭示例将磁盘文件中的信息复制到新文件中将磁盘文件中的信息复制到新文件中#include#include void void mainmain()()FILE*FILE
19、*inin,*,*outout;char;char innameinname12,12,outnameoutname12;12;scanfscanf(“%s”,(“%s”,innameinname););scanfscanf(“%s”,(“%s”,outnameoutname););if(if(inin=fopenfopen(innameinname,“r”)=,“r”)=NULLNULL)exit(0);)exit(0);if(if(outout=fopenfopen(outnameoutname,“w”)=,“w”)=NULLNULL)exit(0);)exit(0);while(!whi
20、le(!feoffeof(inin)fputcfputc(fgetcfgetc(inin),),outout););fclosefclose(inin););fclosefclose(outout););13清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件格式化输入输出操作函数原型函数原型格式化输出:格式化输出:格式化输出:格式化输出:intint fprintffprintf(FILE*(FILE*fpfp,const char*,const char*fmtfmt,);,);格式化输入:格式化输入:格式化输入:格式化输入:intint fscanffsc
21、anf(FILE*(FILE*fpfp,const char*,const char*fmtfmt,);,);说说 明明与标准格式化输入输出函数功能基本相同与标准格式化输入输出函数功能基本相同与标准格式化输入输出函数功能基本相同与标准格式化输入输出函数功能基本相同差别:多了文件指针参数,输入源或输出目的均差别:多了文件指针参数,输入源或输出目的均差别:多了文件指针参数,输入源或输出目的均差别:多了文件指针参数,输入源或输出目的均是文件,而不是标准设备是文件,而不是标准设备是文件,而不是标准设备是文件,而不是标准设备 思考:思考:思考:思考:fprintffprintf(stdoutstdout
22、,);=,);=printfprintf();?();?14清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件格式化输出示例将用户输入的将用户输入的 5 5 个浮点数写入文件个浮点数写入文件#include#include#include#include void void clear_kbclear_kb();();intint mainmain()()FILE*FILE*fpfp;float float datadata5;5;intint countcount;char char filenamefilename20;20;putsputs(“Enter
23、 5 floating-point numerical values.“);(“Enter 5 floating-point numerical values.“);for(for(countcount=0;=0;countcount5;5;countcount+)+)scanfscanf(“%(“%f f“,&“,&datadata countcount););clear_kbclear_kb();();/*/*清除键盘缓冲区清除键盘缓冲区清除键盘缓冲区清除键盘缓冲区*/*/15清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件格式化输出示例 putsput
24、s(“Enter a name for the file.“);(“Enter a name for the file.“);getsgets(filename filename););if(if(fpfp=fopenfopen(filenamefilename,“w“)=,“w“)=NULL NULL)fprintffprintf(stderrstderr,“Error opening file%,“Error opening file%s s.“,.“,filename filename);exit(1););exit(1);/*/*将数据写入文件和标准输出设备将数据写入文件和标准输出设备
25、将数据写入文件和标准输出设备将数据写入文件和标准输出设备stdoutstdout*/*/for(for(countcount=0;=0;countcount 5;5;countcount+)+)fprintffprintf(fpfp,“,“n ndata%data%d d=%=%f f“,“,countcount,datadata countcount););fprintffprintf(stdoutstdout,“,“n ndata%data%d d=%=%f f“,“,countcount,datadata countcount););fclosefclose(fpfp ););print
26、fprintf(“(“n n“);return 0;“);return 0;/*/*清空键盘缓冲区清空键盘缓冲区清空键盘缓冲区清空键盘缓冲区*/*/void void clear_kbclear_kb()()char char junkjunk80;80;getsgets(junkjunk););16清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件格式化输入示例从文件中读取从文件中读取 5 5 个浮点数个浮点数#include#include#include#include intint mainmain()()float float f1f1,f2f2,f
27、3f3,f4f4,f5f5;FILE*;FILE*fpfp;if(if(fpfp=fopenfopen(“INPUT.TXT(“INPUT.TXT“,“r“)=“,“r“)=NULLNULL)fprintffprintf(stderrstderr,“Error opening file.,“Error opening file.n n“);exit(1);“);exit(1);fscanffscanf(fpfp,“%,“%f f%f f%f f%f f%f f“,&“,&f1f1,&,&f2f2,&,&f3f3,&,&f4f4,&,&f5f5););printfprintf(“The valu
28、es are%(“The values are%f f,%,%f f,%,%f f,%,%f f,and%,and%f f n n.“,.“,f1f1,f2f2,f3f3,f4f4,f5f5););fclosefclose(fpfp);/);/fopenfopen中文件名如带路径,须写成中文件名如带路径,须写成中文件名如带路径,须写成中文件名如带路径,须写成 return 0;/return 0;/c:input.txtc:input.txt 用双用双用双用双 表示表示表示表示 17清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件字符输入输出操作函数原型函数
29、原型字符输入:字符输入:字符输入:字符输入:intint fgetcfgetc(FILE*(FILE*fpfp););字符串输入:字符串输入:字符串输入:字符串输入:char*char*fgetsfgets(char*(char*strstr,intint n n,FILE*,FILE*fpfp););字符输出:字符输出:字符输出:字符输出:intint putcputc(intint chch,FILE*,FILE*fpfp););字符串输出:字符串输出:字符串输出:字符串输出:char char fputsfputs(char*(char*strstr,FILE*,FILE*fpfp);)
30、;说说 明明与标准字符输入输出函数功能相同与标准字符输入输出函数功能相同与标准字符输入输出函数功能相同与标准字符输入输出函数功能相同差别:多了文件指针参数,源或目的均为文件差别:多了文件指针参数,源或目的均为文件差别:多了文件指针参数,源或目的均为文件差别:多了文件指针参数,源或目的均为文件18清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件直接输入输出操作函数原型函数原型函数原型函数原型 直接输入:直接输入:直接输入:直接输入:intint freadfread(void*(void*bufbuf,intint sizesize,intint countc
31、ount,FILE*FILE*fpfp););直接输出:直接输出:直接输出:直接输出:intint fwritefwrite(void*(void*bufbuf,intint sizesize,intint countcount,FILE*FILE*fpfp););说说说说 明明明明 直接输入输出按块操作直接输入输出按块操作直接输入输出按块操作直接输入输出按块操作 freadfread()():从文件从文件从文件从文件 fpfp 中将中将中将中将 count count 块大小为块大小为块大小为块大小为 size size 的连续数据的连续数据的连续数据的连续数据读入缓冲区读入缓冲区读入缓冲区
32、读入缓冲区 bufbuf fwritefwrite()():将缓冲区将缓冲区将缓冲区将缓冲区 bufbuf 中中中中 count count 块大小为块大小为块大小为块大小为 size size 的连续数的连续数的连续数的连续数据写入文件据写入文件据写入文件据写入文件 fpfp19清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件直接输入输出示例使用使用 fread()与与 fwrite()进行直接文件访问进行直接文件访问#include#include#include#include#define#define SIZESIZE 20 20intint ma
33、inmain()()intint countcount,array1array1 SIZESIZE,array2array2 SIZESIZE;FILE*;FILE*fpfp;/*/*数组初始化数组初始化数组初始化数组初始化*/*/for(for(countcount=0;=0;countcount SIZESIZE;countcount+)+)array1array1 countcount=2*=2*countcount;/*/*打开一个二进制文件准备写入数据打开一个二进制文件准备写入数据打开一个二进制文件准备写入数据打开一个二进制文件准备写入数据*/*/if(if(fpfp=fopenfo
34、pen(“direct.txt(“direct.txt“,“,“wbwb“)=“)=NULL NULL)fprintffprintf(stderrstderr,“Error opening file.“);exit(1);,“Error opening file.“);exit(1);20清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础文件直接输入输出示例 /*/*将数组将数组将数组将数组array1array1 存入文件存入文件存入文件存入文件*/*/if(if(fwritefwrite(array1array1,sizeof(intsizeof(int),)
35、,SIZESIZE,fpfp)!=)!=SIZE SIZE)fprintffprintf(stderrstderr,“Error writing to file.“);exit(1);,“Error writing to file.“);exit(1);fclosefclose(fpfp ););/*/*以二进制读方式打开文件以二进制读方式打开文件以二进制读方式打开文件以二进制读方式打开文件*/*/if(if(fpfp=fopenfopen(“direct.txt(“direct.txt“,“,“rbrb“)=“)=NULLNULL)fprintffprintf(stderrstderr,“E
36、rror opening file.“);exit(1);,“Error opening file.“);exit(1);/*/*从文件读取数据到从文件读取数据到从文件读取数据到从文件读取数据到array2array2 中中中中*/*/if(if(freadfread(array2array2,sizeof(intsizeof(int),),SIZESIZE,fpfp)!=)!=SIZE SIZE)fprintffprintf(stderrstderr,“Error reading file.“);exit(1);,“Error reading file.“);exit(1);fclosefc
37、lose(fpfp ););/*/*同时显示两个数组同时显示两个数组同时显示两个数组同时显示两个数组*/*/for(for(countcount=0;=0;countcount SIZESIZE;countcount+)+)printfprintf(“%(“%d d t t%d d n n“,“,array1array1 countcount,array2array2 countcount););return 0;return 0;21清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.3 文件应用示例如何将链表中的信息依次存入文件,然后再如何将链表中的信息依
38、次存入文件,然后再从文件中读出这些信息,恢复为链表从文件中读出这些信息,恢复为链表/childrenlistchildrenlist.h h#include#include#include#include typedeftypedef structstruct Child float Child float heightheight;float;float weightweight;intint ageage;char char gendergender;structstruct Child*Child*nextnext;ChildNodeChildNode;void void inputCh
39、ildinputChild(ChildNodeChildNode*child child););ChildNodeChildNode*createListcreateList(intint n n););ChildNodeChildNode*createSortedListcreateSortedList(intint n n););void void printListprintList(ChildNodeChildNode*childchild););void void saveListsaveList(FILE*(FILE*fpfp,ChildNodeChildNode*child ch
40、ild););ChildNodeChildNode*getListgetList(FILE*(FILE*fpfp););22清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.3 文件应用示例/childrenlistchildrenlist.c c#include“#include“childrenlist.hchildrenlist.h“void void inputChildinputChild(ChildNodeChildNode*childchild)/结点数据输入函数结点数据输入函数结点数据输入函数结点数据输入函数 printfprintf(“Ag
41、e:“);(“Age:“);scanfscanf(“%(“%d d“,&“,&childchild ageage););getchargetchar();();printfprintf(“Gender:“);(“Gender:“);scanfscanf(“%(“%c c“,&“,&childchild gendergender););printfprintf(“Height:“);(“Height:“);scanfscanf(“%(“%f f“,&“,&childchild heightheight););printfprintf(“Weight:“);(“Weight:“);scanfsca
42、nf(“%(“%f f“,&“,&childchild weightweight););23清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.3 文件应用示例ChildNodeChildNode*createListcreateList(intint n n)/生成链表生成链表生成链表生成链表 ChildNodeChildNode*p p,*,*childchild;intint i i;/建立一个空的头结点建立一个空的头结点建立一个空的头结点建立一个空的头结点 child child=(=(ChildNodeChildNode*)*)mallocmallo
43、c(sizeof(ChildNode(sizeof(ChildNode););childchild next next=NULLNULL;/初始化指针域初始化指针域初始化指针域初始化指针域 for(for(i i=n n;i i 0;0;i i)/依次建立并向表头插入结点依次建立并向表头插入结点依次建立并向表头插入结点依次建立并向表头插入结点 /创建新结点创建新结点创建新结点创建新结点 p p=(=(ChildNodeChildNode*)*)mallocmalloc(sizeof(ChildNode(sizeof(ChildNode););inputChildinputChild(p p);
44、/);/输入数据到新结点输入数据到新结点输入数据到新结点输入数据到新结点 /将新结点插入到表头结点之后将新结点插入到表头结点之后将新结点插入到表头结点之后将新结点插入到表头结点之后 p p next next=childchild nextnext;childchild next next=p p;return return childchild;24清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.3 文件应用示例ChildNodeChildNode*createSortedListcreateSortedList(int(int n n)/生成有序链表生
45、成有序链表生成有序链表生成有序链表 ChildNodeChildNode*p p,*,*q q,*,*childchild;intint i i;child child=(=(ChildNodeChildNode*)*)mallocmalloc(sizeof(ChildNode(sizeof(ChildNode););/头结点头结点头结点头结点 childchild next next=NULLNULL;/初始化指针域初始化指针域初始化指针域初始化指针域 for(for(i i=n n;i i 0;0;i i)/依次建立并向表头插入结点依次建立并向表头插入结点依次建立并向表头插入结点依次建立并
46、向表头插入结点 p p=(=(ChildNodeChildNode*)*)mallocmalloc(sizeof(ChildNode(sizeof(ChildNode););/创建结点创建结点创建结点创建结点 inputChildinputChild(p p););/输入数据到新结点输入数据到新结点输入数据到新结点输入数据到新结点 q q=childchild;/查找新结点的插入位置查找新结点的插入位置查找新结点的插入位置查找新结点的插入位置 while(while(q q next next!=!=NULLNULL&p p age age q q nextnext age age)q q=q
47、 q nextnext;p p next next=q q nextnext;q q next next=p p;/插入新结点插入新结点插入新结点插入新结点 return return childchild;25清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.3 文件应用示例void void printListprintList(ChildNodeChildNode*childchild)/遍历并输出链表遍历并输出链表遍历并输出链表遍历并输出链表 ChildNodeChildNode*currentcurrent;currentcurrent=child
48、child;/遍历指针初始状态指向表头遍历指针初始状态指向表头遍历指针初始状态指向表头遍历指针初始状态指向表头 while(while(currentcurrent next next!=!=NULL NULL)current current=currentcurrent nextnext;/当前指针移动到下一个结点当前指针移动到下一个结点当前指针移动到下一个结点当前指针移动到下一个结点 /输出当前结点数据输出当前结点数据输出当前结点数据输出当前结点数据 printfprintf(“Age%(“Age%d d t t“,“,currentcurrent age age););printfpri
49、ntf(“Gender%(“Gender%c c t t“,“,currentcurrent gender gender););printfprintf(“Height%(“Height%f f t t“,“,currentcurrent height height););printfprintf(“Weight%(“Weight%f f n n“,“,currentcurrent weight weight););26清华大学计算中心清华大学计算中心http:/计计算算机机程程序序设设计计基基础础10.3 文件应用示例void void saveListsaveList(FILE*(FILE
50、*fpfp,ChildNodeChildNode*child child)ChildNodeChildNode*currentcurrent,*,*prepre;/遍历指针初始状态指向表头之后的数据结点遍历指针初始状态指向表头之后的数据结点遍历指针初始状态指向表头之后的数据结点遍历指针初始状态指向表头之后的数据结点 current current=childchild nextnext;while(while(current current!=!=NULL NULL)prepre=currentcurrent;current current=currentcurrent nextnext;/当