C語言程序設計結構體_第1頁
C語言程序設計結構體_第2頁
C語言程序設計結構體_第3頁
C語言程序設計結構體_第4頁
C語言程序設計結構體_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 n9.1 結構體類型結構體類型n9.2 結構體變量結構體變量n9.3 結構體數(shù)組結構體數(shù)組n9.4 結構體指針結構體指針n9.5 鏈表概述鏈表概述n9.6 鏈表的基本操作鏈表的基本操作n學生信息表與結構體數(shù)據(jù)學生信息表與結構體數(shù)據(jù)n在程序中使用結構體數(shù)據(jù)的一般過程在程序中使用結構體數(shù)據(jù)的一般過程u 針對具體的組合數(shù)據(jù),定義專門針對具體的組合數(shù)據(jù),定義專門的結構體數(shù)據(jù)類型。的結構體數(shù)據(jù)類型。u 使用定義好的數(shù)據(jù)類型,定義要使用定義好的數(shù)據(jù)類型,定義要使用的結構體變量。使用的結構體變量。u 使用定義的結構體變量存儲和表使用定義的結構體變量存儲和表示結構體數(shù)據(jù)。示結構體數(shù)據(jù)。n定義結構體類型的一般

2、格式定義結構體類型的一般格式struct 結構體名結構體名 成員表成員表;說明:說明: “結構體名結構體名”是用戶定義的結構體的名字,在以后定義結構體變是用戶定義的結構體的名字,在以后定義結構體變量時,使用該名字進行類型標識。量時,使用該名字進行類型標識。 “成員表成員表”是對結構體數(shù)據(jù)中每一個數(shù)據(jù)項的變量說明,其格式是對結構體數(shù)據(jù)中每一個數(shù)據(jù)項的變量說明,其格式與說明一個變量的一般格式相同,如下:與說明一個變量的一般格式相同,如下:數(shù)據(jù)類型名數(shù)據(jù)類型名 成員名成員名; “struct”是關鍵字,是關鍵字,“struct結構體名結構體名”是結構體類型標識符,是結構體類型標識符,在類型定義和類型

3、使用時在類型定義和類型使用時“struct”都不能省略。都不能省略。 結構體名稱可以省略,此時定義的結構體稱為無名結構體。結構體名稱可以省略,此時定義的結構體稱為無名結構體。如下是對學生組合數(shù)據(jù)的結構體類型定義:如下是對學生組合數(shù)據(jù)的結構體類型定義:struct student int num; /* 學號學號 */ char name20; /* 姓名姓名 */ char sex; /* 性別性別 */ int age; /* 年齡年齡 */ int score; /* 成績成績 */ char addr30; /* 地址地址 */;當結構體的成員又是結構體時,稱為當結構體的成員又是結構體時

4、,稱為結構體的嵌套結構體的嵌套。struct date int month; int day; int year; struct stud int num; char name20; char sex; int age; struct date birthday; char addr30;stud1,stud2; 先定義結構體類型,再定義結構體變量。先定義結構體類型,再定義結構體變量。n一般格式一般格式struct 結構體類型名稱結構體類型名稱 結構體變量名;結構體變量名;如:如:struct student student1,student2; 在定義結構體類型的同時定義結構體變量。在定義結

5、構體類型的同時定義結構體變量。n一般格式如下:一般格式如下:struct 結構體名結構體名 成員表成員表結構體變量結構體變量1, 結構體變量結構體變量2,結構體變量,結構體變量n;例如:例如:struct studentint num; char name20;char sex;int age; int score;char addr30; student1, student2; 不定義結構體類型名,直接定義結構體類型變量。不定義結構體類型名,直接定義結構體類型變量。n一般格式如下:一般格式如下:struct 成員表成員表;結構體變量結構體變量1,結構體變量結構體變量2,結構體變量結構體變量n

6、;例如:例如:structint num; char name20;char sex;int age; int score;char addr30;student1, student2;n引用結構體成員的一般格式引用結構體成員的一般格式結構體變量名結構體變量名.成員名稱成員名稱如:如:student1.agen“.”是結構體成員運算符,是結構體成員運算符,“.”操作的優(yōu)先級在操作的優(yōu)先級在語言中是最高的,其結合性為從左到右。語言中是最高的,其結合性為從左到右。 n例例9-1 輸入一個學生的一組數(shù)據(jù),然后輸出其姓輸入一個學生的一組數(shù)據(jù),然后輸出其姓名、年齡和地址。名、年齡和地址。程序程序9-1說

