全国计算机等级考试二级C语言考点(完整版) 下载本文

current->data=i;/*读入的数据存入新节点的data域*/ end->next=current;/*新节点连到表尾*/ end=current;/*end指向当前表尾*/ scanf(\读入数据*/ }

end->next='\\0';/*置链表结束标志*/ return begin;/*返回表头指针*/ }

main() {

NODETYPE *head;

head=creatlist();/*调用链表建立函数,得到头节点的地址*/ }

以上creatlist()函数中,当一开始输入-1时,并不进入while循环,而直接执行循环之后的end->next='\\0';语句,这时建立的是一个“空链表“。由此可见,可用条件begin->next=='\\0'来判断链表是否为空。

7.3. 顺序访问链表中各节点的数据域

所谓“访问“,可以理解为取各节点的数据域中的值进行各种运算、修改各节点的数据域中的值等一系列的操作。 输出单向链表各节点数据域中内容的算法比较简单,只需利用一个工作指针(p),从头到尾依次指向链表中的每个节点,当指针指向某个节点时,就输出该节点数据域中的内容,直到遇到链表结束标志为止。如果是空链表,就只输出提示信息并返回调用函数。 函数如下:

void printlist(NODETYPE *head) {

NODETYPE *p;

p=head->next;/*指向头节点后的第一个节点*/ if(p=='\\0' )/*链表为空时*/ printf(“Linklist is null\\n”); else/*链表不为空时*/ {

printf(“head”); do {

printf(“->%d”,p->data);/*输出当前节点数据域中的值*/ p=p->next;/*move指向下一个节点*/

}while(p!= ′\\0′);/*未到链表尾,继续循环下去*/ }

printf(“->end\\n”); }

【注:运行实例结合上面的输入函数,请运行尝试】

7.4. 在链表中插入节点

在单向链表中插入节点,首先要确定插入的位置插入节点在指针p所指的节点之前称为“前插“,插入节点在指针p所指的节点之后称为“后插“。“前插“操作中各指针的指向

当进行前插操作时,需要3个工作指针:s指向新开辟的节点,用p指向插入的位置,q指向要插入的前趋节点。 7.5 删除链表中的节点

为了删除单向链表中的某个节点,首先要找到待删除的节点的前趋节点(即当前要删除节点的前面一个节点),然后将此前趋节点的指针域去指向待删除节点的后续节点(即当前要删除节点的下一个节点),最后释放被删除节点所占的存储空间即可。

考点8. 共用体

共用体的类型说明和变量的定义方式与结构体的类型说明和变量定义的方式完全相同。不同的是,结构体中的成员各自占有自己的存储空间,而共用体的变量中的所有成员占有同一个存储空间。可以把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。以上3个变量在内存中所占的字节数不同,但都从同一个起始地址开始存放,也就是使用覆盖技术,几个变量相互覆盖。

8.1 共用体类型的说明

共用体类型说明的一般形式为: union 共用体标识名 {

类型名1共用体成员名1; 类型名2共用体成员名2; . .

类型名n共用体成员名n; };

例如:

union example { int a; float b; char c; };

其中,union是关键字,是共用体类型的标志,example是共用体标识名。“共用体标识名“和“共用体成员名“都是由用户定义的合法标识符,按语法规定共用体标识名是可选项,在说明中可以不出现。

8.2 共用体变量的定义

和结构体相似,共用体变量的定义也可采用3种方式,一种方法如下: union un { int i; float x; }s1,s2,*p;

说明:

(1)共用体变量在定义的同时只能用第一个成员的类型的值进行初始化。 (2)“共用体“与“结构体“的定义形式相似,但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元,而共用体变量所占的内存长度等于变量中所占字节最长的成员的长度。例如,上面的共用体占4字节(因为一个实型变量占4字节)。

8.3 共用体变量中成员的引用

共用体变量中每个成员的引用方式与结构体完全相同,可以使用以下3种形式之一: (1)共用体变量名?背稍泵?。 (2)指针变量名->成员名。 (3)(*指针变量名)?背稍泵?。

共用体中的成员变量同样可参与其所属类型允许的任何操作,但在访问共用体成员时应注意:共用体变量中起作用的是最近一次存入的成员变量的值,原有成员变量的值将被覆盖。

另外,ANSI C标准允许在两个类型相同的共用体变量之间进行赋值操作。同结构体变量一样,共用体类型的变量可以作为实参进行传递,也可以传递共用体变量的地址。

第十一章 文件

考点1. C语言文件的概念

文件的概念

在此之前,所有的输入和输出只涉及到键盘和显示器。在运行C程序时,我们通过键盘输入数据并借助显示器把程序的运算结果显示出来。但是,计算机作为一种先进的数据处理工具,它所面对的数据信息量十分庞大,仅依赖于键盘输入和显示输出等方式是远远不够的。通常,解决的办法是将这些数据记录在某些介质上,利用这些介质的存储特性,携带数据或长久地保存数据。这种记录在外部介质上的数据集合称为“文件”。

在程序运行之前,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上保存起来,以后需要时再从磁盘中输入到计算机中,这就需要用到磁盘文件。

C程序把文件分为ASCII文件和二进制文件。ASCII文件又称文本文件,本章我们仅讨论通过C程序的输入输出所涉及的、存储在外部介质上的文件,这类文件通常称为“数据文件”,并以磁盘作为存储介质。

在程序中,当调用输入函数从外部文件中输入数据赋给程序中的变量时,这种操作称为“输入”或“读”;当调用输出函数把程序中的变量的值输出到外部文件中时,这种操作称为“输出”或“写”。

