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

原创 2002年10月14日 09:36:00

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个字节;longfloat型变量占4个字节;double型变量占8个字节。

本题定义了3int型变量,所以选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.  设置两个指针变量p1p2 , 使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

 

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

 

 

 

 

 

                                                    

C语言题目-结构体基础题

1438 计算总分 Time Limit : 1000 MS | Memory Limit : 32768 KB Submits : 295 | Solved : 112 D...
  • xindada559
  • xindada559
  • 2016年12月20日 16:07
  • 638

对C语言结构体知识点的学习以及复习相关基础知识

(一)结构体数组#include struct student{  int number;  char name[10];/*注意字符变量的定义,是定义成字符变量,还是字符串变量呢?char name...
  • songkexin
  • songkexin
  • 2007年11月01日 09:23
  • 2013

C语言零碎知识点总结(结构体)

关于变量的含义:变量可以看成一段人文化的内存空间,a = 10是将10赋值给了a所代表的内存空间。 sizeof()是一个关键字,计算一个变量或类型所占的内存空间,计算栈上的内存空间。 struct ...
  • buzhbuzh
  • buzhbuzh
  • 2016年11月14日 15:57
  • 234

黑马程序员——C语言基础——结构体相关练习

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 今天整理了C语言基础学习过程中对结构体的一些知识,下面是代码片段:...
  • Elors
  • Elors
  • 2015年06月02日 21:28
  • 491

C语言经典算法100例-071-练习使用结构体

我们这里创建一个学生结构体,包括他的id,姓名,
  • mrbourne
  • mrbourne
  • 2014年05月07日 12:01
  • 636

C语言结构体的字节对齐实例【C语言笔试题】

一、笔试题目:在一个64位的操作系统中定义如下结构体: struct st_task { uint16_t id; uint32_t value; uint64_t time...
  • u010552731
  • u010552731
  • 2015年08月10日 20:11
  • 1073

C语言中结构体指针的定义和引用

这篇文章是九九年写的,这篇文章适合中级程序员。有不明白之处不要紧,多看几遍,然后花些时间上机操作及认真思考每个问题。遇到难题要研究、解决,难题出现于哪里?该用什么方式来解决?为什么要选择这个方式解决?...
  • yiziweiyang
  • yiziweiyang
  • 2016年08月14日 19:44
  • 2011

为什么链表操作过程中对于结构体指针,都要用malloc来开辟内存空间

int a=0和int a区别 前者是在内存中开辟了一块叫做a的内存空间,里面存放0;后者表示将要开辟内存空间了,但是还没有开辟 简单的说,int a=0相当于建了一座仓库,然后再里面装了货物 ...
  • qqyuanhao163
  • qqyuanhao163
  • 2015年05月24日 12:30
  • 3533

C语言数据结构——链表解决在结构体中的数据存储问题

在C语言中常常遇到动态数据存储和处理的情况,通常我们可以通过数组和malloc等函数进行开辟内存进行处理。虽然这种方式可以处理动态数据,但是有一个很明显的缺点就是存在内存泄漏问题。在开辟的内存空间一般...
  • cai2016
  • cai2016
  • 2016年05月29日 18:45
  • 1983

C语言之结构体、枚举、预处理和static,extern关键字 易错知识点

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1.   结构体 数组和结构体的区别:   数组:只能由多个相同类型的数据构成   结构体...
  • liuyang11908
  • liuyang11908
  • 2015年05月20日 18:44
  • 541
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言结构体部分--知识点及试题
举报原因:
原因补充:

(最多只允许输入30个字)