7、明:說明: 對結構體變量進行輸入輸出時,只能以成員引用的方對結構體變量進行輸入輸出時,只能以成員引用的方式進行,不能對結構體變量進行整體的輸入輸出。式進行,不能對結構體變量進行整體的輸入輸出。 當成員又是一個結構體類型時,若要引用它的成員,當成員又是一個結構體類型時,若要引用它的成員,要從高到低逐級引用。如:要從高到低逐級引用。如: 與其他變量一樣,結構體變量成員可以進行各種運算與其他變量一樣,結構體變量成員可以進行各種運算。 n結構體變量的初始化結構體變量的初始化,是在定義,是在定義結構體變量的同時,對其成員賦結構體變量的同時,對其成員賦初值。初值。n結構體變量初始化的一般形式結構體變量初始

8、化的一般形式struct 結構體名結構體名 結構體變量結構體變量=初初始化數(shù)據(jù)始化數(shù)據(jù);n說明:說明: “ ”中的初始化數(shù)據(jù)用逗號中的初始化數(shù)據(jù)用逗號“,”分隔。分隔。 初始化數(shù)據(jù)的個數(shù)與結構體成員初始化數(shù)據(jù)的個數(shù)與結構體成員的個數(shù)應相同,它們是按成員的的個數(shù)應相同,它們是按成員的先后順序一一對應賦值的。先后順序一一對應賦值的。 每個初始化數(shù)據(jù)必須符合與其對每個初始化數(shù)據(jù)必須符合與其對應的成員的數(shù)據(jù)類型。應的成員的數(shù)據(jù)類型。例如:struct student int num; char name20; char sex; int age; int score; char addr30;stu=

9、9901,liujia,M,19,87,shanghai;數(shù)組元素是結構體類型的數(shù)組,稱為結構體數(shù)組。定義方法與其他結構體變數(shù)組元素是結構體類型的數(shù)組,稱為結構體數(shù)組。定義方法與其他結構體變量的定義方法相同量的定義方法相同 。 先定義結構體類型,然后用結構體類型定義數(shù)組變量。先定義結構體類型,然后用結構體類型定義數(shù)組變量。如:如:struct student information100;引用結構體數(shù)組成員的一般格式:引用結構體數(shù)組成員的一般格式:結構體數(shù)組名結構體數(shù)組名下標下標.成員名成員名如:如:information20.score=91; 定義結構體類型的同時,定義數(shù)組變量。定義結構體

10、類型的同時,定義數(shù)組變量。 定義無類型名的結構體數(shù)組變量。定義無類型名的結構體數(shù)組變量。例如:例如:struct int year; int month; int day; date110,date210;n結構體數(shù)組的初始化結構體數(shù)組的初始化,就是在定義結構體數(shù)組,就是在定義結構體數(shù)組的同時,為結構體數(shù)組元素賦初值。的同時,為結構體數(shù)組元素賦初值。n例如:例如:struct student info3= 9901,liujia,M,19,87,shanghai,9902,wangkai,M,18,89,beijing,9903,xiaohua,F,20,81,qingdao;例例9-2 按照

11、表按照表9-1的數(shù)據(jù)情況,輸入一個班級的學生信的數(shù)據(jù)情況,輸入一個班級的學生信息,并進行如下處理:息,并進行如下處理: 把學習成績在把學習成績在85以上的學生找出來,并輸出這部分以上的學生找出來,并輸出這部分學生如下信息:姓名、成績、地址。學生如下信息:姓名、成績、地址。 分別統(tǒng)計出男生和女生人數(shù)。分別統(tǒng)計出男生和女生人數(shù)。分析:分析:這個問題可以分成三個步驟處理:這個問題可以分成三個步驟處理: 定義一個結構體類型,并用它定義一個存儲學生信息定義一個結構體類型,并用它定義一個存儲學生信息的結構體數(shù)組;的結構體數(shù)組; 向結構體數(shù)組中輸入學生數(shù)據(jù);向結構體數(shù)組中輸入學生數(shù)據(jù); 統(tǒng)計,并輸出結果。統(tǒng)

