数据结构中用到的 C语言基本知识

《数据结构》中必要的C 语言基本知识

有必要将数据结构所必须使用的C 语言语法在此做简单介绍。根据多年教学实践,学生完成上机实验练习时遇到的主要问题是,不能正确的输入数据,结构体概念陌生,函数的传址调用概念不清,指针与链表有的没有学过。由于篇幅所限,这里仅对前三个问题加以介绍。如果学生基础好,可以越过这一部分内容不看。

一、基本输入和输出

对于重要的数据结构算法,均要求进行上机实验。而上机实践中离不开数据的输入/输出。看起来简单的输入/输出,往往是上机实验最容易出错的地方,尤其是输入。对于一个算法程序,如果数据不能正确输入,算法设计得再好也无法正常运行。

1. 输入

C 语言的输入是由系统提供的scanf()等函数实现, 在程序的首部一般要求写入: # include

因为标准输入/输出函数都存在于头文件 stdio.h 之中,现将其包含进来方可使用这些常用的输入/输出函数。有的系统允许不使用上述包含语句,可以直接使用标准输入/输出函数。

函数scanf()的功能很丰富,输入格式也是多种多样,这是大家较为熟悉的知识,这里不做详细介绍。在使用中需要注意以下几个问题。

(1) 一条scanf()语句有多个变量、并且都是数值型(int, float, double)时,在输入数

据时应该在一行之内键入多个数据,数据之间空格分隔。例如:

int n; float x;

scanf (“%d %f ” , &n, &x);

正确的输入应是:整数 空格 实数 回车。例如:

就是在两个数据之间使用空格键为分隔符,最后打回车键。

如果语句中在%d 和%f 之间有一个逗号:

scanf (“%d ,%f ” , &n, &x);

正确的输入应是:整数 逗号 实数 回车。例如:

100,3.14

(2) 在需要字符型变量或字符串输入时,要单独写一条输入语句,这样不易出错。 如果在同一条scanf()语句中将字符型和数值型混合输入常常会出错。因为键盘输入时在数值型数据之间‘空格键’起‘分隔符’作用,但是在字符或字符串之间,‘空格’会被当做一个字符,而不能起到‘分隔符’的作用。所以将它们混在一起容易出错。

(3)在scanf()语句中变量写法应该是该变量的地址,这一点常被忽视。 请看下列程序:

1: viod main()

2: { char name[10], ch ;

3: int num; float x;

4: printf(“\n 请输入姓名:”); scanf(“%s”, name);

5: printf(“\n 请输入性别:”); scanf(“%c”, &ch);

6: printf(“\n 请输入学号和成绩:”); scanf(“ %d%f”, &n, &x);

……;

}

为了方便说明问题程序中加了行号,运行时当然不允许行号。一般情况下在scanf()语句中的变量名之前要加上求地址符&,上述程序第5,6行之中就是这样。为什么第4行的name 前面不加&呢?因为name 代表字符串,即是一维字符数组,一维数组名本身就是一个地址,是该数组的首地址,所以name 前面不加&。

在本程序中把字符串、字符、数值型变量分别写入不同的scanf()语句,输入数据的具体形式如下:

请输入姓名:ZhangHua

请输入性别:v

请输入学号和成绩:101 90.5

请考虑如果姓名输入成:Zhang Hua ,会出现什么现象?那样只会读入Zhang 做姓名,而Hua 被忽略,还会影响后面的输入语句无法正确读入数据。

因此,应该充分重视数据的输入技术。

2. 输出

C 语言的输出是由系统提供的printf()等函数来实现, 在程序的首部一般要求写入: # include

因为标准输入/输出函数都存在于头文件 stdio.h 之中,现将其包含进来方可使用这些常用的输入/输出函数。有的系统允许不使用上述包含语句,可以直接使用标准输入/输出函数。

输出函数printf()的语法一般容易掌握,这里强调的是怎样合理巧妙的使用它。

1. 在连续输出多个数据时,数据之间一定要有间隔,不能连在一起。

int n=10, m=20, p=30;

printf(“\n %d%d%d”,n,m,p);

printf(“\n %6d%6d%6d”,n,m,p); //提倡使用的语句

第一行输出是: 102030

第二行输出是: 10 20 30

2. 在输入语句scanf()之前先使用printf()输出提示信息,但是在printf()最后不能使用换

行符。

