分享
 
 
 

C语言结构体部分--知识点及试题

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

C语言结构体部分--知识点及试题

结构体是一种重要的数据结构,在实践中有广泛的应用。计算机二级考试大纲对结构体部分的要求为:(1)结构体类型数据的定义方法和引用方法。(2)用指针和结构体构成链表,单向链表的建立、输出、删除与插入。下面就这些基本知识点和有关试题进行总结和解析,希望对考试有所帮助。

一、基础知识

(1) 结构体的定义

struct 结构体名 例如: struct student

{ {

成员列表 char name[20];

}变量表; int age;

char sex;

}stu1,stu2 ;

注意:结构体定义完后,别忘了分号!

也可这样定义:struct student stu1, stu2 ;

结构体数组的定义: struct student x[10];

(2) 结构体成员的访问

两种方式 : 直接访问。如:stu1. age

用指针访问。先定义指向结构体的指针:struct student *p;

然后可以通过:(*p) . 成员变量 或 p->成员变量 来访问。

(3) 关于单项链表

先了解两个函数:

内存分配函数 malloc

如:int *p; p=(int *) malloc (sizeof (int));分配一块整型大小的内存空间。

注意:malloc无返回值,分配内存时要强制类型转换。

内存释放函数 free

free ( 要释放内存的地址) ;

有关链表具体的操作请参看谭浩强的《C程序设计(第二版)》11.7节(p273)

重点了解基本思想和相关算法,其实考试时的程序根本没有书上的难。在这里我要说,重点理解有关链表插入及删除时指针移动的先后顺序问题。注意指针的保存和归位。(既头指针的保存和链表遍历时指针的归位)。这都是考试重点,相信我没错的。

二、典型试题及解析

(1) 以下程序运行的结果是_______

#include”stdio.h”

main()

{ struct date

{ int year , month , day ;

} today ;

printf(“%d\n”,sizeof(struct date));

}

A .6 B.8 C.10 D.12

解析:本题考察了不同变量在内存中所占字节的位数。现总结如下(针对TC2.0版本):char型变量占1个字节;int型变量占2个字节;long和float型变量占4个字节;double型变量占8个字节。

本题定义了3个int型变量,所以选A.

这类计算占字节大小的题,通常和联合体结合起来考。请看下例:

变量a所占内存字节数是_______

union U

{ char st[4];

int I ;

long l ;

} ;

struct A

{ int c;

union U u ;

} a ;

答案应该是6 。注意:联合体分配内存时是按照所占内存最多的一类变量的数目分配的。而不是所有变量所占内存数量的和。

特别注意:实际编程中,在没有定义结构体类型变量之前,系统是不会给结构体的成员变量分配内存的。

(2) 以下程序输出结果是_______

struct stu

{ int x ;

int *y;

} *p ;

int dt[4]={ 10 , 20 , 30 , 40 };

struct stu a[4]={50 , &dt[0] , 60 , &dt[1] , 70 , &dt[2] , 80 , &dt[3] } ;

main()

{ p=a;

printf(“%d,” , ++p->x); //语句1

printf(“%d,” , (++p)->x ); //语句2

printf(“%d\n” , ++(*p->y) ); //语句3

}

A.10 , 20 , 20 B.50 , 60 , 21 C.51 , 60 , 21 D 60 , 70 , 31

解析:这类题考察了结构体成员变量的访问以及运算符的优先级。需要注意的是“à”的优先级大于“++”和“* ”的优先级。

语句1中,先执行p->x ,得到50后再++ , 得到结果51。

语句2中,先执行(++P) ,指针移动后,取得成员变量x的值为60。

语句3中,先取得*p->y的值,即dt[1]的值,然后++ ,最后得21。

引申一下:将语句一改为 printf(“%d” , p++ ->x); 则结果变为:_______

答案是50 ,70 ,31 。好好想一下吧。下面有几道这类练习题,可以强化一下。

1. 设有以下语句:

struct st

{ int n ;

struct st *next;

} ;

static struct st a[3]={ 5 , &a[1] , 7 , &a[2] , 9 ,’\0’} , *p ;

p=&a[0];

则以下表达式的值为6的是________

A. p++ ->n B. p->n++ C. (*p) . n++ D. ++p ->n

