<kbd id="fugzo"></kbd>
<pre id="fugzo"></pre>
    1. <fieldset id="fugzo"><style id="fugzo"></style></fieldset>
      <center id="fugzo"></center>
    2. 哑剧盖章,电视剧折腰免费观看全集,亮剑3gp下载,秘密访客,泰剧为你着迷,古城童话,食物链无删减,大鱼海棠

      C語(yǔ)言的結(jié)構(gòu)與聯(lián)合的實(shí)例分析

      時(shí)間:2025-10-01 08:32:16 C語(yǔ)言

      C語(yǔ)言的結(jié)構(gòu)與聯(lián)合的實(shí)例分析

        引導(dǎo)語(yǔ):結(jié)構(gòu)體是由一系列具有相同類(lèi)型或不同類(lèi)型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合。以下是百分網(wǎng)小編分享給大家的C語(yǔ)言的結(jié)構(gòu)與聯(lián)合的實(shí)例分析,歡迎閱讀!

        結(jié)構(gòu)類(lèi)型定義和結(jié)構(gòu)變量說(shuō)明

        在實(shí)際問(wèn)題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類(lèi)型。例如, 在學(xué)生登記表中,姓名應(yīng)為字符型;學(xué)號(hào)可為整型或字符型; 年齡應(yīng)為整型;性別應(yīng)為字符型;成績(jī)可為整型或?qū)嵭汀?顯然不能用一個(gè)數(shù)組來(lái)存放這一組數(shù)據(jù)。 因?yàn)閿?shù)組中各元素的類(lèi)型和長(zhǎng)度都必須一致,以便于編譯系統(tǒng)處理。為了解決這個(gè)問(wèn)題,C語(yǔ)言中給出了另一種構(gòu)造數(shù)據(jù)類(lèi)型——“結(jié)構(gòu)”。 它相當(dāng)于其它高級(jí)語(yǔ)言中的記錄。

        “結(jié)構(gòu)”是一種構(gòu)造類(lèi)型,它是由若干“成員”組成的。 每一個(gè)成員可以是一個(gè)基本數(shù)據(jù)類(lèi)型或者又是一個(gè)構(gòu)造類(lèi)型。 結(jié)構(gòu)既是一種“構(gòu)造”而成的數(shù)據(jù)類(lèi)型, 那么在說(shuō)明和使用之前必須先定義它,也就是構(gòu)造它。如同在說(shuō)明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。

        一、結(jié)構(gòu)的定義

        定義一個(gè)結(jié)構(gòu)的一般形式為:

        struct 結(jié)構(gòu)名

        {

        成員表列

        };

        成員表由若干個(gè)成員組成, 每個(gè)成員都是該結(jié)構(gòu)的一個(gè)組成部分。對(duì)每個(gè)成員也必須作類(lèi)型說(shuō)明,其形式為:

        類(lèi)型說(shuō)明符 成員名;

        成員名的命名應(yīng)符合標(biāo)識(shí)符的書(shū)寫(xiě)規(guī)定。例如:

        struct stu

        {

        int num;

        char name[20];

        char sex;

        float score;

        };

        在這個(gè)結(jié)構(gòu)定義中,結(jié)構(gòu)名為stu,該結(jié)構(gòu)由4個(gè)成員組成。 第一個(gè)成員為num,整型變量;第二個(gè)成員為name,字符數(shù)組;第三個(gè)成員為sex,字符變量;第四個(gè)成員為score,實(shí)型變量。 應(yīng)注意在括號(hào)后的分號(hào)是不可少的。結(jié)構(gòu)定義之后,即可進(jìn)行變量說(shuō)明。 凡說(shuō)明為結(jié)構(gòu)stu的變量都由上述4個(gè)成員組成。由此可見(jiàn), 結(jié)構(gòu)是一種復(fù)雜的數(shù)據(jù)類(lèi)型,是數(shù)目固定,類(lèi)型不同的若干有序變量的集合。

        二、結(jié)構(gòu)類(lèi)型變量的說(shuō)明

        說(shuō)明結(jié)構(gòu)變量有以下三種方法。以上面定義的stu為例來(lái)加以說(shuō)明。

        1. 先定義結(jié)構(gòu),再說(shuō)明結(jié)構(gòu)變量。如:

        struct stu

        {

        int num;

        char name[20];

        char sex;

        float score;

        };

        struct stu boy1,boy2;

        說(shuō)明了兩個(gè)變量boy1和boy2為stu結(jié)構(gòu)類(lèi)型。也可以用宏定義使一個(gè)符號(hào)常量來(lái)表示一個(gè)結(jié)構(gòu)類(lèi)型,例如:

        #define STU struct stu

        STU

        {

        int num;

        char name[20];

        char sex;

        float score;

        };

        STU boy1,boy2;

        2. 在定義結(jié)構(gòu)類(lèi)型的同時(shí)說(shuō)明結(jié)構(gòu)變量。例如:

        struct stu

        {

        int num;

        char name[20];

        char sex;

        float score;

        }boy1,boy2;

        3. 直接說(shuō)明結(jié)構(gòu)變量。例如:

        struct

        {

        int num;

        char name[20];

        char sex;

        float score;

        }boy1,boy2;

        第三種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)名,而直接給出結(jié)構(gòu)變量。三種方法中說(shuō)明的boy1,boy2變量都具有圖1.1所示的結(jié)構(gòu)。說(shuō)明了boy1,boy2變量為stu類(lèi)型后,即可向這兩個(gè)變量中的各個(gè)成員賦值。在上述stu結(jié)構(gòu)定義中,所有的成員都是基本數(shù)據(jù)類(lèi)型或數(shù)組類(lèi)型。成員也可以又是一個(gè)結(jié)構(gòu), 即構(gòu)成了嵌套的結(jié)構(gòu)。例如,圖1.2給出了另一個(gè)數(shù)據(jù)結(jié)構(gòu)。 按圖1.2可給出以下結(jié)構(gòu)定義:

        struct date{

        int month;

        int day;

        int year;

        }

        struct{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score;

        }boy1,boy2;

        首先定義一個(gè)結(jié)構(gòu)date,由month(月)、day(日)、year(年) 三個(gè)成員組成。 在定義并說(shuō)明變量 boy1 和 boy2 時(shí), 其中的成員birthday被說(shuō)明為data結(jié)構(gòu)類(lèi)型。成員名可與程序中其它變量同名,互不干擾。結(jié)構(gòu)變量成員的表示方法在程序中使用結(jié)構(gòu)變量時(shí), 往往不把它作為一個(gè)整體來(lái)使用。

        在ANSI C中除了允許具有相同類(lèi)型的結(jié)構(gòu)變量相互賦值以外, 一般對(duì)結(jié)構(gòu)變量的使用,包括賦值、輸入、輸出、 運(yùn)算等都是通過(guò)結(jié)構(gòu)變量的成員來(lái)實(shí)現(xiàn)的。

        表示結(jié)構(gòu)變量成員的一般形式是: 結(jié)構(gòu)變量名.成員名 例如:boy1.num 即第一個(gè)人的學(xué)號(hào) boy2.sex 即第二個(gè)人的性別 如果成員本身又是一個(gè)結(jié)構(gòu)則必須逐級(jí)找到最低級(jí)的成員才能使用。例如:boy1.birthday.month 即第一個(gè)人出生的月份成員可以在程序中單獨(dú)使用,與普通變量完全相同。

        結(jié)構(gòu)變量的賦值

        前面已經(jīng)介紹,結(jié)構(gòu)變量的賦值就是給各成員賦值。 可用輸入語(yǔ)句或賦值語(yǔ)句來(lái)完成。

        [例1.1]給結(jié)構(gòu)變量賦值并輸出其值。

        main(){

        struct stu

        {

        int num;

        char *name;

        char sex;

        float score;

        } boy1,boy2;

        boy1.num=102;

        boy1.name="Zhang ping";

        printf("input sex and score ");

        scanf("%c %f",&boy1.sex,&boy1.score);

        boy2=boy1;

        printf("Number=%d Name=%s ",boy2.num,boy2.name);

        printf("Sex=%c Score=%f ",boy2.sex,boy2.score);

        }

        struct stu

        {

        int num;

        char *name;

        char sex;

        float score;

        }boy1,boy2;

        boy1.num=102;

        boy1.name="Zhang ping";

        printf("input sex and score ");

        scanf("%c %f",&boy1.sex,&boy1.score);

        boy2=boy1;

        printf("Number=%d Name=%s ",boy2.num,boy2.name);

        printf("Sex=%c Score=%f ",boy2.sex,boy2.score);

        本程序中用賦值語(yǔ)句給num和name兩個(gè)成員賦值,name是一個(gè)字符串指針變量。用scanf函數(shù)動(dòng)態(tài)地輸入sex和score成員值,然后把boy1的所有成員的值整體賦予boy2。最后分別輸出boy2 的各個(gè)成員值。本例表示了結(jié)構(gòu)變量的賦值、輸入和輸出的方法。

        結(jié)構(gòu)變量的初始化

        如果結(jié)構(gòu)變量是全局變量或?yàn)殪o態(tài)變量, 則可對(duì)它作初始化賦值。對(duì)局部或自動(dòng)結(jié)構(gòu)變量不能作初始化賦值。

        [例1.2]外部結(jié)構(gòu)變量初始化。

        struct stu /*定義結(jié)構(gòu)*/

        {

        int num;

        char *name;

        char sex;

        float score;

        } boy2,boy1={102,"Zhang ping",'M',18.5};

        main()

        {

        boy2=boy1;

        printf("Number=%d Name=%s ",boy2.num,boy2.name);

        printf("Sex=%c Score=%f ",boy2.sex,boy2.score);

        }

        struct stu

        {

        int num;

        char *name;

        char sex;

        float score;

        }boy2,boy1={102,"Zhang ping",'M',18.5};

        main()

        {

        boy2=boy1;

        ……

        }

        本例中,boy2,boy1均被定義為外部結(jié)構(gòu)變量,并對(duì)boy1作了初始化賦值。在main函數(shù)中,把boy1的值整體賦予boy2, 然后用兩個(gè)printf語(yǔ)句輸出boy2各成員的值。

        [例1.3]靜態(tài)結(jié)構(gòu)變量初始化。

        main()

        {

        static struct stu /*定義靜態(tài)結(jié)構(gòu)變量*/

        {

        int num;

        char *name;

        char sex;

        float score;

        }boy2,boy1={102,"Zhang ping",'M',18.5};

        boy2=boy1;

        printf("Number=%d Name=%s ",boy2.num,boy2.name);

        printf("Sex=%c Score=%f ",boy2.sex,boy2.score);

        }

        static struct stu

        {

        int num;

        char *name;

        char sex;

        float score;

        }boy2,boy1={102,"Zhang ping",'M',18.5};

        本例是把boy1,boy2都定義為靜態(tài)局部的結(jié)構(gòu)變量, 同樣可以作初始化賦值。

        結(jié)構(gòu)數(shù)組

        數(shù)組的元素也可以是結(jié)構(gòu)類(lèi)型的。 因此可以構(gòu)成結(jié)構(gòu)型數(shù)組。結(jié)構(gòu)數(shù)組的每一個(gè)元素都是具有相同結(jié)構(gòu)類(lèi)型的下標(biāo)結(jié)構(gòu)變量。 在實(shí)際應(yīng)用中,經(jīng)常用結(jié)構(gòu)數(shù)組來(lái)表示具有相同數(shù)據(jù)結(jié)構(gòu)的一個(gè)群體。如一個(gè)班的學(xué)生檔案,一個(gè)車(chē)間職工的工資表等。

        結(jié)構(gòu)數(shù)組的定義方法和結(jié)構(gòu)變量相似,只需說(shuō)明它為數(shù)組類(lèi)型即可。例如:

        struct stu

        {

        int num;

        char *name;

        char sex;

        float score;

        }boy[5];

        定義了一個(gè)結(jié)構(gòu)數(shù)組boy1,共有5個(gè)元素,boy[0]~boy[4]。每個(gè)數(shù)組元素都具有struct stu的結(jié)構(gòu)形式。 對(duì)外部結(jié)構(gòu)數(shù)組或靜態(tài)結(jié)構(gòu)數(shù)組可以作初始化賦值,例如:

        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",81},

        {105,"Wang ming","M",58};

        }

        當(dāng)對(duì)全部元素作初始化賦值時(shí),也可不給出數(shù)組長(zhǎng)度。

        [例1.4]計(jì)算學(xué)生的平均成績(jī)和不及格的人數(shù)。

        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',81},

        {105,"Wang ming",'M',58},

        };

        main()

        {

        int i,c=0;

        float ave,s=0;

        for(i=0;i<5;i++)

        {

        s+=boy[i].score;

        if(boy[i].score<60) c+=1;

        }

        printf("s=%f ",s);

        ave=s/5;

        printf("average=%f count=%d ",ave,c);

        }

        本例程序中定義了一個(gè)外部結(jié)構(gòu)數(shù)組boy,共5個(gè)元素, 并作了初始化賦值。在main函數(shù)中用for語(yǔ)句逐個(gè)累加各元素的score 成員值存于s之中,如score的值小于60(不及格)即計(jì)數(shù)器C加1, 循環(huán)完畢后計(jì)算平均成績(jī),并輸出全班總分,平均分及不及格人數(shù)。

        [例1.5]建立同學(xué)通訊錄

        #include"stdio.h"

        #define NUM 3

        struct mem

        {

        char name[20];

        char phone[10];

        };

        main()

        {

        struct mem man[NUM];

        int i;

        for(i=0;i  {

        printf("input name: ");

        gets(man[i].name);

        printf("input phone: ");

        gets(man[i].phone);

        }

        printf("name phone ");

        for(i=0;i  printf("%s %s ",man[i].name,man[i].phone);

        }

        本程序中定義了一個(gè)結(jié)構(gòu)mem,它有兩個(gè)成員name和phone 用來(lái)表示姓名和電話號(hào)碼。在主函數(shù)中定義man為具有mem 類(lèi)型的結(jié)構(gòu)數(shù)組。在for語(yǔ)句中,用gets函數(shù)分別輸入各個(gè)元素中兩個(gè)成員的值。然后又在for語(yǔ)句中用printf語(yǔ)句輸出各元素中兩個(gè)成員值。

        結(jié)構(gòu)指針變量

        結(jié)構(gòu)指針變量的說(shuō)明和使用一個(gè)指針變量當(dāng)用來(lái)指向一個(gè)結(jié)構(gòu)變量時(shí), 稱(chēng)之為結(jié)構(gòu)指針變量。

        結(jié)構(gòu)指針變量中的值是所指向的結(jié)構(gòu)變量的首地址。 通過(guò)結(jié)構(gòu)指針即可訪問(wèn)該結(jié)構(gòu)變量, 這與數(shù)組指針和函數(shù)指針的情況是相同的。結(jié)構(gòu)指針變量說(shuō)明的一般形式為:

        struct 結(jié)構(gòu)名*結(jié)構(gòu)指針變量名

        例如,在前面的例1.1中定義了stu這個(gè)結(jié)構(gòu), 如要說(shuō)明一個(gè)指向stu的指針變量pstu,可寫(xiě)為:

        struct stu *pstu;

        當(dāng)然也可在定義stu結(jié)構(gòu)時(shí)同時(shí)說(shuō)明pstu。與前面討論的各類(lèi)指針變量相同,結(jié)構(gòu)指針變量也必須要先賦值后才能使用。賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量, 不能把結(jié)構(gòu)名賦予該指針變量。如果boy是被說(shuō)明為stu類(lèi)型的結(jié)構(gòu)變量,則: pstu=&boy是正確的,而: pstu=&stu是錯(cuò)誤的。

        結(jié)構(gòu)名和結(jié)構(gòu)變量是兩個(gè)不同的概念,不能混淆。 結(jié)構(gòu)名只能表示一個(gè)結(jié)構(gòu)形式,編譯系統(tǒng)并不對(duì)它分配內(nèi)存空間。 只有當(dāng)某變量被說(shuō)明為這種類(lèi)型的結(jié)構(gòu)時(shí),才對(duì)該變量分配存儲(chǔ)空間。 因此上面&stu這種寫(xiě)法是錯(cuò)誤的,不可能去取一個(gè)結(jié)構(gòu)名的首地址。 有了結(jié)構(gòu)指針變量,就能更方便地訪問(wèn)結(jié)構(gòu)變量的各個(gè)成員。

        其訪問(wèn)的一般形式為: (*結(jié)構(gòu)指針變量).成員名 或?yàn)椋?/p>

        結(jié)構(gòu)指針變量->成員名

        例如: (*pstu).num或者: pstu->num

        應(yīng)該注意(*pstu)兩側(cè)的括號(hào)不可少, 因?yàn)槌蓡T符“.”的優(yōu)先級(jí)高于“*”。如去掉括號(hào)寫(xiě)作*pstu.num則等效于*(pstu.num),這樣,意義就完全不對(duì)了。 下面通過(guò)例子來(lái)說(shuō)明結(jié)構(gòu)指針變量的具體說(shuō)明和使用方法。

        [例1.6]

        struct stu

        {

        int num;

        char *name;

        char sex;

        float score;

        } boy1={102,"Zhang ping",'M',18.5},*pstu;

        main()

        {

        pstu=&boy1;

        printf("Number=%d Name=%s ",boy1.num,boy1.name);

        printf("Sex=%c Score=%f ",boy1.sex,boy1.score);

        printf("Number=%d Name=%s ",(*pstu).num,(*pstu).name);

        printf("Sex=%c Score=%f ",(*pstu).sex,(*pstu).score);

        printf("Number=%d Name=%s ",pstu->num,pstu->name);

        printf("Sex=%c Score=%f ",pstu->sex,pstu->score);

        }

        本例程序定義了一個(gè)結(jié)構(gòu)stu,定義了stu類(lèi)型結(jié)構(gòu)變量boy1 并作了初始化賦值,還定義了一個(gè)指向stu類(lèi)型結(jié)構(gòu)的指針變量pstu。在main函數(shù)中,pstu被賦予boy1的地址,因此pstu指向boy1 。然后在printf語(yǔ)句內(nèi)用三種形式輸出boy1的各個(gè)成員值。 從運(yùn)行結(jié)果可以看出:

        結(jié)構(gòu)變量.成員名

        (*結(jié)構(gòu)指針變量).成員名

        結(jié)構(gòu)指針變量->成員名

        這三種用于表示結(jié)構(gòu)成員的形式是完全等效的。結(jié)構(gòu)數(shù)組指針變量結(jié)構(gòu)指針變量可以指向一個(gè)結(jié)構(gòu)數(shù)組, 這時(shí)結(jié)構(gòu)指針變量的值是整個(gè)結(jié)構(gòu)數(shù)組的首地址。 結(jié)構(gòu)指針變量也可指向結(jié)構(gòu)數(shù)組的一個(gè)元素,這時(shí)結(jié)構(gòu)指針變量的值是該結(jié)構(gòu)數(shù)組元素的首地址。設(shè)ps為指向結(jié)構(gòu)數(shù)組的指針變量,則ps也指向該結(jié)構(gòu)數(shù)組的0號(hào)元素,ps+1指向1號(hào)元素,ps+i則指向i號(hào)元素。 這與普通數(shù)組的情況是一致的。

        [例1.1]用指針變量輸出結(jié)構(gòu)數(shù)組。

        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',81},

        {105,"Wang ming",'M',58},

        };

        main()

        {

        struct stu *ps;

        printf("No Name Sex Score ");

        for(ps=boy;ps  printf("%d %s %c %f ",ps->num,ps->name,ps->sex,ps->

        score);

        }

        在程序中,定義了stu結(jié)構(gòu)類(lèi)型的外部數(shù)組boy 并作了初始化賦值。在main函數(shù)內(nèi)定義ps為指向stu類(lèi)型的指針。在循環(huán)語(yǔ)句for的表達(dá)式1中,ps被賦予boy的首地址,然后循環(huán)5次,輸出boy數(shù)組中各成員值。 應(yīng)該注意的是, 一個(gè)結(jié)構(gòu)指針變量雖然可以用來(lái)訪問(wèn)結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素的成員,但是,不能使它指向一個(gè)成員。 也就是說(shuō)不允許取一個(gè)成員的地址來(lái)賦予它。因此,下面的賦值是錯(cuò)誤的。 ps=&boy[1].sex;而只能是:ps=boy;(賦予數(shù)組首地址)

        或者是:

        ps=&boy[0];(賦予0號(hào)元素首地址)

        結(jié)構(gòu)指針變量作函數(shù)參數(shù)

        在ANSI C標(biāo)準(zhǔn)中允許用結(jié)構(gòu)變量作函數(shù)參數(shù)進(jìn)行整體傳送。 但是這種傳送要將全部成員逐個(gè)傳送, 特別是成員為數(shù)組時(shí)將會(huì)使傳送的時(shí)間和空間開(kāi)銷(xiāo)很大,嚴(yán)重地降低了程序的效率。 因此最好的辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進(jìn)行傳送。 這時(shí)由實(shí)參傳向形參的只是地址,從而減少了時(shí)間和空間的開(kāi)銷(xiāo)。

        [例1.8]題目與例1.4相同,計(jì)算一組學(xué)生的平均成績(jī)和不及格人數(shù)。

        用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。

        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',81},

        {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;i<5;i++,ps++)

        {

        s+=ps->score;

        if(ps->score<60) c+=1;

        }

        printf("s=%f ",s);

        ave=s/5;

        printf("average=%f count=%d ",ave,c);

        }

        本程序中定義了函數(shù)ave,其形參為結(jié)構(gòu)指針變量ps。boy 被定義為外部結(jié)構(gòu)數(shù)組,因此在整個(gè)源程序中有效。在main 函數(shù)中定義說(shuō)明了結(jié)構(gòu)指針變量ps,并把boy的首地址賦予它,使ps指向boy 數(shù)組。然后以ps作實(shí)參調(diào)用函數(shù)ave。在函數(shù)ave 中完成計(jì)算平均成績(jī)和統(tǒng)計(jì)不及格人數(shù)的工作并輸出結(jié)果。與例1.4程序相比,由于本程序全部采用指針變量作運(yùn)算和處理,故速度更快,程序效率更高。.

        topoic=動(dòng)態(tài)存儲(chǔ)分配

        在數(shù)組一章中,曾介紹過(guò)數(shù)組的長(zhǎng)度是預(yù)先定義好的, 在整個(gè)程序中固定不變。C語(yǔ)言中不允許動(dòng)態(tài)數(shù)組類(lèi)型。例如: int n;scanf("%d",&n);int a[n]; 用變量表示長(zhǎng)度,想對(duì)數(shù)組的大小作動(dòng)態(tài)說(shuō)明, 這是錯(cuò)誤的。但是在實(shí)際的編程中,往往會(huì)發(fā)生這種情況, 即所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù),而無(wú)法預(yù)先確定。對(duì)于這種問(wèn)題, 用數(shù)組的辦法很難解決。為了解決上述問(wèn)題,C語(yǔ)言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要?jiǎng)討B(tài)地分配內(nèi)存空間, 也可把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。 常用的內(nèi)存管理函數(shù)有以下三個(gè):

        1.分配內(nèi)存空間函數(shù)malloc

        調(diào)用形式: (類(lèi)型說(shuō)明符*) malloc (size) 功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一塊長(zhǎng)度為"size" 字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。 “類(lèi)型說(shuō)明符”表示把該區(qū)域用于何種數(shù)據(jù)類(lèi)型。(類(lèi)型說(shuō)明符*)表示把返回值強(qiáng)制轉(zhuǎn)換為該類(lèi)型指針!皊ize”是一個(gè)無(wú)符號(hào)數(shù)。例如: pc=(char *) malloc (100); 表示分配100個(gè)字節(jié)的內(nèi)存空間,并強(qiáng)制轉(zhuǎn)換為字符數(shù)組類(lèi)型, 函數(shù)的返回值為指向該字符數(shù)組的指針, 把該指針賦予指針變量pc。

        2.分配內(nèi)存空間函數(shù) calloc

        calloc 也用于分配內(nèi)存空間。調(diào)用形式: (類(lèi)型說(shuō)明符*)calloc(n,size) 功能:在內(nèi)存動(dòng)態(tài)存儲(chǔ)區(qū)中分配n塊長(zhǎng)度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。(類(lèi)型說(shuō)明符*)用于強(qiáng)制類(lèi)型轉(zhuǎn)換。calloc函數(shù)與malloc 函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結(jié)構(gòu)長(zhǎng)度。因此該語(yǔ)句的意思是:按stu的長(zhǎng)度分配2塊連續(xù)區(qū)域,強(qiáng)制轉(zhuǎn)換為stu類(lèi)型,并把其首地址賦予指針變量ps。

        3.釋放內(nèi)存空間函數(shù)free

        調(diào)用形式: free(void*ptr); 功能:釋放ptr所指向的一塊內(nèi)存空間,ptr 是一個(gè)任意類(lèi)型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域:[例1.9]分配一塊區(qū)域,輸入一個(gè)學(xué)生數(shù)據(jù)。

        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=%d Name=%s ",ps->num,ps->name);

        printf("Sex=%c Score=%f ",ps->sex,ps->score);

        free(ps);

        }

        本例中,定義了結(jié)構(gòu)stu,定義了stu類(lèi)型指針變量ps。 然后分配一塊stu大內(nèi)存區(qū),并把首地址賦予ps,使ps指向該區(qū)域。再以ps為指向結(jié)構(gòu)的指針變量對(duì)各成員賦值,并用printf 輸出各成員值。最后用free函數(shù)釋放ps指向的內(nèi)存空間。 整個(gè)程序包含了申請(qǐng)內(nèi)存空間、使用內(nèi)存空間、釋放內(nèi)存空間三個(gè)步驟, 實(shí)現(xiàn)存儲(chǔ)空間的動(dòng)態(tài)分配。鏈表的概念在例1.9中采用了動(dòng)態(tài)分配的辦法為一個(gè)結(jié)構(gòu)分配內(nèi)存空間。每一次分配一塊空間可用來(lái)存放一個(gè)學(xué)生的數(shù)據(jù), 我們可稱(chēng)之為一個(gè)結(jié)點(diǎn)。有多少個(gè)學(xué)生就應(yīng)該申請(qǐng)分配多少塊內(nèi)存空間, 也就是說(shuō)要建立多少個(gè)結(jié)點(diǎn)。當(dāng)然用結(jié)構(gòu)數(shù)組也可以完成上述工作, 但如果預(yù)先不能準(zhǔn)確把握學(xué)生人數(shù),也就無(wú)法確定數(shù)組大小。 而且當(dāng)學(xué)生留級(jí)、退學(xué)之后也不能把該元素占用的空間從數(shù)組中釋放出來(lái)。 用動(dòng)態(tài)存儲(chǔ)的方法可以很好地解決這些問(wèn)題。 有一個(gè)學(xué)生就分配一個(gè)結(jié)點(diǎn),無(wú)須預(yù)先確定學(xué)生的準(zhǔn)確人數(shù),某學(xué)生退學(xué), 可刪去該結(jié)點(diǎn),并釋放該結(jié)點(diǎn)占用的存儲(chǔ)空間。從而節(jié)約了寶貴的內(nèi)存資源。 另一方面,用數(shù)組的方法必須占用一塊連續(xù)的內(nèi)存區(qū)域。 而使用動(dòng)態(tài)分配時(shí),每個(gè)結(jié)點(diǎn)之間可以是不連續(xù)的(結(jié)點(diǎn)內(nèi)是連續(xù)的)。 結(jié)點(diǎn)之間的聯(lián)系可以用指針實(shí)現(xiàn)。 即在結(jié)點(diǎn)結(jié)構(gòu)中定義一個(gè)成員項(xiàng)用來(lái)存放下一結(jié)點(diǎn)的首地址,這個(gè)用于存放地址的成員,常把它稱(chēng)為指針域。可在第一個(gè)結(jié)點(diǎn)的指針域內(nèi)存入第二個(gè)結(jié)點(diǎn)的首地址, 在第二個(gè)結(jié)點(diǎn)的指針域內(nèi)又存放第三個(gè)結(jié)點(diǎn)的首地址, 如此串連下去直到最后一個(gè)結(jié)點(diǎn)。最后一個(gè)結(jié)點(diǎn)因無(wú)后續(xù)結(jié)點(diǎn)連接,其指針域可賦為0。這樣一種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱(chēng)為“鏈表”。圖1.3為鏈表的示意圖。

        在圖1.3中,第0個(gè)結(jié)點(diǎn)稱(chēng)為頭結(jié)點(diǎn), 它存放有第一個(gè)結(jié)點(diǎn)的首地址,它沒(méi)有數(shù)據(jù),只是一個(gè)指針變量。 以下的每個(gè)結(jié)點(diǎn)都分為兩個(gè)域,一個(gè)是數(shù)據(jù)域,存放各種實(shí)際的數(shù)據(jù),如學(xué)號(hào)num,姓名name,性別sex和成績(jī)score等。另一個(gè)域?yàn)橹羔樣颍?存放下一結(jié)點(diǎn)的首地址。鏈表中的每一個(gè)結(jié)點(diǎn)都是同一種結(jié)構(gòu)類(lèi)型。例如, 一個(gè)存放學(xué)生學(xué)號(hào)和成績(jī)的結(jié)點(diǎn)應(yīng)為以下結(jié)構(gòu):

        struct stu

        { int num;

        int score;

        struct stu *next;

        }

        前兩個(gè)成員項(xiàng)組成數(shù)據(jù)域,后一個(gè)成員項(xiàng)next構(gòu)成指針域, 它是一個(gè)指向stu類(lèi)型結(jié)構(gòu)的指針變量。鏈表的基本操作對(duì)鏈表的主要操作有以下幾種:

        1.建立鏈表;

        2.結(jié)構(gòu)的查找與輸出;

        3.插入一個(gè)結(jié)點(diǎn);

        4.刪除一個(gè)結(jié)點(diǎn);

        下面通過(guò)例題來(lái)說(shuō)明這些操作。

        [例1.10]建立一個(gè)三個(gè)結(jié)點(diǎn)的鏈表,存放學(xué)生數(shù)據(jù)。 為簡(jiǎn)單起見(jiàn), 我們假定學(xué)生數(shù)據(jù)結(jié)構(gòu)中只有學(xué)號(hào)和年齡兩項(xiàng)。

        可編寫(xiě)一個(gè)建立鏈表的函數(shù)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;i  {

        pb=(TYPE*) malloc(LEN);

        printf("input Number and Age ");

        scanf("%d%d",&pb->num,&pb->age);

        if(i==0)

        pf=head=pb;

        else pf->next=pb;

        pb->next=NULL;

        pf=pb;

        }

        return(head);

        }

        在函數(shù)外首先用宏定義對(duì)三個(gè)符號(hào)常量作了定義。這里用TYPE表示struct stu,用LEN表示sizeof(struct stu)主要的目的是為了在以下程序內(nèi)減少書(shū)寫(xiě)并使閱讀更加方便。結(jié)構(gòu)stu定義為外部類(lèi)型,程序中的各個(gè)函數(shù)均可使用該定義。

        creat函數(shù)用于建立一個(gè)有n個(gè)結(jié)點(diǎn)的鏈表,它是一個(gè)指針函數(shù),它返回的指針指向stu結(jié)構(gòu)。在creat函數(shù)內(nèi)定義了三個(gè)stu結(jié)構(gòu)的指針變量。head為頭指針,pf 為指向兩相鄰結(jié)點(diǎn)的前一結(jié)點(diǎn)的指針變量。pb為后一結(jié)點(diǎn)的指針變量。在for語(yǔ)句內(nèi),用malloc函數(shù)建立長(zhǎng)度與stu長(zhǎng)度相等的空間作為一結(jié)點(diǎn),首地址賦予pb。然后輸入結(jié)點(diǎn)數(shù)據(jù)。如果當(dāng)前結(jié)點(diǎn)為第一結(jié)點(diǎn)(i==0),則把pb值 (該結(jié)點(diǎn)指針)賦予head和pf。如非第一結(jié)點(diǎn),則把pb值賦予pf 所指結(jié)點(diǎn)的指針域成員next。而pb所指結(jié)點(diǎn)為當(dāng)前的最后結(jié)點(diǎn),其指針域賦NULL。 再把pb值賦予pf以作下一次循環(huán)準(zhǔn)備。

        creat函數(shù)的形參n,表示所建鏈表的結(jié)點(diǎn)數(shù),作為for語(yǔ)句的循環(huán)次數(shù)。圖1.4表示了creat函數(shù)的執(zhí)行過(guò)程。

        [例1.11]寫(xiě)一個(gè)函數(shù),在鏈表中按學(xué)號(hào)查找該結(jié)點(diǎn)。

        TYPE * search (TYPE *head,int n)

        {

        TYPE *p;

        int i;

        p=head;

        while (p->num!=n && p->next!=NULL)

        p=p->next; /* 不是要找的結(jié)點(diǎn)后移一步*/

        if (p->num==n) return (p);

        if (p->num!=n&& p->next==NULL)

        printf ("Node %d has not been found! ",n

        }

        本函數(shù)中使用的符號(hào)常量TYPE與例1.10的宏定義相同,等于struct stu。函數(shù)有兩個(gè)形參,head是指向鏈表的指針變量,n為要查找的學(xué)號(hào)。進(jìn)入while語(yǔ)句,逐個(gè)檢查結(jié)點(diǎn)的num成員是否等于n,如果不等于n且指針域不等于NULL(不是最后結(jié)點(diǎn))則后移一個(gè)結(jié)點(diǎn),繼續(xù)循環(huán)。如找到該結(jié)點(diǎn)則返回結(jié)點(diǎn)指針。 如循環(huán)結(jié)束仍未找到該結(jié)點(diǎn)則輸出“未找到”的提示信息。

        [例1.12]寫(xiě)一個(gè)函數(shù),刪除鏈表中的指定結(jié)點(diǎn)。刪除一個(gè)結(jié)點(diǎn)有兩種情況:

        1. 被刪除結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn)。這種情況只需使head指向第二個(gè)結(jié)點(diǎn)即可。即head=pb->next。其過(guò)程如圖1.5所示。

        2. 被刪結(jié)點(diǎn)不是第一個(gè)結(jié)點(diǎn),這種情況使被刪結(jié)點(diǎn)的前一結(jié)點(diǎn)指向被刪結(jié)點(diǎn)的后一結(jié)點(diǎn)即可。即pf->next=pb->next。其過(guò)程如圖1.6所示。

        函數(shù)編程如下:

        TYPE * (TYPE * head,int num)

        {

        TYPE *pf,*pb;

        if(head==NULL) /*如為空表, 輸出提示信息*/

        { printf(" empty list! ");

        goto end;}

        pb=head;

        while (pb->num!=num && pb->next!=NULL)

        /*當(dāng)不是要?jiǎng)h除的結(jié)點(diǎn),而且也不是最后一個(gè)結(jié)點(diǎn)時(shí),繼續(xù)循環(huán)*/

        {pf=pb;pb=pb->next;}/*pf指向當(dāng)前結(jié)點(diǎn),pb指向下一結(jié)點(diǎn)*/

        if(pb->num==num)

        {if(pb==head) head=pb->next;

        /*如找到被刪結(jié)點(diǎn),且為第一結(jié)點(diǎn),則使head指向第二個(gè)結(jié)點(diǎn),

        否則使pf所指結(jié)點(diǎn)的指針指向下一結(jié)點(diǎn)*/

        else pf->next=pb->next;

        free(pb);

        printf("The node is d ");}

        else

        printf("The node not been foud! ");

        end:

        return head;

        }

        函數(shù)有兩個(gè)形參,head為指向鏈表第一結(jié)點(diǎn)的指針變量,num刪結(jié)點(diǎn)的學(xué)號(hào)。 首先判斷鏈表是否為空,為空則不可能有被刪結(jié)點(diǎn)。若不為空,則使pb指針指向鏈表的第一個(gè)結(jié)點(diǎn)。進(jìn)入while語(yǔ)句后逐個(gè)查找被刪結(jié)點(diǎn)。找到被刪結(jié)點(diǎn)之后再看是否為第一結(jié)點(diǎn),若是則使head指向第二結(jié)點(diǎn)(即把第一結(jié)點(diǎn)從鏈中刪去),否則使被刪結(jié)點(diǎn)的前一結(jié)點(diǎn)(pf所指)指向被刪結(jié)點(diǎn)的后一結(jié)點(diǎn)(被刪結(jié)點(diǎn)的指針域所指)。如若循環(huán)結(jié)束未找到要?jiǎng)h的結(jié)點(diǎn), 則輸出“末找到”的提示信息。最后返回head值。

        [例1.13]寫(xiě)一個(gè)函數(shù),在鏈表中指定位置插入一個(gè)結(jié)點(diǎn)。在一個(gè)鏈表的指定位置插入結(jié)點(diǎn), 要求鏈表本身必須是已按某種規(guī)律排好序的。例如,在學(xué)生數(shù)據(jù)鏈表中, 要求學(xué)號(hào)順序插入一個(gè)結(jié)點(diǎn)。設(shè)插入結(jié)點(diǎn)的指針為pi。 可在三種不同情況下插入。

        1. 原表是空表,只需使head指向插入結(jié)點(diǎn)即可。見(jiàn)圖1.1(a)

        2. 插入結(jié)點(diǎn)值最小,應(yīng)插入第一結(jié)點(diǎn)之前。這種情況下使head指向插入結(jié)點(diǎn),插入結(jié)點(diǎn)的指針域指向原來(lái)的第一結(jié)點(diǎn)則可。即:pi->next=pb;

        head=pi; 見(jiàn)圖1.1(b)

        3. 在其它位置插入,見(jiàn)圖1.1(c)。這種情況下,使插入位置的前一結(jié)點(diǎn)的指針域指向插入結(jié)點(diǎn),使插入結(jié)點(diǎn)的指針域指向插入位置的后一結(jié)點(diǎn)。即為:pi->next=pb;pf->next=pi;

        4. 在表末插入,見(jiàn)圖1.1(d)。這種情況下使原表末結(jié)點(diǎn)指針域指向插入結(jié)點(diǎn),插入結(jié)點(diǎn)指針域置為NULL。即:

        pb->next=pi;

        pi->next=NULL; TYPE * (TYPE * head,TYPE *pi)

        {

        TYPE *pf,*pb;

        pb=head;

        if(head==NULL) /*空表插入*/

        (head=pi;

        pi->next=NULL;}

        else

        {

        while((pi->num>pb->num)&&(pb->next!=NULL))

        {pf=pb;

        pb=pb->next; }/*找插入位置*/

        if(pi->num<=pb->num)

        {if(head==pb)head=pi;/*在第一結(jié)點(diǎn)之前插入*/

        else pf->next=pi;/*在其它位置插入*/

        pi->next=pb; }

        else

        {pb->next=pi;

        pi->next=NULL;} /*在表末插入*/

        }

        return head;}

        本函數(shù)有兩個(gè)形參均為指針變量,head指向鏈表,pi 指向插入結(jié)點(diǎn)。函數(shù)中首先判斷鏈表是否為空,為空則使head指向插入結(jié)點(diǎn)。表若不空,則用while語(yǔ)句循環(huán)查找插入位置。找到之后再判斷是否在第一結(jié)點(diǎn)之前插入,若是則使head 指向插入結(jié)點(diǎn)插入結(jié)點(diǎn)指針域指向原第一結(jié)點(diǎn),否則在其它位置插入, 若插入的結(jié)點(diǎn)大于表中所有結(jié)點(diǎn),則在表末插入。本函數(shù)返回一個(gè)指針, 是鏈表的頭指針。 當(dāng)插入的位置在第一個(gè)結(jié)點(diǎn)之前時(shí), 插入的新結(jié)點(diǎn)成為鏈表的第一個(gè)結(jié)點(diǎn),因此head的值也有了改變, 故需要把這個(gè)指針?lè)祷刂髡{(diào)函數(shù)。

        [例1.14]將以上建立鏈表,刪除結(jié)點(diǎn),插入結(jié)點(diǎn)的函數(shù)組織在一起,再建一個(gè)輸出全部結(jié)點(diǎn)的函數(shù),然后用main函數(shù)調(diào)用它們。

        #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;i  {

        pb=(TYPE *)malloc(LEN);

        printf("input Number and Age ");

        scanf("%d%d",&pb->num,&pb->age);

        if(i==0)

        pf=head=pb;

        else pf->next=pb;

        pb->next=NULL;

        pf=pb;

        }

        return(head);

        }

        TYPE * (TYPE * head,int num)

        {

        TYPE *pf,*pb;

        if(head==NULL)

        { printf(" empty list! ");

        goto end;}

        pb=head;

        while (pb->num!=num && pb->next!=NULL)

        {pf=pb;pb=pb->next;}

        if(pb->num==num)

        { if(pb==head) head=pb->next;

        else pf->next=pb->next;

        printf("The node is d "); }

        else

        free(pb);

        printf("The node not been found! ");

        end:

        return head;

        }

        TYPE * (TYPE * head,TYPE * pi)

        {

        TYPE *pb ,*pf;

        pb=head;

        if(head==NULL)

        { head=pi;

        pi->next=NULL; }

        else

        {

        while((pi->num>pb->num)&&(pb->next!=NULL))

        { pf=pb;

        pb=pb->next; }

        if(pi->num<=pb->num)

        { if(head==pb) head=pi;

        else pf->next=pi;

        pi->next=pb; }

        else

        { pb->next=pi;

        pi->next=NULL; }

        }

        return head;

        }

        void print(TYPE * head)

        {

        printf("Number Age ");

        while(head!=NULL)

        {

        printf("%d %d ",head->num,head->age);

        head=head->next;

        }

        }

        main()

        {

        TYPE * head,*pnum;

        int n,num;

        printf("input number of node: ");

        scanf("%d",&n);

        head=creat(n);

        print(head);

        printf("Input the d number: ");

        scanf("%d",&num);

        head=(head,num);

        print(head);

        printf("Input the ed number and age: ");

        pnum=(TYPE *)malloc(LEN);

        scanf("%d%d",&pnum->num,&pnum->age);

        head=(head,pnum);

        print(head);

        }

        本例中,print函數(shù)用于輸出鏈表中各個(gè)結(jié)點(diǎn)數(shù)據(jù)域值。函數(shù)的形參head的初值指向鏈表第一個(gè)結(jié)點(diǎn)。在while語(yǔ)句中,輸出結(jié)點(diǎn)值后,head值被改變,指向下一結(jié)點(diǎn)。若保留頭指針head, 則應(yīng)另設(shè)一個(gè)指針變量,把head值賦予它,再用它來(lái)替代head。在main函數(shù)中,n為建立結(jié)點(diǎn)的數(shù)目, num為待刪結(jié)點(diǎn)的數(shù)據(jù)域值;head為指向鏈表的頭指針,pnum為指向待插結(jié)點(diǎn)的指針。 main函數(shù)中各行的意義是:

        第六行輸入所建鏈表的結(jié)點(diǎn)數(shù);

        第七行調(diào)creat函數(shù)建立鏈表并把頭指針?lè)祷亟ohead;

        第八行調(diào)print函數(shù)輸出鏈表;

        第十行輸入待刪結(jié)點(diǎn)的學(xué)號(hào);

        第十一行調(diào)函數(shù)刪除一個(gè)結(jié)點(diǎn);

        第十二行調(diào)print函數(shù)輸出鏈表;

        第十四行調(diào)malloc函數(shù)分配一個(gè)結(jié)點(diǎn)的內(nèi)存空間, 并把其地址賦予pnum;

        第十五行輸入待插入結(jié)點(diǎn)的數(shù)據(jù)域值;

        第十六行調(diào)函數(shù)插入pnum所指的結(jié)點(diǎn);

        第十七行再次調(diào)print函數(shù)輸出鏈表。

        從運(yùn)行結(jié)果看,首先建立起3個(gè)結(jié)點(diǎn)的鏈表,并輸出其值;再刪103號(hào)結(jié)點(diǎn),只剩下105,108號(hào)結(jié)點(diǎn);又輸入106號(hào)結(jié)點(diǎn)數(shù)據(jù), 插入后鏈表中的結(jié)點(diǎn)為105,106,108。聯(lián)合“聯(lián)合”也是一種構(gòu)造類(lèi)型的數(shù)據(jù)結(jié)構(gòu)。 在一個(gè)“聯(lián)合”內(nèi)可以定義多種不同的數(shù)據(jù)類(lèi)型, 一個(gè)被說(shuō)明為該“聯(lián)合”類(lèi)型的變量中,允許裝入該“聯(lián)合”所定義的任何一種數(shù)據(jù)。 這在前面的各種數(shù)據(jù)類(lèi)型中都是辦不到的。例如, 定義為整型的變量只能裝入整型數(shù)據(jù),定義為實(shí)型的變量只能賦予實(shí)型數(shù)據(jù)。

        在實(shí)際問(wèn)題中有很多這樣的例子。 例如在學(xué)校的教師和學(xué)生中填寫(xiě)以下表格: 姓名 年齡 職業(yè) 單位 “職業(yè)”一項(xiàng)可分為“教師”和“學(xué)生”兩類(lèi)。 對(duì)“單位”一項(xiàng)學(xué)生應(yīng)填入班級(jí)編號(hào),教師應(yīng)填入某系某教研室。 班級(jí)可用整型量表示,教研室只能用字符類(lèi)型。 要求把這兩種類(lèi)型不同的數(shù)據(jù)都填入“單位”這個(gè)變量中, 就必須把“單位”定義為包含整型和字符型數(shù)組這兩種類(lèi)型的“聯(lián)合”。

        “聯(lián)合”與“結(jié)構(gòu)”有一些相似之處。但兩者有本質(zhì)上的不同。在結(jié)構(gòu)中各成員有各自的內(nèi)存空間, 一個(gè)結(jié)構(gòu)變量的總長(zhǎng)度是各成員長(zhǎng)度之和。而在“聯(lián)合”中,各成員共享一段內(nèi)存空間, 一個(gè)聯(lián)合變量的長(zhǎng)度等于各成員中最長(zhǎng)的長(zhǎng)度。應(yīng)該說(shuō)明的是, 這里所謂的共享不是指把多個(gè)成員同時(shí)裝入一個(gè)聯(lián)合變量?jī)?nèi), 而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。如前面介紹的“單位”變量, 如定義為一個(gè)可裝入“班級(jí)”或“教研室”的聯(lián)合后,就允許賦予整型值(班級(jí))或字符串(教研室)。要么賦予整型值,要么賦予字符串,不能把兩者同時(shí)賦予它。聯(lián)合類(lèi)型的定義和聯(lián)合變量的說(shuō)明一個(gè)聯(lián)合類(lèi)型必須經(jīng)過(guò)定義之后, 才能把變量說(shuō)明為該聯(lián)合類(lèi)型。

        一、聯(lián)合的定義

        定義一個(gè)聯(lián)合類(lèi)型的一般形式為:

        union 聯(lián)合名

        {

        成員表

        };

        成員表中含有若干成員,成員的一般形式為: 類(lèi)型說(shuō)明符 成員名 成員名的命名應(yīng)符合標(biāo)識(shí)符的規(guī)定。

        例如:

        union perdata

        {

        int class;

        char office[10];

        };

        定義了一個(gè)名為perdata的聯(lián)合類(lèi)型,它含有兩個(gè)成員,一個(gè)為整型,成員名為class;另一個(gè)為字符數(shù)組,數(shù)組名為office。聯(lián)合定義之后,即可進(jìn)行聯(lián)合變量說(shuō)明,被說(shuō)明為perdata類(lèi)型的變量,可以存放整型量class或存放字符數(shù)組office。

        二、聯(lián)合變量的說(shuō)明

        聯(lián)合變量的說(shuō)明和結(jié)構(gòu)變量的說(shuō)明方式相同, 也有三種形式。即先定義,再說(shuō)明;定義同時(shí)說(shuō)明和直接說(shuō)明。以perdata類(lèi)型為例,說(shuō)明如下:

        union perdata

        {

        int class;

        char officae[10];

        };

        union perdata a,b; /*說(shuō)明a,b為perdata類(lèi)型*/

        或者可同時(shí)說(shuō)明為:

        union perdata

        { int class;

        char office[10]; }a,b;或直接說(shuō)明為: union

        { int class;

        char office[10]; }a,b

        經(jīng)說(shuō)明后的a,b變量均為perdata類(lèi)型。 它們的內(nèi)存分配示意圖如圖1—8所示。a,b變量的長(zhǎng)度應(yīng)等于 perdata 的成員中最長(zhǎng)的長(zhǎng)度, 即等于

        office數(shù)組的長(zhǎng)度,共10個(gè)字節(jié)。從圖中可見(jiàn),a,b變量如賦予整型值時(shí),只使用了2個(gè)字節(jié),而賦予字符數(shù)組時(shí),可用10個(gè)字節(jié)。

        聯(lián)合變量的賦值和使用

        對(duì)聯(lián)合變量的賦值,使用都只能是對(duì)變量的成員進(jìn)行。 聯(lián)合變量的成員表示為: 聯(lián)合變量名.成員名 例如,a被說(shuō)明為perdata類(lèi)型的變量之后,可使用 a.class a.office 不允許只用聯(lián)合變量名作賦值或其它操作。 也不允許對(duì)聯(lián)合變量作初始化賦值,賦值只能在程序中進(jìn)行。還要再?gòu)?qiáng)調(diào)說(shuō)明的是,一個(gè)聯(lián)合變量, 每次只能賦予一個(gè)成員值。換句話說(shuō),一個(gè)聯(lián)合變量的值就是聯(lián)合變員的某一個(gè)成員值。

        [例1.15]設(shè)有一個(gè)教師與學(xué)生通用的表格,教師數(shù)據(jù)有姓名,年齡,職業(yè),教研室四項(xiàng)。學(xué)生有姓名,年齡,職業(yè),班級(jí)四項(xiàng)。

        編程輸入人員數(shù)據(jù), 再以表格輸出。

        main()

        {

        struct

        {

        char name[10];

        int age;

        char job;

        union

        {

        int class;

        char office[10];

        } depa;

        }body[2];

        int n,i;

        for(i=0;i<2;i++)

        {

        printf("input name,age,job and department ");

        scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);

        if(body[i].job=='s')

        scanf("%d",&body[i].depa.class);

        else

        scanf("%s",body[i].depa.office);

        }

        printf("name age job class/office ");

        for(i=0;i<2;i++)

        {

        if(body[i].job=='s')

        printf("%s = < %d ",body[i].name,body[i].age

        ,body[i].job,body[i].depa.class);

        else

        printf("%s = < %s ",body[i].name,body[i].age,

        body[i].job,body[i].depa.office);

        }

        }

        本例程序用一個(gè)結(jié)構(gòu)數(shù)組body來(lái)存放人員數(shù)據(jù), 該結(jié)構(gòu)共有四個(gè)成員。其中成員項(xiàng)depa是一個(gè)聯(lián)合類(lèi)型, 這個(gè)聯(lián)合又由兩個(gè)成員組成,一個(gè)為整型量class,一個(gè)為字符數(shù)組office。在程序的第一個(gè)for語(yǔ)句中,輸入人員的各項(xiàng)數(shù)據(jù),先輸入結(jié)構(gòu)的前三個(gè)成員name,age和job,然后判別job成員項(xiàng),如為"s"則對(duì)聯(lián)合depa·class輸入(對(duì)學(xué)生賦班級(jí)編號(hào))否則對(duì)depa·office輸入(對(duì)教師賦教研組名)。

        在用scanf語(yǔ)句輸入時(shí)要注意,凡為數(shù)組類(lèi)型的成員,無(wú)論是結(jié)構(gòu)成員還是聯(lián)合成員,在該項(xiàng)前不能再加"&"運(yùn)算符。如程序第18行中

        body[i].name是一個(gè)數(shù)組類(lèi)型,第22行中的body[i].depa.office也是數(shù)組類(lèi)型,因此在這兩項(xiàng)之間不能加"&"運(yùn)算符。程序中的第二個(gè)for語(yǔ)句用于輸出各成員項(xiàng)的值:

        本章小結(jié)

        1. 結(jié)構(gòu)和聯(lián)合是兩種構(gòu)造類(lèi)型數(shù)據(jù),是用戶(hù)定義新數(shù)據(jù)類(lèi)型的重要手段。結(jié)構(gòu)和聯(lián)合有很多的相似之處,它們都由成員組成。成員可以具有不同的數(shù)據(jù)類(lèi)型。成員的表示方法相同。都可用三種方式作變量說(shuō)明。

        2. 在結(jié)構(gòu)中,各成員都占有自己的內(nèi)存空間,它們是同時(shí)存在的。一個(gè)結(jié)構(gòu)變量的總長(zhǎng)度等于所有成員長(zhǎng)度之和。在聯(lián)合中,所有成員不能同時(shí)占用它的內(nèi)存空間,它們不能同時(shí)存在。聯(lián)合變量的長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度。

        3. “.”是成員運(yùn)算符,可用它表示成員項(xiàng),成員還可用“->”運(yùn)算符來(lái)表示。

        4. 結(jié)構(gòu)變量可以作為函數(shù)參數(shù),函數(shù)也可返回指向結(jié)構(gòu)的指針變量。而聯(lián)合變量不能作為函數(shù)參數(shù),函數(shù)也不能返回指向聯(lián)合的指針變量。但可以使用指向聯(lián)合變量的指針,也可使用聯(lián)合數(shù)組。 5. 結(jié)構(gòu)定義允許嵌套,結(jié)構(gòu)中也可用聯(lián)合作為成員,形成結(jié)構(gòu)和聯(lián)合的嵌套。

        6. 鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu),它便于實(shí)現(xiàn)動(dòng)態(tài)的存儲(chǔ)分配。本章介紹是單向鏈表,還可組成雙向鏈表,循環(huán)鏈表等。

      【C語(yǔ)言的結(jié)構(gòu)與聯(lián)合的實(shí)例分析】相關(guān)文章:

      C語(yǔ)言順序結(jié)構(gòu)的設(shè)計(jì)實(shí)例11-29

      C語(yǔ)言條件編譯分析實(shí)例02-19

      C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)樹(shù)雙親表示法實(shí)例分析10-07

      C語(yǔ)言double和float 實(shí)例分析用法01-13

      C語(yǔ)言的結(jié)構(gòu)03-01

      C語(yǔ)言棧的表示與實(shí)現(xiàn)實(shí)例詳解分析09-10

      C語(yǔ)言面試實(shí)例操作03-09

      C語(yǔ)言數(shù)組實(shí)例解析02-21

      主站蜘蛛池模板: 秦时明月全集免费观看| 昌平区| 农民伯伯和乡下妹妹电视剧| 《医生:特殊的治疗》2| 夏家三千金60| 被夫上司強暴人妻中文字幕| 歌曲连唱| 新金瓶梅 杨思敏| 政宗君的复仇动画| 北上电视剧38集| 璀璨人生电视剧免费观看 | 金银梅10普通话版免费观看第1集 最高的爱人诏不干涉工作和家庭电 | 莱纳安德森《黑暗森林》在线播放欢| 好妈妈8免费观看电视剧| 新福尔摩斯 第二季| 欢乐颂5在线观看免费版| 高清《表妹2》电视剧| 雪中悍刀行免费观看全集| 天津卫视德云社春晚| 西游记之大闹天宫3d| 《少林寺》| 盛唐风流电影免费观看完整版国语-2019| 满洲国国歌| 麦迪女超人法版免费观看| 麻吉弟弟| 男生和男生一起愁愁免费观看全集高清完整版电视剧 | 动漫城市猎人国语版| ⅹl司第一季在线观看免费| 高清《谎言》在线观看| 电影战狼6高清完整版在线观看免费 | 《温柔的谎言》免费观看| 先结婚后恋爱全集| 浴血坚持| 犬夜叉168| 嫁入豪门:少奶难当短剧全集| 上位 微电影| 独家记忆电视剧| 特殊保险销售员5| 电视剧一日夫妻百日恩| 战狼6妈妈版免费资源| 职员到老板:打工人全集免费| 韩国理伦片驯服小峓2-手机看片免费在线观看-亚洲AV在线观看 | 无限斯特拉托斯| 女超人Melody在线观看 | 我喜欢你免费观看电视剧完整版| 电视剧隋唐英雄| 安徽卫视海豚tv| 大宋惊世传奇电视剧| 火影剧场版7| 东方茱丽叶全集| 老湿电影院体检区| 男与女电影| 噼里啪啦在线影视免费观看| 本乡爱,二阶堂梦| 捡到女高中生然后剃须动漫结局 | 孤单又灿烂的神 鬼怪| 御狐之绊| 亡灵故事| 《天海翼被犯女教师》 | 课中坏事 韩国| 爱我几何免费播放| 一起又看流星雨36| 恋爱暴君ova2下载| 交通事故现场| 完美搭档演员表| 韩国电影《办公室》7| 陆小凤全集| 韩剧童颜美女| 龙年档案电视剧26集免费观看| 双女任务电影| 饥饿游戏2:星火燎原| 她在丈夫面前被别人欺负日语| 赵丽颖《小城大事》在线观看免费| 美景之屋6手机在线免费观看| 广州百万葵园| 珠光宝气粤语| 人会被气死吗| 恋爱恐惧症| 最高爱人诏三上解说| 娃娃脸1电影完整版在线观看| 香港金瓶梅| 高清《死人开关》电影| 当我飞奔向你免费看全片| 遂昌县| 降魔的2.0| XL司令全集免费观看| 少年张三丰电视剧| 总统夫人星克莱尔1997| 《两性奥秘》在线观看| 地下偶像在线观看免费高清全集| 水怪在线观看| 不能失去你| 春晚最美女观众| 盛夏晚晴天全集在线观看| 禁忌女孩在线观看泰剧| 荣誉法则(成人版)英文2012 | 一出好戏结局| 武林幸运星| 龙子太郎动画片免费高清版国语| 空调维修工的艳遇在线观看| 狮子王原版英文版免费观看| 年轻的瘦了3| 新雌雄大盗| 家庭主妇肉身归属| 牙医姐妹1986完整版资源 | 灵与肉台湾| 私人航空未删减版在线观看免费 | 吞噬星空血洛大陆免费看| 开始推理吧第3季免费观看全集高清| 较量电视剧| 同桌露出了她粉嫩的那一个| 苍井空电影欺诈都市| 一路向西国语百度影音| 插曲的痛30分免费播放| 向往的生活第7季| 站着再来一次第30集精彩片段回顾 | 雷神电影免费| 甄嬛传全集迅雷下载| 淮河流域图| 弈星滕王阁序| 欢乐颂电视剧| 大秦帝国第2部| 斗罗大陆高清免费观看| 天津一垃圾桶现弃婴| 斗破阴阳宅电影免费观看| 电影之夜| 爱我几何在线观看全集免费播放| 天与地 快播| 一步小心爱上你| 高清《狙击手-斯莫希军官》| 侏罗纪世界3电影完整版免费观看| 女生规则:禁爱游戏| 高清《暗战1》电影在线观看| 侦察英雄| 鹊刀门传奇| 不良义姐真人版台湾在线观看| 奇妙萌可第四季免费观看| 美姐妹牙医在线观看| 亲爱的妈妈4韩国在线观看| 特殊航空服务电影在线观看| 我和我的祖国免费| 部长的夫人的味道电影| 夜夜电影| 《和讨厌的部长出差旅》日本电影观| 芭比之时尚奇迹中文| 人猿泰山电影1995版在线播放| 潘石屹是谁| 电影部长出差的日子| 印度人看中国高铁| 掌中之物西班牙版| 世界大战100年全程实录| 黑白配国语在线播放观看| 果宝特攻3动画片全集| 《张警官三部曲》免费观看高清| 野火春风斗古城电视剧| 姐姐的朋友2在线| 我亲爱的小洁癖电视剧免费观看| 铡美案电影| 长相思第二季| 甜蜜惩罚 我是看守专用宠物第3| 片名《瓜达卢佩的玫瑰》| 延禧攻略70集免费播放| 苍老师电视剧36集全免费播放| 高清杀人者报告未删减| 我的游泳女教练免费观看| 我们的少女时代| 《特殊的治疗》2李采潭中文| 迷人的保姆免费观看| 新金瓶梅电视剧免费观看全集完整版1986| 民间怪谈录| 3v1三人一次性体检韩国电影 | 高清《奇迹》克劳| 年轻的保险推销员| 沐风之女电影完整免费观看| 化德县| 警花与警犬2全集46集| 丫蛋歌曲| 新建文件夹电影在线观看| 拳王粤语版| 暖春小花电影版| 偷窥邻居做爰2| 电影巜商务旅行戴帽子的费 | 火影忍者论坛52pk| 卢旺达的玫瑰在线| 雪烟追逐电视剧| 风筝电视剧完整版| 蔡李佛拳下载| 腾飞担保公司| 《疯狂小女生》法国版精彩片段 | 鬼灭之刃第二季全集免费观看| 摩登家庭6 电视剧| 评书岳飞传刘兰芳| 睫毛膏4美国中文版| 强者风范| 木下檀檩子义免费观看| 花样少年少女| 美乃雀替夫还债的电影免费观看| 杰啊教你说闽南语| 高清《朋友的妻子》在线观看| 狂飙电视剧国产全集免费播放| 女神宿舍的宿官君樱花动漫| 缘之空全集免费观看完整版| 聚会的目的在线播放4| 妈妈的学生中字ID木鱼天| 最后一刻| 倔强驱魔师1-4集免费动漫在线观看樱 | 樱桃小丸子| 女超人 麦乐迪| 高清《体能之巅3: 亚洲大挑战》| 张家港市| 勾魂降头| 大唐御史谢瑶环| 萧山恒隆电影大世界| 天注定高清在线观看| 抵账的朋友麦子金智雅| 高嫁柳嫁家1-4集全| 美国小辣椒| 电影《釜山行》| 电影美乃雀主演弟媳的电影叫什么| 美国男人大鸟| 《新上任的秘书》人物介绍| 归路连续剧| xl司令动漫第一季无马全集在线观看完整版| 心动的信号第8季| 小蜜桃6观看免费高清版电视剧 | 金蝉脱壳高清| 高清《别逼我结婚》| 我的左手右手全集42| 白峰电影全部免费播放| 阿嬷爱国版歌曲| 女超人麦乐迪免费下载| 青春 裴斗娜版| 真破血普通话免费看| 哈哈哈哈哈第二季免费观看完整版| 恨锁金瓶电视剧观看| 娱乐百分百20100805| 足球少女| 酒店1—100集免费观 | 化妆师坐张艺凡腿上补妆| 斗罗大陆双神战双神导演剪辑版 | 喜爱夜蒲 bt| 电影修理工的艳遇韩国在线观看| 创造营亚洲第二季| 侄女的开发日记免费动漫观看| 白峰美羽《美人教师》| 感官新世界| 宝丽金25周年演唱会| 芈月传1至81全集免费观看| 金瓶梅 单立文| 牙克石市| 后宫甄嬛传全集高清| 亲爱的下载| 功夫道电影| 爱的罗曼史无删减在线观看| 《玉女心经之阴阳和合》电影免费观看 | 迷你世界小王子吖| 500星级之341电影完整版| 落跑甜心徐垒| 意大利《激战丛林》电影免费观看| 爷爷晒太阳安详离世奶奶抹泪| 电影白鹿原完整版播放| 摩登原始人英语| 王贵与安娜在线观看| 法国女超人麦乐迪满天星版本 | 360天爱上我| 变形金刚2百度影音| 肢体绣感在线看完整版免费观看| 《女教师3》在线观看| 徐良的女朋友| 唯我独神动漫在线观看国漫| 寄生兽电影迅雷下载| 韩国短剧隐身帽子完整版| 特约外卖员| 满天星《乌托邦》| 老爸当家电视剧| 大红包电影免费完整版| 秀才是怎么火起来的| 幸得相遇离婚时短剧免费观看| 法国满天星《女军医》| 情深深雨蒙蒙35| 部长来家里做客电影在线观看| 古灵精怪东南亚4| 《王牌部队》| 布兰妮crazy| 黑帮大佬和我的365日在线观看| 工藤拉拉在线电影| 玉蒲团之夜销魂完整2| 做aj的视频大全电视剧那些好看的视频都哪去了?| 西安黑灯舞厅| 分娩按摩《4》| 出关电视剧全集在线| 《得闲谨制》在线观看| 蔡徐坤收到奥特曼卡| 寒战2电影| 需要爸爸播种中的字| 替天行道之杀兄电影| 《climax》电影在线观看免费 | 《另一个贝内特家的姐妹》| 大学生漂亮小瘦子4| 禁止的爱:善良的小姨子| 美容是特殊待遇5| 孤注一掷2023电影完整| 周琦确认留队广东出局| 光荣与梦想电视剧| 天国的阶梯中国配音版| 《新金莲外传》在线观看| 鬼子进村终结版| 胶囊旅馆未增删去看吧| 《招魂4:终章》| 情人别为我哭泣| 漂亮小瘦子7免费播放电视剧西瓜视频| 埃洛伊塞| 公的浮之手中字在线观看| 一扑二主全集| 真维斯属于什么档次| 不可饶恕 电影| 天狼星行动| 《高压2》法国版上线平台| 你微笑时很美全集| 《玉女心经3:阴阳和合》陈宝莲 | 中国女曲和比利时女曲冲突| 强者风范电视剧免费观看| 三国演义评书打包下载| 金价连跌首饰金销量猛增| 韩国电影售楼部的小姐| 一路向北原唱| 电影《需要爸爸播种子》HD中字在线观看,高清完整版美国倫理片_屠夫电影网 | 天空电影在线观看免费完整版| 《女兵俘虏营》越南版在线观看完整 | 伦理片上门的修理工艳遇 | 英剧《救赎/penance》| 电车男粤语| 东北二人转正戏| 《军事不当行为》免费观看法国| 月之眼计划| 维修工人的培训电影| 马永贞百度影音| 斗气冤家好兄弟第二部| 战狼6免费观看在线成人版| 妻子的叛乱国语版| 小旅馆的肥熟老女人| 我们来自未来1| 银牌就不掏出来了吧| 哇嘎在线观看高清电影| 美尻女教师在线观看| 消失的她免费完整观看| 被欺凌的女人全集| 龙胆虎威4下载| 黑白配手机免费观看| 《登山的目的》中字| 假面骑士铠武15| 凯登克罗斯在线电影免费观看护士| 绝对权力在线播放全集| 春逝电影完整免费观看| 疯狂炒作团台词| 看了下面会流水的视频| 二十一世纪性格爱情指南第4集| 去有风的地方电视剧免费观看超清 | 巨乳高清版在线| DTF圣路易日记| 熟妇和巨乳继拇做爰电影院| 蓝白红三部曲之红电影| 异形3电影| 韩国电影《美人》| 私人女性监狱变态版在线观看 | 魔法老师第一季| 夺命追杀美国电影| 周弘打真军电影| 电视剧爱情男女| 《特殊游泳教练| 一年一度喜剧大赛第一季免费观看 | 大城武士| 美好的时光电视剧| 替丈夫还债电影高清完整版免费观看 | 美容室的待遇7中文版| 亲爱的妈妈4韩国完整版观看电影| 新活佛济公全集| 驯服小峓子理伦片在线播放| 女生黏糊糊的水哄睡| :《Le Trou》(2019)| 广州火车站售票时间| 肉蒲团之夜销魂 贵妃| 飚车电影| 龙器电视剧在线看免费观看| 《法国空乘5》在线| 情欲网咖| 《亲爱的小孩》免费播放| 《和讨厌的部长出差旅》在线 | WWW.00271.色情网| 《她被搬运工侵犯在线播放| 画皮之阴阳法王完整版免费观看 | 神印王座在线看| 《银鞋》荷兰/2015| 《爱上平行时空的你》| 免费韩剧| 起床了小澈| 天网追踪电视剧| 美国电影荷尔蒙6免费| 生死卧底全集| 踏血寻梅电影| 女律师的堕落日本| 面朝大海春暖花开赏析| 斗破苍穹176免费播放| 东京复仇者动漫二季免费观看| 情牵百子柜| 做aj的免费视频大全电视剧免费| 美妙旋律第三季| 鬼父 下卷| 朱莉安妮监狱的电影叫什么名字来着| 风中奇缘全集| 《北越暴行》免费观看高清 | 步步青莲电视剧免费观看完整版| 《初体验5》电影完整版在线观看| 电影《地爆天星》免费观看| 指尖传出的真挚热情未增减第一季| 糖果盒子| 厨房激情3日本| 电视剧武则天全集| 麦乐迪满天星HD版| 神探王妃:破案超神全集免费| 终极斗士3| 美女与野兽暴操老妈46| 团鬼六电影免费版全集在线观看| 黑鹰坠落满天星女版| 春花秋月何时了电视剧| 国模 雅雅| 正在播放:JUL-601 你真的是处男吗?因为发现丈夫出轨被自称童贞的男子欺骗身心 | 我和大佬第二季免费看完整版| 厨房的岳 90分钟| 老铁APP| 陆贞传奇52| 咒怨 白老妇| 今晚佳片有约| 美国妈妈需要播种在线电影吗| 姜小姐她下山了短剧免费观看| 中国新说唱第三季| 《需要爸爸种子电影| 哈利波特3国语版| 高清后座未删减| 人与畜禽日韩| 我的上司尺码是XL类似| 白手空拳| 高清《红杏出墙》无删减在线观看 | 电视剧恋人| 夫妻俱乐部在线观看| 我的邻居正在付出一切党整版| 菲梦少女第二季免费观看26集全套| 电影美人鱼传说| 98古惑仔在线观看粤语版| 毒医肥尸电影在线完整版| 薛丁山传奇全集| 善良漂亮的岳5| 《V酒店第一季》在线播放| 我的8848| 工作女郎韩国| 金瓶梅五级电视剧视频观看| 佐藤江梨| 25岁的女高学生无删樱花| 莫莉的特殊酒店电影免费观看| 斗罗大陆第134集免费| 有见一帘幽梦| 高清《屈原》| 望向太阳电影| 朝鲜战争 王树增| 《超女麦乐迪》在线播放| 高h乱np甄宓| 圣斗士传说| 野外求生全集完整版| 恶少的爱妻| 需要爸爸播种籽在线观看| 我唔讲粗口| 《斯巴达2帝国女版》在线| 轮奸电影在线观看| 帝王计划:怪兽遗产| 欢愉电影完整版免费观看| 《伊波拉病毒2》未删版| 高清特权未删减| 刘欢近况最新消息| 坎贝奇品味人生完整观看 | 美丽的水蜜蜂第一季免费观看 | 繁花沪语版| 监狱风云在线观看| 法国空姐5免费高清原声满天星美版百度 | 法国高2压监狱| 在暴雪时分大结局点映礼| 青春禁区免费完整版观看| 秦雪梅吊孝| 小离别电视剧免费全集观看| 听泉鉴宝最恐怖的一集| 三年高清免费观看在线播放| 高清《情妇》| 黑暗荣耀第一季无删减在线观看| 入室暴行3被蹂躏在线观看| 年青的嫂子| 姐姐的朋友3中文字线观高清 | 经典娃娃脸电影| 筋疲力尽| 女版战狼14免费观看完整版 | 暴躁少女的全集| 两人电影免费完整观看| 播放郭德纲相声| 美国《炸天小姐》| 密爱朋友的妈妈2| 恶意编年史| 欧美版战狼9电影免费观看| 第一滴血1国语高清| 米小圈上学记电视剧| 《最高的爱人诏》免费观看 | 爱我生活| 女版战狼6三人| 公之浮之中字在线观看| 长相思1—40集电视剧免费| 法国凌云壮志成版2011| 实况足球8国际中文解说版| 如果我爱你全集剧情| 公的浮之手2电影免费观看| 火山高校下载| 刑侦12| 《社长夫人》天使萌演员表| 《我们是坏蛋理发师》| 电视剧西施秘史全集| 欧美日韩一卡二卡| 康斯坦丁第一季| 理伦三级我的女朋友妈妈三| 隐形帽子韩国电影| 进球吧少年| 春晚贺电| 我要爸爸的种子第一季免费观看| 鬼吹灯之牧野诡事第二季电视剧| 《重逢在雪落之前》短剧| 莺长女儿满天星| 《我爱的女人》完整版| 亲爱的她们| 酒店1-100集全部免费观看| 那曲在线| 神话优酷| 牝教师4免费在线观看 | 太仆寺旗| 激情电影院| 家和万事兴亮亮结局| 哇嘎视频在线免费观看| 电影《女校长》完整版| 色戒在线观看电影完整版在哪看| 朴英善《爱的释放》歌曲| 铃木美恵子| 刑警队长电视剧全集免费观看高清| 倔强驱魔师1-5集免费动漫| 鬼女魔咒| 澳网男单决赛辛纳对阵梅德韦杰夫| 女版战狼6全集免费看| 魔鬼球员| 朋友的妈妈在线免费| 味道2在线观看免费完整版电视剧| 啄木鸟系列电影女拳击手在线观看| 德田重男电影免费观看中文版| 无敌视频在线影院| 东方卫视电视剧品质盛典| 花子vs倔强驱魔在线观看| 三体在线高清免费观看完整版| 表演系的故事| 韩国三级维修师傅的艳遇| 假日暖洋洋2电视剧在线观看| 你并不懂我歌词| 牙医姐妹赤子板栗完整版 | 《火花》电影| 阿荣旗| 漠风吟电视剧免费观看| 动漫解说一口气看完| 大内密探零零性性| 谈判专家粤语在线观看| 一打开就是立体的贺卡| 暴走财神1| 日本电影牙医姐妹在线观看| 白发魔女传电影| 处女夜记| 美国家庭禁忌| 万万没想到短剧全集 | 姜素拉影院三级在线观看| 大峡谷遗宝| 香港李嘉诚发声| 1—5集免费普通话版| 风雷动电视剧| 危险追逃电视剧| 韩国小电影男子获得遥控器控制女领导| 电视剧内幕| 寄宿电影| 爱我几何无删减版| 苍老师10部必看经典电影| 飞屋环游记电影国语版免费版观看| 战狼6老姨免费观看全集高清| 海棠经雨胭脂透电视剧免费观看| 守护天使国语版| 小瘦子中文版免费观看| 电视剧绝对权力| 电影风月宝鉴之暴情狂魔免费观看| 纸钞屋在线观看免费观看完整版| 布兰迪《不当军事行为》在线| 电影灯草和尚高清免费普通话版| 我的自由年代7| 91制造厂在线免费观看| 黑夜彩虹粤语| 恶魔的艺术2:邪降恐怖电影| 电影《渔夫荒淫史》| 独家记忆百度云| 后窗免费| 遂平县| 圣特佩罗斯的姑娘们| 深情眼全集免费完整版| 《战国》| 柔铺团之极宝乐鉴普通话完整版电影百度云盘 | 山西科教频道| 新金瓶梅2qvod| 一个人的江湖| 金银梅第10集免费观看| 后宅争斗短剧全集| 印度电影海誓山盟| HD版激战丛林| 迈克杰克逊演唱会高清下载| 巡回检察组在线观看全集| 特派外卖员在线视频免费观看| 罗小黑战记动漫| 遍地狼烟电影下载| 木下凛凛子的电影| 复仇者联盟在线观看| 爱情睡醒了28| 大笑喜剧人| 总统夫人星克莱尔哪里能看| 妻子的滋味电影| 新潘金莲高清完整版| 美容院的待遇5中文| 五号特工组百度影音| 史前巨鳄2| 《麻将棒棒手》免费观看全集| 女篮坎贝奇无憾 在线观看| 我们多么幸福歌词| 大夏傻神之逆袭| 我女友的妈妈双字ID免费韩剧| 天剑绝刀之独孤九剑| 韩国电影医生高清完整版在线观看| 法国监狱2高清完整版| 罗丽星克莱尔电影在线观看免费| 三只羊沫沫去年12月被拘留| 快乐再出发综艺| 哇嘎嘎在线电影观看| 召唤恶魔阿萨谢尔| 洛丽塔百度影音| 学生妈妈5字| 修理工绝遇中文版| 与狼共舞2| 熏肉怎么吃| 西部通缉令180分钟| 水浒传2011| 青春须早为电视剧免费观看| 电影《呼吸》| 黑白配HD1080完整版中文版| 李月仙杏林春暖| 黄金未来5年还会到500以下吗 | 美丽小蜜桃4荷尔蒙| 天降之物动画| 聊斋艳谭之欲焰三娘| 人鬼神国语| 天海翼女教师无删减版| 木匠奇事电视剧在线观看| 中国远征军 下载| 永生第四季海噬仙灵免费观看| 麦乐迪和父亲故事电影叫什么| 变形金刚2电影| 鸟鸟主持星光大赏| pppd258| 妖怪少女石榴| 爱情男女全集免费观看免费| 暴走三金| 古墓丽影山寨版免费观看| 隐身的名字未删减| 成仁高清影视| 销售员的销售秘密2免费观看| 赖小子完整版| 同桌的你免费| 《极乐宝鉴》在线观看| 蘑菇一个好妈妈HD7字的答案| 背着善宰跑一共多少集| 第一滴血3电影| 北条麻妃作品番号| 美容院的待遇8免费观看| 完美搭档电影| 办公室有鬼| 《美丽妻子替丈夫还债| 正品日本高清dvd碟片生活版| 川西剿匪记电视剧全集免费观看| 家门的荣光分集介绍| 动感之星 妖精 全集| 头文字d免费观看完整普通话| 亮剑李幼斌版| 《女生宿舍》2免费观看| 老板办公室在线观看| 整容日记下载| 电影灯草和尚高清免费普通话版| 电视剧非缘勿扰大结局| 电影商务旅行戴绿帽在线观看| 野狼王的士高| 神奇宝贝bw110| 克莱尔《总统之夜》| 新撰组异闻录 铁| 电视剧重返上海滩| 银翼杀手| 沂蒙山小调原唱| 爱在春天电视剧免费观看| 电影角色王凤仪| 商务旅行戴绿色的帽子| 黎明之前电视剧在线观看完整版| 上门女婿完整版高清免费全集| 日本电影《特殊游泳老师》的编剧是| 海盗战队豪快者| 金钱追杀令| 韩剧《邻家女孩》免费观看| 凯登克罗斯| 没戴奶罩的瑜伽教练| 电竞国家集训队集体亮相| 终极三国全集| 台湾卖房女销售电影| 赘婿当道全集免费| 三姐妹电影| 《陆判官仙根》徐锦江在线观看 | 小凤的新婚| 太子妃是武林高手全集免费| 妖刀记第二部| 初恋时间第一集在线观看免费高清| 岳母味道| 温柔的背后全集在线观看| 澳门回归22周年| 局内人韩国电影| 部长的千金和我一起出差电影完整版| 大秦帝国第2部| 后院露营| 四位大学位按摩记电子版pdf百度网盘 | 爱了散了全集| 《她被搬运工侵犯》电影观看| 默杀在线观看完整免费高清| 谁是真凶| 电影《爱很烂》完整版在线观看| 电影《牙医姐妹》在线看| 等你爱我mv| 王君安越剧名段欣赏| 惊声尖笑1免费完整版在线播放| 最高の爱人诏三上松泽在线| 巾帼枭雄国语| 看得见的女孩动漫全集观看| 江湖往事| 高压监狱2免费播放完整版| 类似3d肉蒲团的电影| 暖暖请多指教电视剧| 电影《青蛇》在线观看| 需要爸爸播种美国种子的电影| 雪山飞狐免费观看完整版| 西安黑灯舞厅| 公之孚手中字9| 塔日酒店电影在线观看| 姐姐的朋友4在线观看| 斗罗大陆263集免费观看全集| 纪光莉替夫还债的电影免费观看| 虎踞龙盘电视剧| 自古英雄出少年免费观看完整版| 爱我就别想太多在线观看免费全集| 出差未婚妻被最讨厌的领导欺负| 妖精视频在线免费观看| 我和大佬第二季免费看完整版| XZL仙踪林XZL视频网站| 《女销售员的销售秘密》| 爱上特种兵全集| 小猪佩奇mp3| 芭比之时尚奇迹中文版全集| 银瓶梅电视剧全集电视剧| 沐浴之王高清免费完整版| 闺蜜的秘密| 孤注一掷在线观看高清免费张艺兴 | 白话易经| 梨汁气泡11H| 电影《姐妹牙医》正片| 电视剧与狼共舞| 朋友的女儿2| 归晓路晨电视剧免费观看| 荣誉守则电影| 两个人高清在线观看免费| 动物园办虎兔交接兔子差点被加餐| 执迷1V2海棠| 情从林| 无人区高清在线观看完整版| DTF圣路易日记电视剧| 直击五一返程路况| 黑白潜行2 电影| 成熟玫瑰| 王屋下的传说| 胶囊旅馆樱花未增删| 布兰迪《军事不当行为2》在线播放| 星际之门 第一季| 湖南卫视跨年演唱会2014| 中国式离婚 电视剧| 白峰电影全集免费全集| 空中堡垒| 仙逆更新至96集在线| 《亲爱的》全集免费观看| hd版泰山《激战丛林》中文字幕完整版在线观看| 我的大佬的365第三季在线观看| 我在北京挺好的剧情| 我家有喜 tv版 电视剧| 3d柔铺团之极宝乐鉴宝鉴电影中文百度网盘| 十佳球背景音乐| 人工少女3服装存档| 黑帮大佬和我的365日在线观看| 斯巴达第四季39集剧情| 需要爸爸播种孑伦理电影| 疾风知劲草下一句| 《愤怒的小鸟》| 三方国界在线观看完整免费版| 《插曲的痛免费观看》中文版| 我亲爱的小洁癖电视剧免费观看| 斗罗大陆162| 电视剧郑和西洋免费观看| 美国伦理电影需要爸爸播种 | 争宠之妃位攻略短剧全集| 向着新中国前进| 胜女的代价2在线观看| 《over flower》1~8集动漫| 哪吒2之魔童闹海在线免费完整版| 漂白在线播放| 我哥我嫂电视剧全集50集大结局| 独狼电视剧全集高清| 在线观看视频《瓜达卢佩的玫瑰》| 宫斗逆袭短剧全集| 啄木鸟系列电影女拳击手在线观看| 迪丽娜尔女儿| 黄真伊在线观看韩剧网电视剧| 需要父亲的种子2| 哈利波特3普通话| 岳母的幸福生活百度影音| 庆余年手机免费观看| 安西县| 木下檀檩子点外卖的电影| 那英真唱搁浅| 我家三爷超宠的全集视频| 傅玄屹魏语娴全文免费结局| 《时间静止》完整版| 美景之屋6手机在线免费观看| 初音未来h小游戏| 中国电影免费高清观看| 镉超标大米| 兄弟老婆| 泌尿外科女医生| 风起陇西免费观看完整版| 陕西桥梁垮塌已致12死31失联| 三更之饺子第一集|