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

c语言设计-第18章

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



      char *name;
      char sex;
      float score;
    } boy1;boy2;
    boy1。num=102;
    boy1。name=〃Zhang ping〃;
    printf(〃input sex and scoren〃);
    scanf(〃%c %f〃;&boy1。sex;&boy1。score);
    boy2=boy1;
    printf(〃Number=%dnName=%sn〃;boy2。num;boy2。name);
    printf(〃Sex=%cnScore=%fn〃;boy2。sex;boy2。score);


本程序中用赋值语句给 num 和 name 两个成员赋值,name 是一个字符串指针变量。用 scanf
函数动态地输入 sex 和 score 成员值,然后把 boy1 的所有成员的值整体赋予 boy2。最后分
别输出 boy2 的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。
11。5 结构变量的初始化
和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。
【例 11。2】对结构变量初始化。
main()

    struct stu    /*定义结构*/
    {
      int num;
      char *name;
      char sex;
      float score;
    }boy2;boy1={102;〃Zhang ping〃;'M';78。5};
 boy2=boy1;

 printf(〃Number=%dnName=%sn〃;boy2。num;boy2。name);
 printf(〃Sex=%cnScore=%fn〃;boy2。sex;boy2。score);


本例中,boy2;boy1 均被定义为外部结构变量,并对 boy1 作了初始化赋值。在 main 函
数中,把 boy1 的值整体赋予 boy2,然后用两个 printf 语句输出 boy2 各成员的值。
11。6 结构数组的定义
数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都
是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据
结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。
方法和结构变量相似,只需说明它为数组类型即可。
例如:
struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
}boy'5';
定义了一个结构数组 boy,共有 5 个元素,boy'0'~boy'4'。每个数组元素都具有 struct
stu 的结构形式。对结构数组可以作初始化赋值。
例如:
struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
    }boy'5'={
             {101;〃Li ping〃;〃M〃;45};
             {102;〃Zhang ping〃;〃M〃;62。5};
             {103;〃He fang〃;〃F〃;92。5};
             {104;〃Cheng ling〃;〃F〃;87};
             {105;〃Wang ming〃;〃M〃;58};

当对全部元素作初始化赋值时,也可不给出数组长度。
【例 11。3】计算学生的平均成绩和不及格的人数。
struct stu

    int num;
    char *name;

    char sex;
    float score;
}boy'5'={
          {101;〃Li ping〃;'M';45};
          {102;〃Zhang ping〃;'M';62。5};
          {103;〃He fang〃;'F';92。5};
          {104;〃Cheng ling〃;'F';87};
          {105;〃Wang ming〃;'M';58};
        };
main()

    int i;c=0;
    float ave;s=0;
    for(i=0;iname);
    printf(〃Sex=%cnScore=%fnn〃;pstu…》sex;pstu…》score);


    本例程序定义了一个结构 stu,定义了 stu 类型结构变量 boy1 并作了初始化赋值,还定
义了一个指向 stu 类型结构的指针变量 pstu。在 main 函数中,pstu 被赋予 boy1 的地址,因
此 pstu 指向 boy1。然后在 printf 语句内用三种形式输出 boy1 的各个成员值。从运行结果
可以看出:
结构变量。成员名
(*结构指针变量)。成员名
结构指针变量…》成员名
这三种用于表示结构成员的形式是完全等效的。
11。7。2 指向结构数组的指针
指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结
构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地
址。
设 ps 为指向结构数组的指针变量,则 ps 也指向该结构数组的 0 号元素,ps+1 指向 1 号
元素,ps+i 则指向 i 号元素。这与普通数组的情况是一致的。
【例 11。6】用指针变量输出结构数组。
struct stu

    int num;

    char *name;
    char sex;
    float score;
}boy'5'={
          {101;〃Zhou ping〃;'M';45};
          {102;〃Zhang ping〃;'M';62。5};
          {103;〃Liou fang〃;'F';92。5};
          {104;〃Cheng ling〃;'F';87};
          {105;〃Wang ming〃;'M';58};
        };
main()

 struct stu *ps;
 printf(〃NotNametttSextScoretn〃);
 for(ps=boy;psnum;ps…》name;ps…》sex;ps…》score);


在程序中,定义了 stu 结构类型的外部数组 boy 并作了初始化赋值。在 main 函数内定义
ps 为指向 stu 类型的指针。在循环语句 for 的表达式 1 中,ps 被赋予 boy 的首地址,然后循
环 5 次,输出 boy 数组中各成员值。
应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,
但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的
赋值是错误的。
ps=&boy'1'。sex;
而只能是:
    ps=boy;(赋予数组首地址)
或者是:
ps=&boy'0';(赋予 0 号元素首地址)
11。7。3 结构指针变量作函数参数
在 ANSI C 标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员
逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效
率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形
参的只是地址,从而减少了时间和空间的开销。
【例 11。7】计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。
struct stu

    int num;
    char *name;
    char sex;
    float score;}boy'5'={

        {101;〃Li ping〃;'M';45};
        {102;〃Zhang ping〃;'M';62。5};
        {103;〃He fang〃;'F';92。5};
        {104;〃Cheng ling〃;'F';87};
        {105;〃Wang ming〃;'M';58};
      };
main()

    struct stu *ps;
    void ave(struct stu *ps);
    ps=boy;
    ave(ps);

void ave(struct stu *ps)

    int c=0;i;
    float ave;s=0;
    for(i=0;iscore;
        if(ps…》scorenum=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(i0)
          pf=head=pb;
          else pf…》next=pb;
          pb…》next=NULL;
          pf=pb;
        }
        return(head);
    }
在函数外首先用宏定义对三
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!