友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
魔刊电子书 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言设计-第34章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



【例 11。8】分配一块区域,输入一个学生数据。
main()

    struct stu
    {
      int num;
      char *name;
      char sex;
      float score;
    }  *ps;
    ps=(struct stu*)malloc(sizeof(struct stu));

    ps…》num=102;
    ps…》name=〃Zhang ping〃;
    ps…》sex='M';
    ps…》score=62。5;
    printf(〃Number=%dnName=%sn〃;ps…》num;ps…》name);
    printf(〃Sex=%cnScore=%fn〃;ps…》sex;ps…》score);
    free(ps);


本例中,定义了结构 stu,定义了 stu 类型指针变量 ps。然后分配一块 stu 大内存区,
并把首地址赋予 ps,使 ps 指向该区域。再以 ps 为指向结构的指针变量对各成员赋值,并用
printf 输出各成员值。最后用 free 函数释放 ps 指向的内存空间。整个程序包含了申请内存
空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。
11。9 链表的概念
在例 7。8 中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用
来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少块内存
空间,也就是说要建立多少个结点。当然用结构数组也可以完成上述工作,但如果预先不能
准确把握学生人数,也就无法确定数组大小。而且当学生留级、退学之后也不能把该元素占
用的空间从数组中释放出来。
用动态存储的方法可以很好地解决这些问题。有一个学生就分配一个结点,无须预先确
定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约
了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分
配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。 即
在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把
它称为指针域。
可在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域内又存放
第三个结点的首地址,如此串连下去直到最后一个结点。最后一个结点因无后续结点连接,
其指针域可赋为 0。这样一种连接方式,在数据结构中称为“链表”。
下图为最一简单链表的示意图。
图中,第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个
指针变量。以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,
姓名 name,性别 sex 和成绩 score 等。另一个域为指针域,存放下一结点的首地址。链表中
的每一个结点都是同一种结构类型。
例如,一个存放学生学号和成绩的结点应为以下结构:
    struct stu
    { int num;
      int score;

      struct stu *next;

前两个成员项组成数据域,后一个成员项 next 构成指针域,它是一个指向 stu 类型结构
的指针变量。
链表的基本操作对链表的主要操作有以下几种:
1。 建立链表;
2。 结构的查找与输出;
3。 插入一个结点;
4。 删除一个结点;
下面通过例题来说明这些操作。
【例 11。9】建立一个三个结点的链表,存放学生数据。为简单起见, 我们假定学生数据结
构中只有学号和年龄两项。可编写一个建立链表的函数 creat。程序如下:
    #define NULL 0
    #define TYPE struct stu
    #define LEN sizeof (struct stu)
    struct stu
        {
          int num;
          int age;
          struct stu *next;
        };
    TYPE *creat(int n)
    {
        struct stu *head;*pf;*pb;
        int i;
        for(i=0;inum;&pb…》age);
          if(i==0)
          pf=head=pb;
          else pf…》next=pb;
          pb…》next=NULL;
          pf=pb;
        }
        return(head);
    }
在函数外首先用宏定义对三个符号常量作了定义。这里用 TYPE 表示 struct stu,用 LEN
表示 sizeof(struct stu)主要的目的是为了在以下程序内减少书写并使阅读更加方便。结构
stu 定义为外部类型,程序中的各个函数均可使用该定义。
creat 函数用于建立一个有 n 个结点的链表,它是一个指针函数,它返回的指针指向 stu
结构。在 creat 函数内定义了三个 stu 结构的指针变量。head 为头指针,pf 为指向两相邻结
点的前一结点的指针变量。pb 为后一结点的指针变量。

11。10 枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七
天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或
其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型
的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。
应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为
任何基本类型。
11。10。1 枚举类型的定义和枚举变量的说明
1。 枚举的定义枚举类型定义的一般形式为:
enum 枚举名{ 枚举值表 };
在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
例如:
该枚举名为 weekday,枚举值共有 7 个,即一周中的七天。凡被说明为 weekday 类型变
量的取值只能是七天中的某一天。
2。 枚举变量的说明
如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定
义说明或直接说明。
设有变量 a;b;c 被说明为上述的 weekday,可采用下述任一种方式:
enum weekday{ sun;mou;tue;wed;thu;fri;sat };
enum weekday a;b;c;
或者为:
enum weekday{ sun;mou;tue;wed;thu;fri;sat }a;b;c;
或者为:
enum { sun;mou;tue;wed;thu;fri;sat }a;b;c;
11。10。2 枚举类型变量的赋值和使用
枚举类型在使用中有以下规定:
1。 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
  例如对枚举 weekday 的元素再作以下赋值:
    sun=5;
mon=2;
sun=mon;
都是错误的。
2。 枚举元素本身由系统定义了一个表示序号的数值,从 0 开始顺序定义为 0,1,2…。
如在 weekday 中,sun 值为 0,mon 值为 1,…;sat 值为 6。
【例 11。10】
main(){

    enum weekday
    { sun;mon;tue;wed;thu;fri;sat } a;b;c;
    a=sun;
    b=mon;
    c=tue;
    printf(〃%d;%d;%d〃;a;b;c);


说明:
只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
    a=sum;
b=mon;
是正确的。而:
    a=0;
b=1;
是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
如:
    a=(enum weekday)2;
其意义是将顺序号为 2 的枚举元素赋予枚举变量 a,相当于:
    a=tue;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。
【例 11。11】
main(){
    enum body
    { a;b;c;d } month'31';j;
    int i;
    j=a;
    for(i=1;id) j=a;
    }
    for(i=1;i
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!