12、計,并輸出結果。程序程序9-2n指向結構體變量的指針,稱為指向結構體變量的指針,稱為結構體指針結構體指針。與其他類型的指針一樣,結構體指針既可與其他類型的指針一樣,結構體指針既可以指向單一的結構體變量,也可以指向結以指向單一的結構體變量,也可以指向結構體數(shù)組變量,結構體指針還可以作函數(shù)構體數(shù)組變量,結構體指針還可以作函數(shù)的參數(shù)。的參數(shù)。 n定義結構體指針變量的一般形式:定義結構體指針變量的一般形式:struct 結構體名結構體名 *結構體指針變量名結構體指針變量名;例如:例如:struct student *p,*q;struct student stud1,info10;p=&stu

13、d1; / * p指向結構體變量指向結構體變量stud1 */q=info; /* q指向結構體數(shù)組變量指向結構體數(shù)組變量info */n指向結構體變量的指針,稱為指向結構體變量的指針,稱為結構體指針結構體指針。與其他類型的指針一樣,結構體指針既可與其他類型的指針一樣,結構體指針既可以指向單一的結構體變量,也可以指向結以指向單一的結構體變量,也可以指向結構體數(shù)組變量,結構體指針還可以作函數(shù)構體數(shù)組變量,結構體指針還可以作函數(shù)的參數(shù)。的參數(shù)。 n定義結構體指針變量的一般形式:定義結構體指針變量的一般形式:struct 結構體名結構體名 *結構體指針變量名結構體指針變量名;例如:例如:struct

14、 student *p,*q;struct student stud1,info10;p=&stud1; / * p指向結構體變量指向結構體變量stud1 */q=info; /* q指向結構體數(shù)組變量指向結構體數(shù)組變量info */n對指向結構體數(shù)組的指針,當指針進行加對指向結構體數(shù)組的指針,當指針進行加1或或減減1運算時,其結果就是將指針指向上一個或運算時,其結果就是將指針指向上一個或者下一個結構體數(shù)組元素。者下一個結構體數(shù)組元素。 例例9-4 結構體指針用法示例。結構體指針用法示例。#include stdio.h#include string.hstruct stud char

15、 *number; char name20; int score;main() struct stud student,*p; p=&student; p-number=991001; strcpy(p-name,changjiang); student.score=91; printf(n); printf(student No.%snname:%snscore:%dn,p-number,p-name,p-score); 例例9-5指向結構體數(shù)組指針的應用示例。指向結構體數(shù)組指針的應用示例。#include stdio.hstruct stud char *number; char

16、name20; int score;stu3=990103,xiaohua,81,990104,zhangli,82,990105,wangfeng,88;main() struct stud *p; printf(nstudent No. name scoren); for(p=stu;pnumber,p-name,p-score);例例9-8用結構體指針作函數(shù)的參數(shù),改寫例用結構體指針作函數(shù)的參數(shù),改寫例9-7的程序。的程序。#include stdio.h#define N 5 /* 全班學生數(shù)全班學生數(shù) */struct stu_info char num7; /* 學生學號學生學號

17、*/ int score; stu=990101,87,990102,89,990103,81,990104,82,990105,88; main ( ) void sort_stu(struct stu_info *,int); /* 排序函數(shù)聲明排序函數(shù)聲明 */ int i; sort_stu(stu,N); for(i=0;iN;i+) /* 輸出結構體數(shù)組元素輸出結構體數(shù)組元素 */ printf(%-10s%dn,stui.num,stui.score);void sort_stu(struct stu_info *p,int n) int i,j; struct stu_info