int x;

printf(“\n x=?”); //句尾不应使用换行符

scanf( “%d”,&x);

这样使光标与提示信息出现在同一行上,光标停在问号后边:X=?□ 。

3. 在该换行的地方,要及时换行。

int i;

printf(“数据输出如下:\n”); // 需要换行

for (i=0; i

4. 在调试程序时多加几个输出语句,以便监视中间运行状况。程序调式成功后,再去掉这些辅助输出语句。

二、函数与参数传递

函数的设计和调用是程序设计必不可少的技能,是程序设计最重要的基础。一些初学者之之所以感到编程难,就是忽视了这个基础。在传统的面向过程的程序设计中,往往提倡模块化结构化程序设计,不论BASIC 、 FONFTRAN 、PASCAL 还是其他高级语言,最终要涉及到子函数的设计和使用。

C 语言的源程序是由一个主函数和若干(或零个)子函数构成,函数是组成C 语言程序的基本单位。函数具有相对独立的功能,可以被其他函数调用,也可调用其他函数。当函数直接或间接的调用自身时,这样的函数称为递归函数。

是否能够熟练的设计和使用函数,是体现一个人程序设计能力高低的基本条件。因此有必要回顾和复习C 语言函数的基本概念。

1函数的设计

函数设计的一般格式是:

类型名 函数名(形参表)

{ 函数体;}

函数设计一般是处理一些数据获得某个结果,因此函数可以具有返回值,上面的类型名就是函数返回值的类型,可以是int, float…..等。例如:

float funx(形参表){ 函数体;.}

函数也可无返回值,此时类型是void 。例如:

void funy(形参表){ 函数体;}

而函数体内所需处理的数据往往通过形参表传送,函数也可以不设形参表,此时写为:

类型名 函数名(void ){ 函数体;}

例1.2 设计一个函数计算三个整数之和,再设计一个函数仅输出一条线。设计主函数调用两个函数。

#include

int sumx (int a, int b, int c) /* 计算三个整数之和的函数 */

{ int s;

s=a+b+c;

return s;

}

void display(void) /* 输出一条线的函数 */

{ printf(”----------------------\n“);

}

void main( )

{ int x,y , z ,sa;

x=y=z=2;

display(); /* 画一条线 */

printf(“\n sum=%d”,sumx(x,y,z)); /* 在输出语句中直接调用函数sumx( ) */

printf(“\n %6d%6d%6d”,x,y,z);

display();

x=5; y=6; z=7;

sa=sumx(x, y, z); /* 在赋值语句中调用函数sumx( ) */

printf(“\n “ sum=%d”,sa);

printf(“\n %6d%6d%6d”,x,y,z);

display();

} /* 程序结束 */

运行结果:

----------------------

sum= 6

2 2 2

----------------------

sum=48

15 16 17

----------------------

2. 关于函数的参数传递

函数在被调用时,由主调程序提供实参,将信息传递给形参。在调用结束后,有时形参可以返回新的数据给主调程序。这就是所谓参数传递。各种算法语言实现参数传递的方法通常分为传值和传址两大类。

在上例中函数sumx()的设计和主函数对它的调用,就是传值调用。第一、第二次调用,带入的实参均是三个整型变量。调用函数返回后,在主程序中输出实参的值仍与调用之前相同。传值调用的主要特点是数据的单向传递,由实参通过形参将数据代入被调用函数,不论在调用期间形参值是否改变,调用结束返回主调函数之后,实参值都不会改变。

在不同的算法语言中,传址调用的语法有所不同。在PASCAL 语言中用变参实现传址。在C 语言中采用指针变量做形参来实现传址。传址调用的主要特点是可以实现数据双向传递,在调用时实参将地址传给形参,该地址中的数据代入被调用函数。如果在调用期间形参值被改变,也即该地址中的数据发生变化,调用结束返回主调函数之后,实参地址仍然不变,但是该地址中的数据发生相应改变。这就是数据的双向传递。现看一例题:

例1.3 设计一个函数实现两个数据的交换,在主程序中调用。

#include

viod swap( int *a, int *b) ; /* 函数原型声明 */

void main( )

{ int x=100, y=800;

printf(“\n %6d%6d”, x, y); /* 输出原始数据 */

swap(&x, &y); /* 调用交换数据的函数swap() */

printf(“\n %6d%6d”, x ,y); /* 输出交换后的数据 */

}

viod swap( int *a, int *b)

{ int c;

c=*a; *a = *b; *b=c;

}

运行结果:

100 800

800 100

实践证明x,y 的数据在调用函数前后发生了交换变化。形参是指向整形的指针变量a 和b ,在函数体内需要交换的是指针所指的存储单元的内容,因此使用*a = *b; 这样的写法。在调用时,要求实参个数、类型位置与形参一致。因为实参应该是指针地址,所以调用语句swap(&x, &y)中,实参&x,和& y代入的是整型变量x,y 的地址。在函数体内交换的是实参地址中的内容,而作为主函数变量x,y 的地址仍然没有改变。从整数交换的角度看,本例题实现了双向数据传递。若从指针地址角度看,调用前后指针地址不变。

现在回过头来看P5页[复数ADT 实现的面向过程C 语言源程序]的创建复数的函数: void creat(complex *c){ …….; c->x=x1; c->y=y1;}

在函数体中人们容易认识和习惯的写法c.x 和c.y ,也必须写成c->x和c->y。在调用该函数时,还必须将结构体变量a 求地址做实参:creat(&a)。初学者应该特别注意这一点。

如果需要在函数体中改变指针的地址,这就需要在原指针基础之上再加一级指针:

void funz( int **a){ /* 改变*a */ …}

函数调用返回后**a仍然不变,而*a发生了变化。由此可以看出C 语言的传址调用比较复杂。不如PASCAL 的变量参数简便,也不如C++的引用调用方便。

三、 结构体及运用

数据结构课程所研究的问题均运用到“结构体”。在C 语言中结构体的定义、输入/输出是数据结构程序设计的重要语法基础。定义结构体的一般格式:

struct 结构体类型名

{ 类型名1 变量名1; //数据子域

类型名2 变量名2;……

类型名n 变量名n ;

};

其中struct 是保留字。结构体类型名由用户自己命名。在使用时必须声明一个具体的结构体类型的变量,声明创建一个结构体变量的方法是:

struct 结构体类型名 结构体变量名;

例如: struct ElemType /* 定义结构体 */

{ int num; char name[10];

} ;

struct ElemType x ; /* 声明结构体变量x */

另外有一种方法使用typedef 语句定义结构体,在声明结构体变量时可以不写struct ,使得书写更加简便。例如:

typedef struct

{ int num;

char name[10];

} ElemType;

ElemType 就是一个新的类型名,并且是结构体类型名。声明变量x 的语句是: ElemType x;

一个结构体中可以包含多个数据子域。数据子域的类型名一般指基本数据类型(int char 等),也可是已经定义的另一结构体名。数据子域变量名可以是简单变量,也可以是数组。它们也可以称为结构体的数据成员。

通过“结构体变量名. 数据子域” 可以访问数据子域。

例1.6 设计Student 结构体,在主程序中运用。

#include

#include

typedef struct /* 定义结构体Student */

{ long num; /* 学号 */

int x; /* 成绩 */

char name[10]; /* 姓名 */

} Student;

void main( )

{ Student s1; /* 声明创建一个结构体变量s1 */

s1.num=1001 ; /* 为s1的数据子域提供数据 */

s1. x=83;

strcpy( s1.name, “ 李 明”) ;

printf( “\n 姓名: %s”, s1.name); /* 输出结构体变量s1 的内容 */

printf( “\n 学号: %d”, s1.num);

printf( “\n 成绩: %d”, s1.x);

}

或者使用键盘输入:

{ scanf(“%d”, s1.num);

scanf(“%d”, s1.x);

scanf(“%s”, s1.name);

}

还可以通过“结构体指针->数据子域” 来访问数据域。在实际问题中还会使用到指向结构体的指针,通过以下语句段可以说明结构体指针的一般用法。

{ Student *p; /* 声明指针变量p */

p=( Student *) malloc(sizeof( Student)); /* 分配存储单元,首地址赋给p 指针 */ p->num=101; p->x=83; strcpy( p->name, “李 明 ”);

printf(“\n %10s%6d%6d”,p->name,p->num,p->x);

}

设计一个一维数组,每个数组元素是Student 结构体类型,通过以下语句段可以说明结构体数组的一般用法。可以通过“结构体数组名[下标].数据子域”访问数据域。

{ Student a[5]; /* 声明创建一个结构体数组a */ int i ;

for( i=0, i

printf(“\n 学号:%d”,a[i].num) ;

printf(“\n 姓名:%s”,a[i].name) ;

printf(“\n 成绩:%d”,a[i].x) ;

}

}

以上是关于结构体的基本概念和简单运用。

《数据结构》中必要的C 语言基本知识

有必要将数据结构所必须使用的C 语言语法在此做简单介绍。根据多年教学实践,学生完成上机实验练习时遇到的主要问题是,不能正确的输入数据,结构体概念陌生,函数的传址调用概念不清,指针与链表有的没有学过。由于篇幅所限,这里仅对前三个问题加以介绍。如果学生基础好,可以越过这一部分内容不看。

一、基本输入和输出

对于重要的数据结构算法,均要求进行上机实验。而上机实践中离不开数据的输入/输出。看起来简单的输入/输出,往往是上机实验最容易出错的地方,尤其是输入。对于一个算法程序,如果数据不能正确输入,算法设计得再好也无法正常运行。

1. 输入

C 语言的输入是由系统提供的scanf()等函数实现, 在程序的首部一般要求写入: # include

因为标准输入/输出函数都存在于头文件 stdio.h 之中,现将其包含进来方可使用这些常用的输入/输出函数。有的系统允许不使用上述包含语句,可以直接使用标准输入/输出函数。

函数scanf()的功能很丰富,输入格式也是多种多样,这是大家较为熟悉的知识,这里不做详细介绍。在使用中需要注意以下几个问题。

(1) 一条scanf()语句有多个变量、并且都是数值型(int, float, double)时,在输入数

据时应该在一行之内键入多个数据,数据之间空格分隔。例如:

int n; float x;

scanf (“%d %f ” , &n, &x);

正确的输入应是:整数 空格 实数 回车。例如:

就是在两个数据之间使用空格键为分隔符,最后打回车键。

如果语句中在%d 和%f 之间有一个逗号:

scanf (“%d ,%f ” , &n, &x);

正确的输入应是:整数 逗号 实数 回车。例如:

100,3.14

(2) 在需要字符型变量或字符串输入时,要单独写一条输入语句,这样不易出错。 如果在同一条scanf()语句中将字符型和数值型混合输入常常会出错。因为键盘输入时在数值型数据之间‘空格键’起‘分隔符’作用,但是在字符或字符串之间,‘空格’会被当做一个字符,而不能起到‘分隔符’的作用。所以将它们混在一起容易出错。

(3)在scanf()语句中变量写法应该是该变量的地址,这一点常被忽视。 请看下列程序:

1: viod main()

2: { char name[10], ch ;

3: int num; float x;

4: printf(“\n 请输入姓名:”); scanf(“%s”, name);

5: printf(“\n 请输入性别:”); scanf(“%c”, &ch);

6: printf(“\n 请输入学号和成绩:”); scanf(“ %d%f”, &n, &x);

……;

}

为了方便说明问题程序中加了行号,运行时当然不允许行号。一般情况下在scanf()语句中的变量名之前要加上求地址符&,上述程序第5,6行之中就是这样。为什么第4行的name 前面不加&呢?因为name 代表字符串,即是一维字符数组,一维数组名本身就是一个地址,是该数组的首地址,所以name 前面不加&。

在本程序中把字符串、字符、数值型变量分别写入不同的scanf()语句,输入数据的具体形式如下:

请输入姓名:ZhangHua

请输入性别:v

请输入学号和成绩:101 90.5

请考虑如果姓名输入成:Zhang Hua ,会出现什么现象?那样只会读入Zhang 做姓名,而Hua 被忽略,还会影响后面的输入语句无法正确读入数据。

因此,应该充分重视数据的输入技术。

2. 输出

C 语言的输出是由系统提供的printf()等函数来实现, 在程序的首部一般要求写入: # include

因为标准输入/输出函数都存在于头文件 stdio.h 之中,现将其包含进来方可使用这些常用的输入/输出函数。有的系统允许不使用上述包含语句,可以直接使用标准输入/输出函数。

输出函数printf()的语法一般容易掌握,这里强调的是怎样合理巧妙的使用它。

1. 在连续输出多个数据时,数据之间一定要有间隔,不能连在一起。

int n=10, m=20, p=30;

printf(“\n %d%d%d”,n,m,p);

printf(“\n %6d%6d%6d”,n,m,p); //提倡使用的语句

第一行输出是: 102030

第二行输出是: 10 20 30

2. 在输入语句scanf()之前先使用printf()输出提示信息,但是在printf()最后不能使用换

行符。

int x;

printf(“\n x=?”); //句尾不应使用换行符

scanf( “%d”,&x);

这样使光标与提示信息出现在同一行上,光标停在问号后边:X=?□ 。

3. 在该换行的地方,要及时换行。

int i;

printf(“数据输出如下:\n”); // 需要换行

for (i=0; i

4. 在调试程序时多加几个输出语句,以便监视中间运行状况。程序调式成功后,再去掉这些辅助输出语句。

二、函数与参数传递

函数的设计和调用是程序设计必不可少的技能,是程序设计最重要的基础。一些初学者之之所以感到编程难,就是忽视了这个基础。在传统的面向过程的程序设计中,往往提倡模块化结构化程序设计,不论BASIC 、 FONFTRAN 、PASCAL 还是其他高级语言,最终要涉及到子函数的设计和使用。

C 语言的源程序是由一个主函数和若干(或零个)子函数构成,函数是组成C 语言程序的基本单位。函数具有相对独立的功能,可以被其他函数调用,也可调用其他函数。当函数直接或间接的调用自身时,这样的函数称为递归函数。

是否能够熟练的设计和使用函数,是体现一个人程序设计能力高低的基本条件。因此有必要回顾和复习C 语言函数的基本概念。

1函数的设计

函数设计的一般格式是:

类型名 函数名(形参表)

{ 函数体;}

函数设计一般是处理一些数据获得某个结果,因此函数可以具有返回值,上面的类型名就是函数返回值的类型,可以是int, float…..等。例如:

float funx(形参表){ 函数体;.}

函数也可无返回值,此时类型是void 。例如:

void funy(形参表){ 函数体;}

而函数体内所需处理的数据往往通过形参表传送,函数也可以不设形参表,此时写为:

类型名 函数名(void ){ 函数体;}

例1.2 设计一个函数计算三个整数之和,再设计一个函数仅输出一条线。设计主函数调用两个函数。

#include

int sumx (int a, int b, int c) /* 计算三个整数之和的函数 */

{ int s;

s=a+b+c;

return s;

}

void display(void) /* 输出一条线的函数 */

{ printf(”----------------------\n“);

}

void main( )

{ int x,y , z ,sa;

x=y=z=2;

display(); /* 画一条线 */

printf(“\n sum=%d”,sumx(x,y,z)); /* 在输出语句中直接调用函数sumx( ) */

printf(“\n %6d%6d%6d”,x,y,z);

display();

x=5; y=6; z=7;

sa=sumx(x, y, z); /* 在赋值语句中调用函数sumx( ) */

printf(“\n “ sum=%d”,sa);

printf(“\n %6d%6d%6d”,x,y,z);

display();

} /* 程序结束 */

运行结果:

----------------------

sum= 6

2 2 2

----------------------

sum=48

15 16 17

----------------------

2. 关于函数的参数传递

函数在被调用时,由主调程序提供实参,将信息传递给形参。在调用结束后,有时形参可以返回新的数据给主调程序。这就是所谓参数传递。各种算法语言实现参数传递的方法通常分为传值和传址两大类。

在上例中函数sumx()的设计和主函数对它的调用,就是传值调用。第一、第二次调用,带入的实参均是三个整型变量。调用函数返回后,在主程序中输出实参的值仍与调用之前相同。传值调用的主要特点是数据的单向传递,由实参通过形参将数据代入被调用函数,不论在调用期间形参值是否改变,调用结束返回主调函数之后,实参值都不会改变。

在不同的算法语言中,传址调用的语法有所不同。在PASCAL 语言中用变参实现传址。在C 语言中采用指针变量做形参来实现传址。传址调用的主要特点是可以实现数据双向传递,在调用时实参将地址传给形参,该地址中的数据代入被调用函数。如果在调用期间形参值被改变,也即该地址中的数据发生变化,调用结束返回主调函数之后,实参地址仍然不变,但是该地址中的数据发生相应改变。这就是数据的双向传递。现看一例题:

例1.3 设计一个函数实现两个数据的交换,在主程序中调用。

#include

viod swap( int *a, int *b) ; /* 函数原型声明 */

void main( )

{ int x=100, y=800;

printf(“\n %6d%6d”, x, y); /* 输出原始数据 */

swap(&x, &y); /* 调用交换数据的函数swap() */

printf(“\n %6d%6d”, x ,y); /* 输出交换后的数据 */

}

viod swap( int *a, int *b)

{ int c;

c=*a; *a = *b; *b=c;

}

运行结果:

100 800

800 100

实践证明x,y 的数据在调用函数前后发生了交换变化。形参是指向整形的指针变量a 和b ,在函数体内需要交换的是指针所指的存储单元的内容,因此使用*a = *b; 这样的写法。在调用时,要求实参个数、类型位置与形参一致。因为实参应该是指针地址,所以调用语句swap(&x, &y)中,实参&x,和& y代入的是整型变量x,y 的地址。在函数体内交换的是实参地址中的内容,而作为主函数变量x,y 的地址仍然没有改变。从整数交换的角度看,本例题实现了双向数据传递。若从指针地址角度看,调用前后指针地址不变。

现在回过头来看P5页[复数ADT 实现的面向过程C 语言源程序]的创建复数的函数: void creat(complex *c){ …….; c->x=x1; c->y=y1;}

在函数体中人们容易认识和习惯的写法c.x 和c.y ,也必须写成c->x和c->y。在调用该函数时,还必须将结构体变量a 求地址做实参:creat(&a)。初学者应该特别注意这一点。

如果需要在函数体中改变指针的地址,这就需要在原指针基础之上再加一级指针:

void funz( int **a){ /* 改变*a */ …}

函数调用返回后**a仍然不变,而*a发生了变化。由此可以看出C 语言的传址调用比较复杂。不如PASCAL 的变量参数简便,也不如C++的引用调用方便。

三、 结构体及运用

数据结构课程所研究的问题均运用到“结构体”。在C 语言中结构体的定义、输入/输出是数据结构程序设计的重要语法基础。定义结构体的一般格式:

struct 结构体类型名

{ 类型名1 变量名1; //数据子域

类型名2 变量名2;……

类型名n 变量名n ;

};

其中struct 是保留字。结构体类型名由用户自己命名。在使用时必须声明一个具体的结构体类型的变量,声明创建一个结构体变量的方法是:

struct 结构体类型名 结构体变量名;

例如: struct ElemType /* 定义结构体 */

{ int num; char name[10];

} ;

struct ElemType x ; /* 声明结构体变量x */

另外有一种方法使用typedef 语句定义结构体,在声明结构体变量时可以不写struct ,使得书写更加简便。例如:

typedef struct

{ int num;

char name[10];

} ElemType;

ElemType 就是一个新的类型名,并且是结构体类型名。声明变量x 的语句是: ElemType x;

一个结构体中可以包含多个数据子域。数据子域的类型名一般指基本数据类型(int char 等),也可是已经定义的另一结构体名。数据子域变量名可以是简单变量,也可以是数组。它们也可以称为结构体的数据成员。

通过“结构体变量名. 数据子域” 可以访问数据子域。

例1.6 设计Student 结构体,在主程序中运用。

#include

#include

typedef struct /* 定义结构体Student */

{ long num; /* 学号 */

int x; /* 成绩 */

char name[10]; /* 姓名 */

} Student;

void main( )

{ Student s1; /* 声明创建一个结构体变量s1 */

s1.num=1001 ; /* 为s1的数据子域提供数据 */

s1. x=83;

strcpy( s1.name, “ 李 明”) ;

printf( “\n 姓名: %s”, s1.name); /* 输出结构体变量s1 的内容 */

printf( “\n 学号: %d”, s1.num);

printf( “\n 成绩: %d”, s1.x);

}

或者使用键盘输入:

{ scanf(“%d”, s1.num);

scanf(“%d”, s1.x);

scanf(“%s”, s1.name);

}

还可以通过“结构体指针->数据子域” 来访问数据域。在实际问题中还会使用到指向结构体的指针,通过以下语句段可以说明结构体指针的一般用法。

{ Student *p; /* 声明指针变量p */

p=( Student *) malloc(sizeof( Student)); /* 分配存储单元,首地址赋给p 指针 */ p->num=101; p->x=83; strcpy( p->name, “李 明 ”);

printf(“\n %10s%6d%6d”,p->name,p->num,p->x);

}

设计一个一维数组,每个数组元素是Student 结构体类型,通过以下语句段可以说明结构体数组的一般用法。可以通过“结构体数组名[下标].数据子域”访问数据域。

{ Student a[5]; /* 声明创建一个结构体数组a */ int i ;

for( i=0, i

printf(“\n 学号:%d”,a[i].num) ;

printf(“\n 姓名:%s”,a[i].name) ;

printf(“\n 成绩:%d”,a[i].x) ;

}

}

以上是关于结构体的基本概念和简单运用。


相关内容

  • 修辞手法一
  • 一.修辞 修辞是修饰文字词句.运用各种表现方式,使语言表达得准确.鲜明而生动有力. 1.掌握并学会运用比喻.拟人.夸张.排比.对偶.反复.设问.反问,对引用.对比.借代.反语也应有所了解. 2.能简要分析修辞方法在具体语言环境里的表达效果的作用. 二.应掌握的几种修辞方法 1.比喻 根据事物的相似点 ...

  • 软件工程文档编写指南
  • 软件文档编写指南封面格式: 封面格式:文档编号 版 本 号文档名称: 项目名称: 项目负责人:编写 校对 审核 批准 开发单位年 年 年 年月 月 月 月日 日 日 日系统规约说明书( 系统规约说明书(System Specification) )一.引言 A. 文档的范围和目的 B. 概述 1.目 ...

  • 板书的要求
  • 板书的要求 教学板书是一门"实用美学",既要"中用"也要"中看", 要能生动地体现教师对教材的深刻理解和巧妙处理,显示出教师的教学思想和教学风格.总体说来,板书应以鲜明醒目,重点突出,条理清晰,言简意赅,活泼多样为好.那么,板书设计应具有哪 ...

  • 中考语文备考宝典-----现代文品析类解析
  • 中考语文备考宝典-----现代文品析类解析 考点内涵解说 品析型考点考查的是品味与分析的能力,这是中考阅读题中包容众多.覆盖宽泛且层次较高的考点.它所考查的内容主要集中在四个方面: 1.词语品析: 2.句子品味: 3.段落理解: 4.全文探究. 常见的出题角度,从词语的角度看主要有:理解词语在具体语 ...

  • 概念隐喻的认知阐释及概念隐喻能力
  • 南通大学学报・社会科学版第23卷第3期 双月刊2007年5月出版 概念隐喻的认知阐释及概念隐喻能力 陆国君,宋建清 (南通大学外国语学院,江苏南通226007) 摘要:概念隐喻体现的是语言的概念(经验)功能.一方面,通过在词汇语法层面产生名词化,话语者可 以对所构建的经验意义(事件.关系.范畴等)进 ...

  • 英语九年级unit10教学反思
  • 英语九年级unit10教学反 本节课主要谈论发生在过去的事情,;通过讨论"发生在过去的事情"这个话题,学习过去完成时的构成和基本用法以及现在完成时和过去完成时的区别.培养学生对发生的事情进行客观评价的能力,并学习自主解决问题的能力.而本课是本单元的第一课,初步接触过去完成时,并且 ...

  • 浅论尤金·奈达的功能对等理论
  • 浅论尤金·奈达的功能对等理论 作者:丁莹 来源:<考试周刊>2014年第09期 摘 要: 本文介绍了尤金·奈达的翻译理论对中国的影响.通过介绍其功能对等理论的内涵,功能对等的评价与影响,使读者对尤金的翻译理论有更明确的把握. 关键词: 尤金·奈达 功能对等理论 翻译 尤金·奈达(Euge ...

  • 语言的认知维度主持人话语
  • 2007年第2期 总第135期 外语学刊 F ORE I G N LANG UAGE RESE ARCH 2007, No . 2 Serial No . 135 ●语言学 ○语言的认知维度 特约主持人:王寅 教授 主持人简介:王寅, 四川外语学院外国语文研究中心教授, 认知科学研究所所长, 博士生 ...

  • 教师工作量计算系统的设计
  • 第29卷增刊 福州大学学报(自然科学版) Vol. 29Supp. 文章编号:1000-2243(2001) S0-0103-05 教师工作量计算系统的设计 陈戈萍, 张春霞 (福建农林大学计算机与信息学院, 福建南平 353001) 摘要:叙述了教师工作量计算系统的设计与实现, 包括系统的必要性. ...