2. 设有以下语句,则下面表达式中的值为3的是_______

struct s

{ int a1 ;

struct s *a2 ;

} ;

static struct s a[3]={1 , &a[1] , 2 , &a[2] , 3 ,&a[0] } , * ptr ;

ptr=&a[1] ;

A. ptr -> a1++ B. ptr++ ->a1 C. *ptr -> a1 D. ++ptr ->a1

3. 若有以下语句,则下面表达式的值为1002的是______

struct student

{ int age ;

int num ;

} ;

struct student stu[3]={{1001,20} , {1002,19} , {1003,21}} ;

struct student *p ;

p=stu ;

A. (p++) -> num B. (p++)->age C. (*p) . num D. (*++) . age

4. 若有以下说明和语句:

struct student

{ int age ;

int num ;

} std , *p ;

p=&std ;

则以下对结构体变量std 中成员age 的引用方式不正确的是_______

A. std . age B. p -> age C. (*p) . age D. *p . age

以上4题的答案均为 D 。

(3) 若已建立下面的链表结构,指针p ,q分别指向图中所示结点,则不能将q所指的结点插入到链表末尾的一组语句是_________

A. q->next=NULL ; p=p->next ; p->next=q ;

B. p=p->next ; q-> next=p->next ; p->next=q ;

C. p=p->next ; q->next=p ; p->next=q ;

D. p=(*p) . next ; (*q) . next=(*p) . next ; (*p) . next=q;

解析:本题就是前面提到的链表的插入及删除类问题。重点理解结点的链入和删除顺序。

既指针移动的先后顺序。做这种处理时要慎重,谨防结点丢失。本题答案是C 。

(4)下面程序实现的功能是在已定义的的考生链表中删除指定考生号的结点。请按照程序功能填空。

Struct student *delete ( head , num ) ;

Struct student *head ;

Long num ;

{ struct student *p1 , *p2;

if ( head==NULL )

{ printf (“\nlist NULL ! \n”) ;

goto end ;

}

p2=head ;

while ((num != p2 -> num )&&( _________[1]_________ ) )

{ p1=p2 ; p2= p2 ->next ; }

if ( num== p2 ->num )

{

if ( p2==head ) head=p2 ->next ;

else ________[2]___________ ;

printf (“delete : % ld\n” , num );

n=n – 1;

}

else printf ( “%ld not found ! \n “ , num ) ;

end :

return (head );

}

解析:链表的删除操作过程一般如下 :

1. 首先判断要删除结点的链表是否为空,若为空(head==NULL),则输出空表信息。

2. 设置两个指针变量p1和p2 , 使p2指向头指针head 。

3. 如果删除的结点是链表中的第一个结点时,则应将p ->next赋值给 head 。

4. 如果要删除的不是第一个结点,则使p2指向下一个结点。操作时,先将p2赋值给p1, 再将p ->next赋值给p2。这样依次使p1 , p2后移并进行比较,直到找到要删除的结点为止。

5. 找到要删除的结点时,则要完成删除结点的操作,此时将p2 ->next 赋值给p ->next即可。

答案:[1] p2 -> next != NULL [2] p1 -> next = p2 -> next

关于链表还有插入操作,输入和输出,请自己总结。

链表部分主要理解操作过程思想,考试时,出的题不是很多,但有一定难度。可以说二级考试的最高难度就是链表和指针的混合应用了。所以指针部分也要相当清楚才行。总之,要考高分,这两部分一定要拿下!

其实,这一章全称叫做“结构体与共用体”。但共用体部分出题不多(一般一两道),主要考内存分配问题,而且经常与结构体混合考察。所以一定要记住共用体的特点,这样应付考试就容易多了。

在最后,请看一道专门考”共用体”的题目:

已知下列共用体定义:

union u_type

{

int I ;

char ch ;

} temp ;

现在执行“temp . I=266 ”, temp . ch 的值为 ()

A. 266 B. 256 C. 10 D. 1

我认为,这道题可以说是共用体部分最难的考题了。能做出来当然好,一下子做不出来也没关系。(说实话,我第一次也没做出来。^_^ )哦,对了,答案是 C 。

好了,这一部分就先说到这里,如果有其他问题,欢迎交流讨论!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有