




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1第11章結構體與共用體西南大學計算機與信息科學學院C
語言程序設計1第11章結構體與共用體西南大學計算機與信息科學學院C2022/12/232第11章結構體與共用體11.1結構體
結構體類型
結構體變量的定義、初始化、運算
結構體指針
結構體與函數(shù)
結構體的應用——鏈表
2022/12/162第11章結構體與共用體11.1結構2022/12/233一個學生的信息有學號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關數(shù)據(jù)?11.1結構體11.1.1結構體與結構體類型的定義?信息管理結構體——一種構造類型數(shù)據(jù)
結構體由若干不同類型的數(shù)據(jù)項組成,構成結構體的各個數(shù)據(jù)項稱為結構體成員。2022/12/163一個學生的信息有學號、姓名、性2022/12/234
struct結構體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;
};11.1結構體11.1.1結構體與結構體類型的定義結構體類型定義的一般形式:
struct為關鍵字;結構體名是用戶定義的類型標識。{}中是組成該結構體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。2022/12/164struct結構體名11.1結2022/12/235例如圖書類型的定義:
structbookcard{charnum[10];/*圖書分類編號是字符數(shù)組類型*/charname[30];/*書名是字符數(shù)組類型*/
charauthor[30];/*作者是字符數(shù)組類型*/charpublisher[60];/*出版社是字符數(shù)組類型*/
floatprice;/*價格是單精度實型*/
intn;/*庫存量是整型*/
};例如學生類型的定義:structstudent{charnum[8];/*學號是字符數(shù)組類型*/charname[30];/*姓名是字符數(shù)組類型*/charsex;/*性別是字符型
*/intage;/*年齡是整型
*/
charaddr[60];/*住址是字符數(shù)組類型*/intscore[6];/*成績是整型數(shù)組類型*/
};11.1結構體11.1.1結構體與結構體類型的定義2022/12/165例如圖書類型的定義:例如學生類型的定2022/12/23611.1結構體11.1.2結構體變量的定義與初始化1.結構體類型變量的定義
利用已定義的結構體類型名定義變量struct結構體名
變量名表;例如:structbookcardbook1[100];structstudents[30],t1,t2;按照結構體類型的組成,系統(tǒng)為定義的結構體變量分配內(nèi)存單元。結構體變量的各個成員在內(nèi)存中占用連續(xù)存儲區(qū)域,結構體變量所占內(nèi)存大小為結構體中每個成員所占用內(nèi)存的長度之和。structstudentnum8個字節(jié)name30個字節(jié)sex1個字節(jié)age2個字節(jié)addr60個字節(jié)score12個字節(jié)2022/12/16611.1結構體11.1.2結構體變2022/12/23711.1結構體結構體類型與變量的說明類型與變量是不同的概念。應先定義一個結構體類型,而后再定義結構體變量。系統(tǒng)對類型不分配空間,僅對變量分配空間。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。成員也可以是結構變量。對結構中的成員,可以單獨使用,它的作用與地位相當于普通變量。成員名可與程序中的變量名相同,不同結構體類型的成員名也可相同,二者代表不同的對象。
structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;
structdatebirthday;/*成員為結構體類型*/
charaddr[60];intscore[6];
};num8個字節(jié)name30個字節(jié)sex1個字節(jié)birthdayyear2個字節(jié)month2個字節(jié)day2個字節(jié)addr60個字節(jié)score12個字節(jié)2022/12/16711.1結構體結構體類型與變量的說明2022/12/23811.1結構體11.1.2結構體變量的定義與初始化1.結構體類型變量的定義
在定義結構體類型的同時定義變量例如:structstudent{charnum[8],name[20],sex;intage;floatscore;
}st[30];struct結構體名{
成員定義表;
}變量名表;2022/12/16811.1結構體11.1.2結構體變2022/12/23911.1結構體11.1.2結構體變量的定義與初始化1.結構體類型變量的定義
直接定義結構體類型變量
例如:struct{charnum[8],name[20],sex;intage;floatscore;
}st[30],a,b,c;struct{
成員定義表;
}變量名表;2022/12/16911.1結構體11.1.2結構體變2022/12/231011.1結構體11.1.2結構體變量的定義與初始化2.結構體變量的初始化
【例】結構體變量的初始化。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b={"9608025","Zhangliming",'F',{1978,5,10},87},c;
如果初值個數(shù)少于結構體成員個數(shù),
則將無初值對應的成員賦以0值。
如果初值個數(shù)多于結構體成員個數(shù),
則編譯出錯。2022/12/161011.1結構體11.1.2結構體2022/12/231111.1結構體11.1.2結構體變量的定義與初始化2.結構體變量的初始化
【例】結構體數(shù)組的初始化。structs{charnum[8],name[20],sex;floatscore;}stu[3]={{"9606011","Liming",'M',87.5},
{"9606012","Zhangjiangguo",'M',79},{"9606013","Wangping",'F',90}};
元素的個數(shù)可以省略,根據(jù)賦初值時
結構體常量的個數(shù)確定數(shù)組元素的個數(shù)
2022/12/161111.1結構體11.1.2結構體2022/12/231211.1結構體11.1.2結構體變量的定義與初始化3.結構體變量的運算
用sizeof運算符計算結構體變量所占內(nèi)存空間
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;
sizeof(a)
的結果為8+20+1+6+4=39
sizeof(structstudent)
的結果為39
2022/12/161211.1結構體11.1.2結構體2022/12/231311.1結構體11.1.2結構體變量的定義與初始化3.結構體變量的運算
同類型結構體變量之間的賦值運算結構體變量之間進行賦值時,系統(tǒng)將按成員一一對應賦值。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b,c;c=a;2022/12/161311.1結構體11.1.2結構體2022/12/231411.1結構體11.1.2結構體變量的定義與初始化3.結構體變量的運算
對結構體變量進行取址運算
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;對結構體變量a進行
&a運算,可以得到a的首地址,它是結構體類型指針。
2022/12/161411.1結構體11.1.2結構體2022/12/231511.1結構體11.1.2結構體變量的定義與初始化4.結構體變量成員的引用
結構體變量成員引用的一般形式:結構體變量名.成員名
結構體變量a的各成員可分別表示為a.num、、a.sex、a.birthday、a.score
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;“.”是分量運算符,運算級別最高。a.birthday.year
a.birthday.month
a.birthday.day
結構體變量的各個成員可進行何種運算,由該成員的數(shù)據(jù)類型決定
2022/12/161511.1結構體11.1.2結構體2022/12/231611.1結構體11.1.2結構體變量的定義與初始化【例】編寫一個統(tǒng)計選票的程序。structcandidate{charname[20];/*name為候選人姓名*/
intcount;/*count為候選人得票數(shù)*/}list[]={{"invalid",0},{"Zhao",0},{"Qian",0},
{"Sun",0},{"Li",0},{"Zhou",0}};2022/12/161611.1結構體11.1.2結構體2022/12/231711.1結構體11.1.2結構體變量的定義與初始化main(){inti,n;printf("Entervote\n");
scanf("%d",&n);/*輸入所投候選人編號,編號從1開始*/
while(n!=-1)/*當輸入編號為-1時,表示投票結束*/
{
if(n>=1&&n<=5)
list[n].count++;/*有效票,則相應候選人計票成員加1*/
else
{printf("invalid\n");list[0].count++;}/*無效票,list[0]的計票成員加1*/
scanf("%d",&n);/*輸入所投候選人編號*/
}2022/12/161711.1結構體11.1.2結構體2022/12/231811.1結構體11.1.2結構體變量的定義與初始化for(i=1;i<=5;i++)printf("%s:%d\n",list[i].name,list[i].count);printf("%s:%d\n",list[0].name,list[0].count);}2022/12/161811.1結構體11.1.2結構體2022/12/231911.1結構體1.結構體指針變量的定義
結構體指針變量定義的一般形式:
struct結構體名
*指針變量名;structdate{intyear,month,day;}*q;例如:structstudent*p;p是指向structstudent結構體變量的指針變量
11.1.3結構體的指針2022/12/161911.1結構體1.結構體指針變量2022/12/232011.1結構體11.1.3結構體的指針2.結構體成員的三種引用形式
用結構體變量名的引用形式:
d.year
d.month
d.daystructdate{intyear,month,day;}d,*p=&d;用結構體指針變量的引用形式:(*p).year(*p).month(*p).dayp->yearp->monthp->day“->”是指向結構體成員運算符,優(yōu)先級為一級
2022/12/162011.1結構體11.1.3結構體2022/12/232111.1結構體11.1.3結構體的指針
【例】輸入今天的日期,然后輸出該日期。
main() {structdate
/*在函數(shù)中定義結構體類型*/
{
intyear,month,day;
}today,*p=&today;
/*定義結構體變量及其指針*/
printf("Entertodaydate(YYYY/MM/DD):"); scanf("%d/%d/%d",&today.year,&today.month,
&today.day);printf("Today:%d/%d/%d\n",p->year,p->month,p->day); }2022/12/162111.1結構體11.1.3結構體2022/12/232211.1結構體11.1.3結構體的指針3.指向結構體數(shù)組的指針
【例】利用結構體指針輸出一組化學元素名稱及其原子量。structlist{inti;charname[4];floatw;}tab[4]={{1,"H",1.008},{2,"He",4.0026},{3,"Li",6.941},{4,"Be",9.01218}};tab數(shù)組1Htab[0]1.0082Hetab[1]4.00263Litab[2]6.9414Betab[3]9.012182022/12/162211.1結構體11.1.3結構體2022/12/232311.1結構體11.1.3結構體的指針3.指向結構體數(shù)組的指針
main(){structlist*p;printf("No\tName\tAtomicWeight\n");for(p=tab;p<tab+4;p++)printf("%d\t%s\t%f\n",p->i,p->name,p->w);}tab數(shù)組1Htab[0]1.0082Hetab[1]4.00263Litab[2]6.9414Betab[3]9.01218pppppNoNameAtomicWeight1H1.0082He4.00263Li
6.9414Be
9.012182022/12/162311.1結構體11.1.3結構體2022/12/232411.1結構體11.1.3結構體的指針【例】分析自增自減運算對程序結果的影響。structcode{inti;charc;}a[]={{100,'A'},{200,'B'},{300,'C'},{400,'D'}};a數(shù)組100a[0]'A'200a[1]'B'300a[2]'C'400a[3]'D'2022/12/162411.1結構體11.1.3結構體2022/12/232511.1結構體11.1.3結構體的指針main(){structcode*p=a;printf("%d\t",++p->i);printf("%c\t",(++p)->c);printf("%d\t",(p++)->i);printf("%c\t",++p->c);printf("%d\t",p->i++);printf("%d\n",p->i);}a數(shù)組100a[0]'A'200a[1]'B'300a[2]'C'400a[3]'D'p101'D'301101B200D3003012022/12/162511.1結構體11.1.3結構體2022/12/232611.1結構體11.1.4函數(shù)間結構體數(shù)據(jù)的傳遞方法一:在函數(shù)之間直接傳遞結構體數(shù)據(jù)。函數(shù)的形參定義為結構體變量。函數(shù)調(diào)用時,可將主調(diào)函數(shù)的結構體類型實參傳遞給被調(diào)函數(shù)的形參。方法二:使用return語句帶回數(shù)據(jù)。
如果將函數(shù)定義為結構體類型函數(shù),可利用return語句將一個結構體數(shù)據(jù)結果返回到主調(diào)函數(shù)中。2022/12/162611.1結構體11.1.4函數(shù)間2022/12/232711.1結構體11.1.4函數(shù)間結構體數(shù)據(jù)的傳遞方法三:在函數(shù)之間傳遞結構體指針。
形參定義為指向結構體類型的指針變量,可將主調(diào)函數(shù)的結構體指針傳遞給被調(diào)函數(shù)的形參變量,通過指針形參的指向域的擴展,操作主調(diào)函數(shù)中結構體變量及其成員。方法四:利用全局結構體變量傳遞結構體數(shù)據(jù)。2022/12/162711.1結構體11.1.4函數(shù)間2022/12/232811.1結構體11.1.4函數(shù)間結構體數(shù)據(jù)的傳遞
【例】編制一個復數(shù)乘法函數(shù),采用值傳遞的方
法傳送數(shù)據(jù)。structcomplex/*定義存放復數(shù)的結構體類型*/{floatre;/*re成員用于存放復數(shù)的實部*/
floatim;/*im成員用于存放復數(shù)的虛部*/};2022/12/162811.1結構體11.1.4函數(shù)間2022/12/232911.1結構體11.1.4函數(shù)間結構體數(shù)據(jù)的傳遞structcomplexmultiplier(structcomplexcx,
structcomplexcy){structcomplexcz;cz.re=cx.re*cy.re-cx.im*cy.im;cz.im=cx.re*cy.im+cx.im*cy.re;return(cz);}
形參是結構體變量。調(diào)用此函數(shù)時,
系統(tǒng)將分別為形參cx和cy各分配一個
sizeof(structcomplex)大小的內(nèi)存空間,
每個成員都要一一傳遞。
2022/12/162911.1結構體11.1.4函數(shù)間2022/12/233011.1結構體11.1.4函數(shù)間結構體數(shù)據(jù)的傳遞main(){structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;z=multiplier(x,y);printf("%f+%fi\n",z.re,z.im);/*以復數(shù)形式輸出*/}2022/12/163011.1結構體11.1.4函數(shù)間2022/12/233111.1結構體11.1.4函數(shù)間結構體數(shù)據(jù)的傳遞
【例】編制一個復數(shù)乘法函數(shù),采用傳遞指針
的方法達到傳送數(shù)據(jù)的目的。structcomplex{floatre,im;};voidmultiplier(structcomplex*px,
structcomplex*py,structcomplex*pz){pz->re=px->re*py->re-px->im*py->im;pz->im=px->re*py->im+px->im*py->re;}
形參定義為指針型參數(shù)。函數(shù)調(diào)用時,實參傳遞的
是結構體指針(地址),因此形參px、py可讀取主調(diào)函
數(shù)中變量的內(nèi)容,乘積結果也可通過形參pz指針存到主
調(diào)函數(shù)中的目標變量。
這樣實參與形參之間的數(shù)據(jù)傳遞由多值(每個成員的值)
變成了單值(結構體變量的首地址)。
2022/12/163111.1結構體11.1.4函數(shù)間2022/12/233211.1結構體11.1.4函數(shù)間結構體數(shù)據(jù)的傳遞main(){structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;multiplier(&x,&y,&z);printf("(%f+%fi)*(%f+%fi)=%f+%fi\n",x.re,x.im,
y.re,y.im,z.re,z.im);}2022/12/163211.1結構體11.1.4函數(shù)間2022/12/2333
鏈表是一種動態(tài)數(shù)據(jù)結構,可根據(jù)需要動態(tài)地分配存儲單元。在數(shù)組中,插入或刪除一個元素都比較繁瑣,而用鏈表則相對容易。但是數(shù)組元素的引用比較簡單,對于鏈表中結點數(shù)據(jù)的存取操作則相對復雜。
11.1結構體11.1.5結構體的應用——鏈表①鏈表中每個元素稱為一個結點。②構成鏈表的結點必須是結構體類型數(shù)據(jù)。1.鏈表的基本結構
head100010323284129613822008動態(tài)單向鏈表示意圖C3284H1296A1382I2008NNULL10001032③相鄰結點的地址不一定是連續(xù)的,依靠指針將
它們連接起來。structnode{charc;structnode*next;};2022/12/1633鏈表是一種動態(tài)數(shù)據(jù)結構,可2022/12/2334
C語言提供了相關的存儲管理庫函數(shù)。這里僅介紹其中三個,它們的原型說明在“stdlib.h”頭文件和“malloc.h”頭文件中,使用這三個函數(shù)時,應選擇其中一個頭文件包含到源程序中。⑴動態(tài)分配存儲區(qū)函數(shù)malloc()函數(shù)原型:void
*malloc(unsignedsize);調(diào)用格式:malloc(size)功能:在內(nèi)存分配一個size字節(jié)的存儲區(qū)。調(diào)用
結果為新分配的存儲區(qū)的首地址,是一個void
類型指針。若分配失敗,則返回NULL(即0)。11.1結構體11.1.5結構體的應用——鏈表2.動態(tài)分配和釋放存儲單元
在ANSIC標準中,關鍵字void有兩種用法。第一種用法,可將無返回值的函數(shù)定義為void類型第二種用法,用void
*
定義指針,這是一個指向非具體數(shù)據(jù)類型的指針,稱為無類型指針。2022/12/1634C語言提供了相關的存儲管理2022/12/2335【例】調(diào)用malloc函數(shù)分配所需存儲單元。#include<stdlib.h>main(){structst{intn;structst*next;}*p;p=(structst*)malloc(sizeof(structst));p->n=5;p->next=NULL;printf("p->n=%d\tp->next=%x\n",p->n,p->next);}11.1結構體11.1.5結構體的應用——鏈表2.動態(tài)分配和釋放存儲單元
將函數(shù)返回值轉換成結構體指針
2022/12/1635【例】調(diào)用malloc函數(shù)分配所需存2022/12/2336⑵動態(tài)分配存儲區(qū)函數(shù)calloc()函數(shù)原型:
void
*calloc(unsignedintn,unsignedintsize);調(diào)用格式:calloc(n,size)功能:在內(nèi)存分配一個n倍size字節(jié)的連續(xù)存儲區(qū)。
調(diào)用結果為新分配的存儲區(qū)的首地址,是一個void
類型指針。若分配失敗,則返回NULL(即0)。11.1結構體11.1.5結構體的應用——鏈表2.動態(tài)分配和釋放存儲單元
2022/12/1636⑵動態(tài)分配存儲區(qū)函數(shù)calloc(2022/12/2337【例】調(diào)用calloc函數(shù)分配所需存儲單元。#include<stdlib.h>main(){inti,*ip;ip=(int*)calloc(10,2);for(i=0;i<10;i++)scanf("%d",ip+i);for(i=0;i<10;i++)printf("%d",*(ip+i));printf("\n");}11.1結構體11.1.5結構體的應用——鏈表2.動態(tài)分配和釋放存儲單元
動態(tài)分配了10個存放整型數(shù)據(jù)的存儲單元
2022/12/1637【例】調(diào)用calloc函數(shù)分配所需存2022/12/2338⑶釋放動態(tài)分配存儲區(qū)函數(shù)free()函數(shù)原型:void
free(void
*p);11.1結構體11.1.5結構體的應用——鏈表2.動態(tài)分配和釋放存儲單元
此函數(shù)無返回值實參必須是一個指向動態(tài)分配存儲區(qū)
的指針,它可以是任何類型的指針變量。調(diào)用格式:free(p)功能:釋放p所指向的動態(tài)分配的存儲區(qū)。2022/12/1638⑶釋放動態(tài)分配存儲區(qū)函數(shù)free(2022/12/2339q
建立鏈表就是根據(jù)需要一個一個地開
辟新結點,在結點中存放數(shù)據(jù)并建立結點
之間的鏈接關系。
【例】建立一個學生電話簿
的單向鏈表函數(shù)。11.1結構體11.1.5結構體的應用——鏈表3.建立單向鏈表頭指針h設為NULL讀入一個學生姓名當姓名長度不為0開辟新結點p=NEW
strcpy(p->name,name)gets(p->tel)p->next=NULLh==NULLTFh指向第一個連接新結點結點h=pq->next=pq指向新的尾結點q=p
讀入一個學生姓名建立單向鏈表NULLhpChang62783410NULLWang63212986NULLpq
2022/12/1639q建立鏈表2022/12/2340strcpy(p->name,name);/*為新結點中的成員賦值*/
printf("tel:");gets(p->tel);p->next=NULL;if(h==NULL)/*h為空,表示新結點為第一個結點*/
h=p;/*頭指針指向第一個結點*/
else/*h不為空*/
q->next=p;/*新結點與尾結點相連接*/
q=p;/*使q指向新的尾結點*/
printf("name:");gets(name);
}returnh;}structnode*create(){staticstructnode*h;structnode*p,*q;charname[20];h=NULL;printf("name:");gets(name);while(strlen(name)!=0)/*當輸入的姓名不是空串循環(huán)*/
{
p=NEW;/*開辟新結點*/
if(p==NULL)/*p為NULL,新結點分配失敗*/{printf("Allocationfailure\n");exit(0);/*結束程序運行*/}#include<stdlib.h>#include<string.h>#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};11.1結構體11.1.5結構體的應用——鏈表main(){structnode*head;……h(huán)ead=create();……}2022/12/1640strcpy(p->nam2022/12/2341【例】輸出學生電話簿鏈表函數(shù)。11.1結構體11.1.5結構體的應用——鏈表4.輸出單向鏈表中各結點信息hpChang62783410Li68752341NULLWang63212986
p指向第一個結點
p=head
當p不為NULL輸出結點數(shù)據(jù)p指向下一個結點p=p->next輸出鏈表的N-S圖pppNULL2022/12/1641【例】輸出學生電話簿鏈表函數(shù)。11.2022/12/2342voidprlist(structnode*head){structnode*p;p=head;while(p!=NULL){printf("%s\t%s\n",p->name,p->tel);p=p->next;}}#include<stdlib.h>#include<string.h>#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};11.1結構體11.1.5結構體的應用——鏈表main(){structnode*head;……h(huán)ead=create();prlist(head);……}2022/12/1642voidprlist(struct2022/12/2343在鏈表中,如果要刪除第i個結點,一般是將第(i-1)
個結點直接與第(i+1)個結點相連接,然后再釋放第i個
結點的存儲單元。11.1結構體11.1.5結構體的應用——鏈表5.刪除單向鏈表中指定的結點hNULL第i-1個結點第i個結點第i+1個結點
2022/12/1643在鏈表中,如果要刪除第i2022/12/2344【例】刪除學生電話簿鏈表中指定學生的信息。11.1結構體11.1.5結構體的應用——鏈表hpChang62783410Li68752341NULLWang63212986(a)刪除中間結點或尾結點(q->next=p->next)p
q2022/12/1644【例】刪除學生電話簿鏈表中指定學生的2022/12/2345【例】刪除學生電話簿鏈表中指定學生的信息。11.1結構體11.1.5結構體的應用——鏈表hpChang62783410Li68752341NULLWang63212986(b)刪除第一個結點(head=p->next)2022/12/1645【例】刪除學生電話簿鏈表中指定學生的2022/12/2346【例】刪除學生電話簿鏈表中指定學生的信息。11.1結構體11.1.5結構體的應用——鏈表hpChang62783410Li68752341NULLWang63212986pp(c)未找到指定的結點(strcmp(x,p->name)!=0)
2022/12/1646【例】刪除學生電話簿鏈表中指定學生的2022/12/2347【例】刪除學生電話簿鏈
表中指定學生的信息。11.1結構體11.1.5結構體的應用——鏈表
p=headwhile(strcmp(x,p->name)!=0&&p->next!=NULL)q指針跟隨p指針后移查找(q=p;p=p->next;)strcmp(x,p->name)==0TFp==headTFhead=p->nextq->next=p->next沒找到
free(p)刪除鏈表中指定結點的N-S圖刪除
第一個結點
刪除中間結點或尾結點
刪除結點工
作分兩步:查找結點刪除結點學生姓名當姓名不同并且不是尾結點循環(huán)2022/12/1647【例】刪除學生電話簿鏈
表中指定學2022/12/2348
if(strcmp(x,p->name)==0){if(p==head)head=p->next;/*刪除頭結點*/
elseq->next=p->next;/*刪除中間或尾結點*/
free(p);/*釋放被刪除的結點*/}
elseprintf("Notfound.");/*未找到指定的結點*/
h=head;returnh;}#include<stdlib.h>#include<string.h>#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};11.1結構體11.1.5結構體的應用——鏈表structnode*delnode(structnode*head,char*x){structnode*p,*q;staticstructnode*h;if(head==NULL){printf("Thisisaemptylist.");/*空鏈表情況*/
returnhead;}p=head;while(strcmp(x,p->name)!=0&&p->next!=NULL){q=p;p=p->next;}/*q指針尾隨p指針向表尾移動*/查找結點
2022/12/1648if(strcmp(x,p->2022/12/2349將一個新結點插入到鏈表中,首先要尋找插入的位置。如果要求在第i個結點前插入,可設置三個工作指針p0、p和q,p0是指向待插入結點的指針。利用p和q指針查找第i個結點,找到后再將新結點鏈接到鏈表上。
11.1結構體11.1.5結構體的應用——鏈表6.在單向鏈表中插入結點hNULL第i個結點ppqqp0p新的第i個結點2022/12/1649將一個新結點插入到鏈表中2022/12/2350【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。11.1結構體11.1.5結構體的應用——鏈表hpChang62783410Li68752341NULLWang63212986(a)在表頭插入結點(head=p0;p0->next=p)Zhao62758421p02022/12/1650【例】在學生電話簿鏈表中插入一個學生2022/12/2351【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指
定學生,則追加在鏈表尾部。11.1結構體11.1.5結構體的應用——鏈表hChang62783410Li68752341NULLWang63212986(b)在表中間插入結點(q->next=p0;p0->next=p)pqZhao62758421p02022/12/1651【例】在學生電話簿鏈表中插入一個學生2022/12/2352【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。11.1結構體11.1.5結構體的應用——鏈表hpChang62783410Li68752341NULLWang63212986pp(c)在表尾追加結點(p->next=p0;p0->next=NULL)
Zhao62758421p0Zhao62758421NULL2022/12/1652【例】在學生電話簿鏈表中插入一個學生2022/12/2353
head==NULLTFp=headhead=p0while(strcmp(x,p->name)!=0&&p->next!=NULL)p0->nextq指針跟隨p指針后移查找(q=p;p=p->next;)=NULLstrcmp(x,p->name)==0TFp==headTFp->next=p0head=p0q->next=p0p0->next=NULLp0->next=p在鏈表指定位置前插入結點的N-S圖【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。
11.1結構體11.1.5結構體的應用——鏈表當姓名不同并且不是尾結點循環(huán)空表時
插入
結點在表尾
追加結點
插入結點工
作分兩步:查找插
入位置連接
新結點在表頭
插入結點
在表中間
插入結點
2022/12/16532022/12/2354
if(strcmp(x,p->name)==0){if(p==head)head=p0;/*在表頭插入結點*/
elseq->next=p0;/*在表中間插入結點*/
p0->next=p;}else{p->next=p0;/*在表尾插入結點*/
p0->next=NULL;}
}h=head;returnh;}structnode*insert(structnode*head,structnode*p0,
char*x){structnode*p,*q;staticstructnode*h;if(head==NULL){head=p0;/*空表時,插入結點*/
p0->next=NULL;}else
{p=head;while(strcmp(x,p->name)!=0&&p->next!=NULL){q=p;p=q->next;}查找插入點
11.1結構體11.1.5結構體的應用——鏈表#include<stdlib.h>#include<string.h>#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};2022/12/1654if(strcmp(x2022/12/235511.1結構體11.1.5結構體的應用——鏈表【例】學生電話簿鏈表管理程序。編制此程序可利用之前的4個函數(shù)完成鏈表的建立、輸出、刪除和插入等功能,這里只需編制一個main函數(shù)完成對這4個函數(shù)的調(diào)用。#include<stdlib.h>#defineNEW(structnode*)malloc(sizeof(structnode))structnode{charname[20],tel[9];structnode*next;};2022/12/165511.1結構體11.1.5結構體2022/12/235611.1結構體11.1.5結構體的應用——鏈表main(){structnode*create(),*delnode(structnode*,char*);structnode*insert(structnode*,structnode*,char*);voidprlist(structnode*);structnode*head=NULL,*stu;chars[80],name[20];intc;2022/12/165611.1結構體11.1.5結構體2022/12/235711.1結構體11.1.5結構體的應用——鏈表do
{do
{printf("\n****MENU****\n");printf("1.Createalist\n");printf("2.Printalist\n");printf("3.Deleteanode\n");printf("4.Insertanode\n");printf("0.Quit\n");printf("Enteryourchoice(0-4):");gets(s);
c=atoi(s);/*將字符串轉換為整數(shù)*/
}while(c<0||c>4);
可以先選擇1建立一個鏈表,然后根據(jù)需要選擇功能2、功能3、功能4、直到選擇0退出程序的運行
2022/12/165711.1結構體11.1.5結構體2022/12/235811.1結構體11.1.5結構體的應用——鏈表switch(c)
{case1:head=create();break;case2:prlist(head);break;case3:printf("\nInputanamedeleted:\n");gets(name);head=delnode(head,name);break;case4:stu=NEW;printf("\nInputanewnode\n");printf("name:");gets(stu->name);printf("tel:");gets(stu->tel);
stu->next=NULL;printf("\nInsertposition\n");printf("name:");gets(name);
head=insert(head,stu,stu->name);
}}while(c);}2022/12/165811.1結構體11.1.5結構體59第11章結構體與共用體西南大學計算機與信息科學學院C
語言程序設計1第11章結構體與共用體西南大學計算機與信息科學學院C2022/12/2360第11章結構體與共用體11.1結構體
結構體類型
結構體變量的定義、初始化、運算
結構體指針
結構體與函數(shù)
結構體的應用——鏈表
2022/12/162第11章結構體與共用體11.1結構2022/12/2361一個學生的信息有學號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關數(shù)據(jù)?11.1結構體11.1.1結構體與結構體類型的定義?信息管理結構體——一種構造類型數(shù)據(jù)
結構體由若干不同類型的數(shù)據(jù)項組成,構成結構體的各個數(shù)據(jù)項稱為結構體成員。2022/12/163一個學生的信息有學號、姓名、性2022/12/2362
struct結構體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;
};11.1結構體11.1.1結構體與結構體類型的定義結構體類型定義的一般形式:
struct為關鍵字;結構體名是用戶定義的類型標識。{}中是組成該結構體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。2022/12/164struct結構體名11.1結2022/12/2363例如圖書類型的定義:
structbookcard{charnum[10];/*圖書分類編號是字符數(shù)組類型*/charname[30];/*書名是字符數(shù)組類型*/
charauthor[30];/*作者是字符數(shù)組類型*/charpublisher[60];/*出版社是字符數(shù)組類型*/
floatprice;/*價格是單精度實型*/
intn;/*庫存量是整型*/
};例如學生類型的定義:structstudent{charnum[8];/*學號是字符數(shù)組類型*/charname[30];/*姓名是字符數(shù)組類型*/charsex;/*性別是字符型
*/intage;/*年齡是整型
*/
charaddr[60];/*住址是字符數(shù)組類型*/intscore[6];/*成績是整型數(shù)組類型*/
};11.1結構體11.1.1結構體與結構體類型的定義2022/12/165例如圖書類型的定義:例如學生類型的定2022/12/236411.1結構體11.1.2結構體變量的定義與初始化1.結構體類型變量的定義
利用已定義的結構體類型名定義變量struct結構體名
變量名表;例如:structbookcardbook1[100];structstudents[30],t1,t2;按照結構體類型的組成,系統(tǒng)為定義的結構體變量分配內(nèi)存單元。結構體變量的各個成員在內(nèi)存中占用連續(xù)存儲區(qū)域,結構體變量所占內(nèi)存大小為結構體中每個成員所占用內(nèi)存的長度之和。structstudentnum8個字節(jié)name30個字節(jié)sex1個字節(jié)age2個字節(jié)addr60個字節(jié)score12個字節(jié)2022/12/16611.1結構體11.1.2結構體變2022/12/236511.1結構體結構體類型與變量的說明類型與變量是不同的概念。應先定義一個結構體類型,而后再定義結構體變量。系統(tǒng)對類型不分配空間,僅對變量分配空間。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。成員也可以是結構變量。對結構中的成員,可以單獨使用,它的作用與地位相當于普通變量。成員名可與程序中的變量名相同,不同結構體類型的成員名也可相同,二者代表不同的對象。
structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;
structdatebirthday;/*成員為結構體類型*/
charaddr[60];intscore[6];
};num8個字節(jié)name30個字節(jié)sex1個字節(jié)birthdayyear2個字節(jié)month2個字節(jié)day2個字節(jié)addr60個字節(jié)score12個字節(jié)2022/12/16711.1結構體結構體類型與變量的說明2022/12/236611.1結構體11.1.2結構體變量的定義與初始化1.結構體類型變量的定義
在定義結構體類型的同時定義變量例如:structstudent{charnum[8],name[20],sex;intage;floatscore;
}st[30];struct結構體名{
成員定義表;
}變量名表;2022/12/16811.1結構體11.1.2結構體變2022/12/236711.1結構體11.1.2結構體變量的定義與初始化1.結構體類型變量的定義
直接定義結構體類型變量
例如:struct{charnum[8],name[20],sex;intage;floatscore;
}st[30],a,b,c;struct{
成員定義表;
}變量名表;2022/12/16911.1結構體11.1.2結構體變2022/12/236811.1結構體11.1.2結構體變量的定義與初始化2.結構體變量的初始化
【例】結構體變量的初始化。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b={"9608025","Zhangliming",'F',{1978,5,10},87},c;
如果初值個數(shù)少于結構體成員個數(shù),
則將無初值對應的成員賦以0值。
如果初值個數(shù)多于結構體成員個數(shù),
則編譯出錯。2022/12/161011.1結構體11.1.2結構體2022/12/236911.1結構體11.1.2結構體變量的定義與初始化2.結構體變量的初始化
【例】結構體數(shù)組的初始化。structs{charnum[8],name[20],sex;floatscore;}stu[3]={{"9606011","Liming",'M',87.5},
{"9606012","Zhangjiangguo",'M',79},{"9606013","Wangping",'F',90}};
元素的個數(shù)可以省略,根據(jù)賦初值時
結構體常量的個數(shù)確定數(shù)組元素的個數(shù)
2022/12/161111.1結構體11.1.2結構體2022/12/237011.1結構體11.1.2結構體變量的定義與初始化3.結構體變量的運算
用sizeof運算符計算結構體變量所占內(nèi)存空間
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;
sizeof(a)
的結果為8+20+1+6+4=39
sizeof(structstudent)
的結果為39
2022/12/161211.1結構體11.1.2結構體2022/12/237111.1結構體11.1.2結構體變量的定義與初始化3.結構體變量的運算
同類型結構體變量之間的賦值運算結構體變量之間進行賦值時,系統(tǒng)將按成員一一對應賦值。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b,c;c=a;2022/12/161311.1結構體11.1.2結構體2022/12/237211.1結構體11.1.2結構體變量的定義與初始化3.結構體變量的運算
對結構體變量進行取址運算
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;對結構體變量a進行
&a運算,可以得到a的首地址,它是結構體類型指針。
2022/12/161411.1結構體11.1.2結構體202
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- UX 設計師崗位面試問題及答案
- 2025屆河北省秦皇島市一中高二下化學期末教學質量檢測試題含解析
- 2025屆天津市靜海區(qū)獨流中學化學高二下期末調(diào)研試題含解析
- 村鎮(zhèn)園林項目管理辦法
- 華為運動啟動管理辦法
- 華潤燃氣績效管理辦法
- 農(nóng)村代理記賬管理辦法
- 公共綠化區(qū)域管理辦法
- 檢察檔案保密管理辦法
- 多功能復合創(chuàng)可貼-洞察及研究
- 護理核心制度考試試卷(附答案)
- 尾礦工安全培訓
- 西安高新區(qū)管委會招聘筆試真題2024
- 2025年中國工商銀行招聘筆試備考題庫(帶答案詳解)
- 研發(fā)項目工時管理制度
- 浮選藥劑安全管理制度
- 技術異化的解放路徑-洞察及研究
- 2025年連云港市中考語文試卷真題(含標準答案)
- T/CGMA 033002-2020壓縮空氣站節(jié)能設計指南
- 南通國家級南通經(jīng)濟技術開發(fā)區(qū)公開招聘招商人員筆試歷年參考題庫附帶答案詳解
- 2025年數(shù)字媒體藝術專業(yè)考試試卷及答案
評論
0/150
提交評論