在C语言中,文件是一个字节流或二进制流,也就是说,对于输入输出的数据都按“数据流”的形式进行处理。输出时,系统不添加任何信息;输入时,逐一读入数据,直到遇到文件结束标志。C程序中的输入输出文件,都以数据流的形式存储在介质上。

文件输入输出方式也称“存取方式”。C语言中,文件有两种存取方式:顺序存取和直接存取。

顺序存取文件的特点是:每当“打开“文件进行读或写操作时,总是从文件的开头开始,从头到尾顺序地读写。 直接存取文件的特点是:可以通过C语言的库函数去指定开始读(写)的字节号,然后直接对此位置上的数据进行读(写)操作。

考点2. 文件类型指针

文件指针

当使用一个文件时,系统就为该文件在内存中开辟一个区域来存放该文件的相关信息,如该文件的名字、状态、位置等,这些信息都被保存到由系统定义的名为FILE的一个结构体类型的变量中。可以用该结构体类型来定义文件类型的指针变量,一般形式为: FILE *fp;

fp是一个指向FILE结构体类型的指针变量。

考点3. 文件的打开与关闭

对文件进行读写操作时,首先要解决的问题是如何把程序中读写的文件与磁盘上的实际数据文件联系起来,接着就应该“打开”文件,在使用结束之后关闭文件。

3.1 fopen()函数

ANSI C规定了标准输入输出函数库,用fopen()函数来打开一个文件,其一般的调用方式为: FILE *fp;

fp=fopen(文件名,使用文件方式); 例如: FILE *fp;

fp=fopen(“file1”,“r”);

fopen()函数中要有两个字符串作为参数。第一个字符串中包含了进行读写操作的文件名,即用来指定所要打开的文件。本例中,指定文件名为file1。第二个字符串中指定了文件的使用方式,用户可以根据这个参数来指定对文件的使用意图。本例中,使用文件的方式为“r”读入方式。

若函数调用成功,函数返回一个FILE类型的指针,赋给文件指针变量fp,从而把指针fp与文件“file1“联系起来。也就是说,调用函数后,fp指向了文件“file1”。 (1)“r“方式打开文件时,只能进行读操作,而不能进行写或其他操作,而且该文件必须已经存在。

(2)“w“方式打开文件时,只能对该文件进行写(即输出文件)操作,而不能用来向计算机中进行输入操作。如果原来不存在该文件,则在打开时新建一个以指定的名字命名的文件。如果已经存在一个以该文件名命名的文件,则将从文件的起始位置开始写起,文件原有内容将全部被删除。

(3)以“a“方式打开文件时,是向该文件的后面添加数据。如果指定的文件名不存在,系统将用在fopen()函数调用中指定的文件名建立一个新文件;如果指定文件已存在,则文件中原有的内容将保存,新的数据写在原有内容之后。

(4)以“r+“、“w+“、“a+“方式打开文件时,既可以进行读操作,同时也可以进行写操作。用“r+“方式时打开的文件必须已经存在,以便能向计算机输入数据。用“w+“方式则新建一个文件,先向此文件写数据,然后可以读此文件中的数据。用“a+“方式打开文件时,原来的文件不被删除,只是在文件尾部添加新的数据。 (5)“wb+“功能与“w+“相同,只是在随后的读和写时,可以由位置函数设置读和写的起始位置。 (6)“ab+“功能与“a+“相同,只是在文件尾部添加新的数据之后,可以由位置函数设置开始读的起始位置。

3.2 fclose()函数

在对一个文件进行读写操作后应该关闭它,以防止它再被误用。 fclose()函数的功能就是关闭文件,其一般形式为: fclose(文件指针); 例如: fclose(fp);

考点4. 文件的读写

文件打开之后,就可以对它进行读写了。

fputc()函数和fgetc()函数(putc()函数和getc()函数)

4.1 fputc()函数

该函数的功能是把一个字符写到磁盘文件上去,其一般调用形式为: fputc(c,fp);

其中c是要输出的字符,fp是文件指针。

4.2 fgetc()函数

该函数的功能是从指定的文件中读入一个字符,该文件必须是以读或读写方式打开的。其一般调用形式为: c=fgetc(fp);

fp为文件类型指针变量,fgetc()函数带回一个字符赋给c。

4.3 fread()函数和fwrite()函数

当要求一次性读写一组数据时,例如,一个实数或一个结构体变量的值,就可以使用fread()函数和fwrite()函数,它们的一般调用形式为: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp);

其中,buffer代表的是一个指针变量;size代表的是要读写的字节数;count用来指定每读写一次,输入或输出数据块的个数(每个数据块具有size个字节);fp是文件类型指针。

4.4 fscanf()函数和fprintf()函数

fscanf()函数和fprintf()函数都是格式化的读写函数,与scanf()和printf()函数作用相似,但fscanf()函数和fprintf()函数读写对象是磁盘文件上的数据。它们的一般形式如下: fscanf(文件指针,格式字符串,输入列表); fprintf(文件指针,格式字符串,输出列表);

4.5 fgets()函数

fgets()函数用来从文件中读入字符串,调用形式如下: fgets(str, n,fp);

其中str是存放字符串的起始地址,n是一个整型变量,fp是文件指针。该函数的功能是从fp指向的文件中读入n-1个字符放入以str为起始的地址单元内。如果在读完n-1个字符之前读到换行符或EOF,则结束本次读入操作。