18、 temp; /* 定義結構體變量,用于結構體數(shù)據(jù)的交換定義結構體變量,用于結構體數(shù)據(jù)的交換 */ for(i=1;in;i+) /* 冒泡法排序,降序冒泡法排序,降序 */ for (j=0;jN-i;j+) if(pj.scorenext=p-next; 把把new的首地址存儲到結點的首地址存儲到結點p的指針域中。的指針域中。p-next=new;例例9-9 用插入結點的方法建立圖示的學生成績鏈表,鏈表用插入結點的方法建立圖示的學生成績鏈表,鏈表head有有10個結點,每個結點存儲一個學生的學號和學個結點,每個結點存儲一個學生的學號和學習成績數(shù)據(jù)。習成績數(shù)據(jù)。程序程序9-9n函數(shù)的功能函數(shù)

19、的功能ucreat_node()函數(shù):生成一個鏈表結點。函數(shù):生成一個鏈表結點。ucreat_list()函數(shù):生成有函數(shù):生成有n個個struct s_node型結型結點的鏈表,函數(shù)的返回值是鏈表的頭指針。點的鏈表,函數(shù)的返回值是鏈表的頭指針。uout_list()函數(shù):用于輸出函數(shù):用于輸出head鏈表的各結點值。鏈表的各結點值。n從鏈表中刪除結點,就是撤銷結點在鏈表中的鏈接,把結點從鏈表從鏈表中刪除結點,就是撤銷結點在鏈表中的鏈接,把結點從鏈表中孤立出來。在鏈表中刪除結點一般有兩個過程:中孤立出來。在鏈表中刪除結點一般有兩個過程:u把指定的結點從鏈表中拿下來,它需要通過修改有關結點的指把

20、指定的結點從鏈表中拿下來,它需要通過修改有關結點的指針域來實現(xiàn);針域來實現(xiàn);u釋放該結點使用的內(nèi)存空間,它需要使用釋放該結點使用的內(nèi)存空間,它需要使用free()函數(shù)來實現(xiàn)。函數(shù)來實現(xiàn)。 刪除刪除p結點的過程:結點的過程: 若若p結點是鏈表的第一個結點,則將結點是鏈表的第一個結點,則將p指針域的地址保存到指針域的地址保存到head中,中,使使p的后繼結點成為的后繼結點成為head鏈表的第一個結點,然后轉(zhuǎn)步驟鏈表的第一個結點,然后轉(zhuǎn)步驟。修改指針的操作如下:修改指針的操作如下:head=head-next;或或head=p-next; 若若p結點不是鏈表的第一個結點,則首先從結點不是鏈表的第一個

21、結點,則首先從head開始,找到開始,找到p結點結點的前一個結點的前一個結點q,然后使,然后使q的指針域存儲的指針域存儲p的后繼結點的地址,這樣的后繼結點的地址,這樣沿鏈表的指針訪問鏈表中的結點時,沿鏈表的指針訪問鏈表中的結點時,p結點將不會被訪問到,亦即結點將不會被訪問到,亦即p結點從鏈表結點從鏈表head中被刪除了。中被刪除了。修改指針的操作如下:修改指針的操作如下:q-next=p-next; 釋放釋放p結點使用的內(nèi)存空間。結點使用的內(nèi)存空間。free(p); 刪除結刪除結點點p后后的的head鏈表鏈表 : n在鏈表中進行查找,就是從鏈表的第一個結點開始,沿在鏈表中進行查找,就是從鏈表的

22、第一個結點開始,沿著指針鏈,用查找值與鏈表結點逐個比較的過程。找到著指針鏈,用查找值與鏈表結點逐個比較的過程。找到符合要求的結點之后,停止查找過程,返回相應結點的符合要求的結點之后,停止查找過程,返回相應結點的指針,否則返回一個空指針。指針,否則返回一個空指針。n在在head鏈表中查找鏈表中查找data值為值為m的結點的過程,其中的結點的過程,其中p為為struct node型指針:型指針:u p=head;u 當當pNULL時,若時,若p-data=m,則找到要求,則找到要求結點,查找結束,返回結點地址結點,查找結束,返回結點地址p;否則,執(zhí)行下一;否則,執(zhí)行下一步步;當;當p= NULL時

23、,鏈表中不存在要找的結點,時,鏈表中不存在要找的結點,查找結束,返回空指針查找結束,返回空指針NULL;u p=p-next;u 重復重復、步驟。步驟。查找函數(shù)查找函數(shù)find() :#include stdio.hstruct node *find(struct node *head,int m) struct node *p=head; while(p!=NULL&p-data!=m) p=p-next; if(p=NULL) return(NULL) else return(p);例例9-10對圖示的對圖示的head鏈表,刪除其值是鏈表,刪除其值是x的結點。具體要的結點。具體要求

24、如下:求如下: 輸出被刪除結點的值;輸出被刪除結點的值; 當指定值結點不存在時,顯示一個提示信息;當指定值結點不存在時,顯示一個提示信息; x的值由鍵盤輸入。的值由鍵盤輸入。n分析:分析:該問題的關鍵點有兩點:該問題的關鍵點有兩點:u查找查找data等于等于x的結點的結點p;u刪除刪除p結點。結點。程序程序e9-10 n例例9-11 Josephus問題問題有有n個人圍成一圈,從個人圍成一圈,從1開始順序編號到開始順序編號到n,現(xiàn)在從,現(xiàn)在從1號開號開始順時針從始順時針從1數(shù)數(shù),數(shù)到數(shù)數(shù),數(shù)到m者自動出列,然后從下一個人者自動出列,然后從下一個人開始重新數(shù)數(shù),仍然每次數(shù)到開始重新數(shù)數(shù),仍然每次

25、數(shù)到m者自動出列。請給出這者自動出列。請給出這n個人出列的順序。個人出列的順序。方法:方法:用循環(huán)鏈表用循環(huán)鏈表 解決解決Josephus問題問題n用循環(huán)鏈表實現(xiàn)用循環(huán)鏈表實現(xiàn)Josephus問題的基本算法問題的基本算法首先設置首先設置p指針,其初值為指針,其初值為head。然后開始對。然后開始對p指向的結指向的結點數(shù)數(shù),每數(shù)一個結點后,點數(shù)數(shù),每數(shù)一個結點后,p指針便沿指針鏈下移一個位指針便沿指針鏈下移一個位置(置(p=p-next),指向下一個結點。當),指向下一個結點。當p指向的結點數(shù)指向的結點數(shù)到到m時,輸出該結點的值并將其從鏈表中刪除(出列),時,輸出該結點的值并將其從鏈表中刪除(出

26、列),這時使這時使p指向下一個結點,然后從指向下一個結點,然后從1開始重新數(shù)數(shù)。當鏈表開始重新數(shù)數(shù)。當鏈表中只有一個結點時,數(shù)數(shù)結束,輸出該結點。中只有一個結點時,數(shù)數(shù)結束,輸出該結點。 只有一個結點只有一個結點的循環(huán)鏈表的循環(huán)鏈表程序程序9-111結構體是一種新型的數(shù)據(jù)類型,它與前面使用的數(shù)據(jù)類型的主要區(qū)結構體是一種新型的數(shù)據(jù)類型,它與前面使用的數(shù)據(jù)類型的主要區(qū)別有兩點:別有兩點:u結構體數(shù)據(jù)類型不是系統(tǒng)固有的,它需要由用戶自定義,在一個結構體數(shù)據(jù)類型不是系統(tǒng)固有的,它需要由用戶自定義,在一個程序中可以有多個各不相同的結構體類型;程序中可以有多個各不相同的結構體類型;u一個結構體數(shù)據(jù)類型是多

27、個不同成員的集合,這些成員可以具有一個結構體數(shù)據(jù)類型是多個不同成員的集合,這些成員可以具有不同的類型。不同的類型。2“struct”是結構體數(shù)據(jù)類型的關鍵字,定義和使用結構體類型時都是結構體數(shù)據(jù)類型的關鍵字,定義和使用結構體類型時都必須使用該關鍵字。必須使用該關鍵字。3結構體變量的定義有結構體變量的定義有3種方法:先定義結構體類型,再定義結構體變種方法:先定義結構體類型,再定義結構體變量;在定義結構體類型的同時定義結構體變量;不定義結構體類型名,量;在定義結構體類型的同時定義結構體變量;不定義結構體類型名,直接定義結構體類型變量。直接定義結構體類型變量。4引用結構體成員的方法主要有兩種:使用結構體變量名引用結構體引用結構體成員的方法主要有兩種:使用結構體變量名引用結構體成員;通過指向結構體變量的指針引用結構體成員。成員;通過指向結構體變量的指針引用結構體成員。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論