版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
模塊七圖書信息的添加、瀏覽和刪除模塊學習目標1、理解和掌握結構體的定義和調(diào)用方法;2、理解和掌握結構體數(shù)組的定義和引用;3、理解共用體和枚舉類型的構造、定義和引用。項目三圖書信息管理系統(tǒng)
模塊七
圖書信息的添加、瀏覽和刪除
7.1結構體
7.1結構體7.1.1結構體的概念與聲明7.1.2結構體變量7.1.3結構體數(shù)組7.1.4結構體指針7.1.1結構的概念與定義1.結構的概念及定義聲明一個結構類型的一般形式為:struct結構名{ 類型名成員名1; 類型名成員名2; …… 類型名成員名n;};說明:(1)關鍵字struct與結構名一起構成結構類型名。(2)大括號中的內(nèi)容是結構所包括的成員,也叫結構分量。成員的數(shù)據(jù)類型都可以是基本類型,也可以是結構類型。(3)結構類型定義只是說明了結構類型的構成情況,系統(tǒng)并不分配內(nèi)存空間。(4)定義結構類型時,不允許將成員的數(shù)據(jù)類型定義成自身的結構類型,但是結構類型中可以含有指向自身類型的指針變量。(5)C語言把結構聲明看做是一條語句,括號后面的分號是不可少的。1.結構變量的定義聲明了結構類型后,還需要定義結構變量,以便在程序中引用它。結構變量和其他變量一樣,必須先定義后使用。7.1.2結構變量(1)先定義結構類型,再定義結構變量例如:structbooks{ intbno;charbname[20],field[10],author[10],publisher[30]; floatprice;};structbooksbook1,book2;(2)定義結構類型的同時定義結構變量例如:structbooks{intbno;charname[20],field[10],author[10],publisher[30];floatprice;}book1,book2;(3)直接定義結構變量struct{ intbno; charbname[20],field[10]; floatprice;}book1,book2;說明:方式(3)中沒有給出結構名,在此定義語句后面無法再定義這個類型的其他結構變量。
【課堂思考】下面關于結構的定義語句,錯誤的是________。A.structtest{inta;intb;intc;};structtesty;B.structtest{inta;intb;intc;}structtesty;C.structtest{inta;intb;intc;}y;D.struct{inta;intb;intc;}y;2.結構變量的初始化結構變量在定義的同時也可以進行初始化。結構變量初始化的一般形式是在定義變量的后面加上“={初值表列};”。除了允許具有相同類型的結構變量相互賦值以外,不能整體引用結構變量,而只能引用結構變量中的成員。結構變量的成員與普通變量一樣可以參與各種運算,對結構變量的賦值、存取、運算都是通過引用其成員進行的。3.結構變量的引用引用結構變量成員的方式為:結構變量名.成員名其中,“.”是成員運算符。在C語言中,成員運算符“.”的優(yōu)先級高于其他運算符,其結合方向是從左到右。例如,表達式“book1.price++”相當于“(book1.price)++”。【例01】結構變量初始化示例#include<stdio.h>intmain(){ structbooks /*結構類型*/ { intbno; charbname[20],field[10],author[10],publisher[30]; floatprice; };
structbooksbk1={ /*初始化*/
1001,"cprogramming","computer","xuwei","renminyoudianpress",39.0
}; printf("bno=%d\nbname=%s\nfield=%s\n",bk1.bno,bk1.bname,bk1.field); printf("author=%s\n",bk1.author); printf("publisher=%s\nprice=%f\n",bk1.publisher,bk1.price); return0;}注意:(1)對結構變量初始化時,需要按照其成員出現(xiàn)的順序?qū)γ總€成員依次賦值,不能跳過前面的成員給后面的成員賦值,例如下面的用法是錯誤的。structbooksbk1={1002,,"computer",,"renminyoudianpress",39.0};(2)不能在結構內(nèi)部給成員賦初值,例如下面的用法是錯誤的。structbooks{ intbno=1001; charbname[20]="cprogramming"; charfield[10]="computer"; charauthor[10]; charpublisher[30]; floatprice=23;};7.1.3結構數(shù)組1.結構數(shù)組的定義可以將數(shù)組定義為結構類型,即結構數(shù)組結構數(shù)組用來表示具有相同數(shù)據(jù)結構的一個群體,可以使用循環(huán)對數(shù)組元素進行統(tǒng)一處理,優(yōu)化算法。(1)先聲明結構類型,再定義結構數(shù)組struct結構名{ 成員列表;};struct結構名數(shù)組名[元素個數(shù)];(2)聲明結構類型的同時定義結構數(shù)組struct結構名{ 成員列表;}數(shù)組名[元素個數(shù)];(3)直接定義結構數(shù)組struct{ 成員列表;}數(shù)組名[元素個數(shù)];2.結構數(shù)組的初始化結構數(shù)組初始化的一般形式為:struct結構名數(shù)組名[元素個數(shù)]={初值表列};例如:structbooksbook[5]={101,"clanguage","computer","xw","rmydpress",39,102,"vbprogramming","computer","zys","qhdxpress",39,103,"java","computer","mj","jxgypress",34};為了增強程序的可讀性,最好用大括號將每一個數(shù)組元素的初值括起來。例如:structbooksbook[5]={ {101,"clanguage","computer","xw","rmydpress",39}, {102,"vb","computer","zys","qhdxpress",39}, {103,"java","computer","mj","jxgypress",34}, {104,"c#","math","chc","dzgypress",29.8}, {105,"clanguage","computer","thq","qhdxpress",26}};當對結構數(shù)組的全部元素進行初始化時,可以省略數(shù)組的長度,系統(tǒng)根據(jù)初始化數(shù)據(jù)的多少來確定數(shù)組的長度。例如:structbooksbook[]={ {101,"clanguage","computer","xw","rmydpress",39}, {102,"vb","computer","zys","qhdxpress",39}, {103,"java","computer","mj","jxgypress",34}, {104,"linearalgebra","math","chc","dzgypress",29.8}, {105,"clanguage","computer","thq","qhdxpress",26}};根據(jù)初值可知結構數(shù)組book的長度為53.結構數(shù)組的使用結構數(shù)組元素成員的引用可以有如下幾種形式:(1)結構數(shù)組名[下標].成員名(2)(*(結構數(shù)組名+下標)).成員名(3)(結構數(shù)組名+下標)->成員名。其中:形式(2)中最外面的括號不可少形式(3)中的“->”稱為指向成員運算符,其優(yōu)先級與成員運算符“.”相同,且結合方向均為從左到右。結構數(shù)組元素成員的使用方法與同類型的結構變量相同。#include<stdio.h>/*包含頭文件*/intmain()/*主函數(shù)main*/{ structbooks{/*聲明結構體變量books*/ intnum; charbook_name[20]; charauthor[10]; doubleprice; };structbooksbook[3]={/*定義結構體數(shù)組*/ {1001,"Cprogram","James",45.00}, {1002,"Javaprogram","Tom",55.00}, {1003,"javascript","Jack",65.00} };printf("%d\n",book[0].num);printf("%d\n",book[1].num);printf("%d\n",book[2].num);return0;/*程序結束*/}運行結果:100110021003指向結構變量的指針叫做結構指針。結構指針變量的值是它所指向的結構變量所占用內(nèi)存空間的起始地址。結構指針變量定義的形式為:struct結構名*指針變量名;7.1.4結構體指針1、結構指針的概念訪問結構變量的成員的形式等價:(1)結構變量名.成員名(2)(*結構指針變量名).成員名(3)結構指針變量名->成員名例如,設有如下定義:structstru{ intn;}str,*p=&str;則:str.n:得到結構變量str的成員n的值。(*p).n:得到p指向的結構變量str的成員n的值。p->n:得到p指向的結構變量str的成員n的值。p->n++:得到p指向的結構變量str的成員n的值,然后使成員n的值加1。++p->n:等價于++(p->n),使p指向的結構變量str的成員n的值加1。(++p)->n:先使p自加1,然后得到它指向的元素的成員n的值。(p++)->n:先得到p->n的值,然后使p自加1?!纠?3】結構指針使用示例。#include<stdio.h>intmain(){structbooks {intbno;charbname[20],field[10],author[10],publisher[30];floatprice;};structbooksbk1={1001,"cprogramming","computer","xuwei","renminyoudianpress",39.0}; structbooks*p=&bk1;printf("bno=%d,bname=%s,price=%f\n",bk1.bno,(*p).bname,p->price);return0;}運行結果:bno=1001,bname=cprogramming,price=39.000000結構指針也可以用來指向一個結構數(shù)組,這時結構指針的值是結構數(shù)組的首地址。同樣,結構指針變量也可以指向結構數(shù)組元素,此時結構指針變量的值是結構數(shù)組元素的地址。2、指向結構數(shù)組的指針例如,結構數(shù)組與結構指針的定義如下:struct{ inta; floatb;}a[3],*p;p=a;此時p指向數(shù)組a的第一個元素,“p=a;”等價于“p=&a[0];”,若執(zhí)行“p++;”則此時指針變量p指向a[1]。pp++a[0]a[1]a[2]#include/*包含頭文件*/intmain()/*主函數(shù)main*/{structbooks{/*聲明結構體books*/intnum;charbook_name[20];charauthor[10];doubleprice;};structbooksbook[3]={/*定義結構體數(shù)組*/{1001,"Cprogram","James",45.00},{1002,"Javaprogram","Tom",55.00},{1003,"javascript","Jack",65.00}};structbooks*p=book;/*定義結構體指針變量并指向結構體數(shù)組*/printf("%d\n",(*p).num);p++;printf("%d\n",(*p).num);return0;/*程序結束*運行結果:10011002【例04】指向結構體數(shù)組的指針項目三圖書信息管理系統(tǒng)
模塊七
圖書信息的添加、瀏覽和刪除
7.2鏈表
7.2鏈表7.2.1鏈表的概念7.2.2鏈表的基本操作鏈表是一種動態(tài)數(shù)據(jù)結構,它使用隨機分配的內(nèi)存單元來存放數(shù)據(jù),這些內(nèi)存單元可以是連續(xù)的,也可以是不連續(xù)的。鏈表是由若干個相同結構類型的元素依次串接而成的,它使用指針來表示兩個元素之間的前后關系。7.2鏈表1、
鏈表的概念鏈表中的每個元素稱為一個“結點”。結點是結構類型,其成員由兩部分組成:用戶需要使用的數(shù)據(jù)(稱為數(shù)據(jù)成員或數(shù)據(jù)域);下一個結點的地址(稱為指針域,為指向自身結構類型的指針)。鏈表的尾結點由于無后續(xù)結點,在其指針域放一個NULL(表示空地址),表明鏈表到此結束。單鏈表:鏈表的每個結點中只包含一個指針域,該指針域中存放的是其后繼結點的地址,這樣的鏈表稱為單鏈表。h1a2b3c4dNULL單鏈表結點數(shù)據(jù)類型的定義形式如下:struct結構名{類型名成員名1; 類型名成員名2; …… 類型名成員名n;
struct結構名*指針名1,*指針名2,……,*指針名n;};動態(tài)內(nèi)存分配是指在程序運行時動態(tài)地分配或者回收內(nèi)存空間的方法,其好處是能有效地使用內(nèi)存,而且同一段內(nèi)存可以有不同的用途,使用時申請,用完就釋放。包括三個方面的內(nèi)容:動態(tài)內(nèi)存分配、動態(tài)內(nèi)存調(diào)整和動態(tài)內(nèi)存釋放。使用動態(tài)內(nèi)存分配函數(shù)需要包含頭文件“stdlib.h”、“malloc.h”或者“alloc.h”。2、動態(tài)內(nèi)存分配(1)動態(tài)內(nèi)存分配函數(shù)malloc()和calloc()說明:malloc()或calloc()函數(shù)的返回值是一個(void*)類型的指針,在使用前需要將函數(shù)的返回值轉換到特定指針類型,賦給一個指針。例如,常見的使用方法為:if((p=(int*)malloc(n*sizeof(int)))==NULL){printf("Notabletoallocatememory.allocatememoryerror.\n");exit(1);}【例01】計算n個數(shù)的平均值,數(shù)字由用戶在運行時輸入。#include<stdio.h>#include<stdlib.h>intmain(){inti,j=0,*p;floatsum=0;printf("請輸入數(shù)的個數(shù):");scanf("%d",&i); p=(int*)malloc(i*sizeof(int)); /*或者p=(int*)calloc(i,sizeof(int))*/if(p) {while(j++<i){printf("第%d個數(shù)是:",j); scanf("%d",p++);} for(j=i;j>0;j--) sum+=*(p-j);printf("平均值是:%f",(sum/i)); free(p-i); }elseprintf("內(nèi)存分配錯誤!");return0;}運行結果:請輸入數(shù)的個數(shù):3第1個數(shù)是:1第2個數(shù)是:2第3個數(shù)是:3平均值是:2.000000單鏈表的基本操作主要有:(1)創(chuàng)建鏈表(2)輸出鏈表(3)查找結點(4)插入結點(5)刪除結點(6)重組鏈表
7.2.2鏈表的基本操作鏈表的建立向鏈表中添加一個新節(jié)點data=Anodedata=Bnodedata=C∧nodehead空指針NULL表示鏈表結尾鏈表的頭指針:訪問鏈表的關鍵鏈表的建立若原鏈表為空表(head==NULL),則將新建節(jié)點p置為頭節(jié)點head(1)head=pdatanextp新建節(jié)點(2)pr=p∧pr(3)pr->next=NULLdatanext新建節(jié)點p鏈表的建立若原鏈表為非空,則將新建節(jié)點p添加到表尾(1)pr->next=p(2)pr=p∧headdata∧prpr(3)pr->next=NULLnext鏈表的刪除操作若原鏈表為空表,則退出程序若待刪除節(jié)點p是頭節(jié)點,則將head指向當前節(jié)點的下一個節(jié)點即可刪除當前節(jié)點
datanext(1)head=p->nexthead待刪除節(jié)點datanextp頭節(jié)點(2)free(p)鏈表的刪除操作若待刪除節(jié)點不是頭節(jié)點,則將前一節(jié)點的指針域指向當前節(jié)點的下一節(jié)點即可刪除當前節(jié)點(1)pr->next=p->nextdatanextdatanext待刪除節(jié)點datanextp中間節(jié)點datanext若已搜索到表尾(p->next==NULL)仍未找到待刪除節(jié)點,則顯示“未找到”
(2)free(p)鏈表的插入操作若原鏈表為空表,則將新節(jié)點p作為頭節(jié)點,讓head指向新節(jié)點phead待插入節(jié)點data∧p(1)head=pp=(structlink*)malloc(sizeof(structlink));p->next=NULL;p->data=nodeData;鏈表的插入操作若原鏈表為非空,則按節(jié)點值(假設已按升序排序)的大小確定插入新節(jié)點的位置若在頭節(jié)點前插入新節(jié)點,則將新節(jié)點的指針域指向原鏈表的頭節(jié)點,且讓head指向新節(jié)點head待插入節(jié)點datanextp(2)head=pdatanextdatanextdata∧(1)p->next=headdatanext鏈表的插入操作若在鏈表中間插入新節(jié)點,則將新節(jié)點的指針域指向下一節(jié)點且讓前一節(jié)點的指針域指向新節(jié)點待插入節(jié)點datanextp(2)pr->next=pdatanextdatanextdata∧(1)p->next=pr->nextprdatanext鏈表的插入操作若在表尾插入新節(jié)點,則末節(jié)點指針域指向新節(jié)點待插入節(jié)點datanextp(1)pr->next=pprdata∧原末節(jié)點next∧鏈表的輸出遍歷鏈表的所有節(jié)點headdatanextdatanextdata∧pppp∧項目三圖書信息管理系統(tǒng)
模塊七
圖書信息的添加、瀏覽和刪除
7.3共用體
7.3共用體7.3.1共用體類型的說明和變量7.3.2共用體變量的引用共用體,也叫聯(lián)合體,是一種用戶自定義的構造數(shù)據(jù)類型,它使幾個不同類型的變量共占同一段內(nèi)存。共用體實質(zhì)上是采用了覆蓋技術,使幾個變量互相覆蓋。7.3共用體1.共用體的定義注意:在C語言中,數(shù)據(jù)的存取必須與數(shù)據(jù)類型相匹配,否則會引起數(shù)據(jù)存取混亂,導致數(shù)據(jù)讀寫錯誤。共用體所占用的存儲空間雖然可以存放不同類型的數(shù)據(jù),但是在程序運行的某一個時刻只有一個成員值有效。聲明一個共用體類型的一般形式為:union共用體名{ 類型名成員名1; 類型名成員名2; …… 類型名成員名n;};例如:unionelectivescore{ floatstatistics; floatmaintenance; chartourism;};方法一:先聲明共用體類型,然后再定義共用體變量unionelectivescore{ floatstatistics; floatmaintenance; chartourism;};unionelectivescoreelective;2.共用體變量方法二:聲明共用體類型的同時定義共用體變量unionelectivescore{ floatstatistics; floatmaintenance; chartourism;}elective;方法三:直接定義共用體變量union{ floatstatistics; floatmaintenance; chartourism;}elective;【例】若有數(shù)據(jù)類型定義如下:uniondata{ floatx; chary;};則表達式sizeof(uniondata)的值是什么?定義了共用體變量后系統(tǒng)會為之分配內(nèi)存,共用體變量所占有的存儲空間是占有存儲空間最大的共用體成員所占的空間。
對于共用體變量成員的引用也是通過成員運算符“.”進行的,引用方式為:共用體變量名.成員名
例如:elective.statistics共用體和結構可以嵌套使用,即結構中的成員可以是共用體,共用體中的成員也可以是結構。引用內(nèi)部成員的方式如下:
結構變量.共用體變量.成員
共用體變量.結構變量.成員對共用體變量的使用要注意下面幾個問題。(1)共用體成員所占用的存儲空間雖然可以存放不同類型的數(shù)據(jù),但是在程序運行的某一個時刻只有一個成員值有效。(2)引用共用體變量時,要保證其存儲類型的一致性,即最近一次存入共用體變量中的是一個整數(shù),那么下一次取出該變量中的內(nèi)容也應該是一個整數(shù)。(3)只能對共用體變量的第一個成員初始化,不能同時對共用體變量的所有成員進行初始化?!纠抗灿脙?nèi)存示例#include<stdio.h>intmain(){ unionudata { charc[2]; intx; }udd;
udd.x=0x1234; printf("udd.x=%#x\n",udd.x);
printf("udd.c[0]=%#x,udd.c[1]=%#x\n",udd.c[0],udd.c[1]); return0;}1000H1001Huddc[0]x內(nèi)存分配圖34H12Hc[1]運行結果:udd.x=0x1234udd.c[0]=0x34,udd.c[1]=0x12floatx;結果?【例】若有以下定義語句,則以下選項正確的是________。uniondata{ intt; floatf; charc;}d={12};intn;A.d=5; B.d={2,1.2,'a'};C.printf("%d\n",d); D.n=d;voidff(uniondatadx) { printf("%c,%x\n",dx.c,&dx.c); dx.x=10; printf("%d,%x\n",dx.x,&dx.x);}intmain(){ uniondatadd; dd.c='A'; printf("%c,%x\n",dd.c,&dd.c); ff(dd);/*函數(shù)調(diào)用,將共用體變量作為實參*/ printf("%d\n",dd.x); return0;}運行結果:A,18ff44A,18fef410,18fef4-858993599【例】共用體變量作為函數(shù)的形參【例】共用體和結構的嵌套
#include<stdio.h>unionmyun /*共用體類型*/{ struct /*共用體內(nèi)部嵌套的結構類型*/ {intx,y,z; }u; intk;}a;intmain(){ a.u.x=4; a.u.y=5; a.u.z=6; a.k=0; printf("%d",a.u.x); return0;}項目三圖書信息管理系統(tǒng)
模塊七
圖書信息的添加、瀏覽和刪除
7.4枚舉類型
7.4枚舉類型7.4.1枚舉類型的定義7.4.2枚舉類型的使用7.4枚舉類型1.聲明聲明一個枚舉類型的一般形式為:enum枚舉名{ 枚舉值列表 };(1)關鍵字enum是枚舉類型的標志,“enum枚舉名”構成枚舉類型。(2)枚舉是一個集合,集合中的元素(稱為枚舉成員或枚舉常量)是一些特定的標識符,元素之間用逗號隔開。(3)在枚舉類型中,枚舉成員是有值的,第一個枚舉成員的默認值為0,后續(xù)成員的值依次遞增。(4)枚舉成員是常量,不能對它們賦值。如“red=1;”是錯誤的。但是在定義枚舉類型時可以指定枚舉成員的值。(5)同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的枚舉成員。2.枚舉變量聲明了枚舉類型后,可以使用它來定義枚舉變量,有以下三種形式:形式一:先定義枚舉類型,然后定義枚舉變量enumcolor{red,yellow,green,blue,black};enumcolorc1,c2;形式二:定義枚舉類型的同時定義枚舉變量enumcolor{red,yellow,green,blue,black}c1,c2;形式三:直接定義枚舉變量enum{red,yellow,green,blue,black}c1,c2;注意:枚舉變量的值只能為枚舉類型中列舉出來的枚舉成員,如“c1=red;”,則c1的值為0。枚舉成員不是字符常量或字符串常量,使用時不能加單引號或雙引號,如“c1="red";”是錯誤的。不能將一個數(shù)值直接賦值給枚舉變量,如“c1=3;”是錯誤的。但是使用強制類型轉換則可以進行賦值,如“c1=(enumcolor)3;”,其含義是將枚舉類型enumcolor中值為3的成員賦值給變量c1,相當于“c1=blue;”。1.枚舉類型數(shù)據(jù)的輸入輸出枚舉類型的數(shù)據(jù)不能直接進行輸入輸出。輸入時應先輸入其序號,然后使用強制類型轉換完成;輸出時應先進行轉換才能輸出其對應的字符串。7.4.2枚舉類型的使用【例01】從鍵盤輸入一個整數(shù),顯示與該整數(shù)對應的枚舉常量所表示的水果英文名稱。#include<stdio.h>enumfruits{watermelon,peach,strawberry,banana,pineapple,apple};intmain(){ charfts[][20]={"watermelon","peach","strawberry","banana","pineapple","apple"}; enumfruits
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《電氣控制原理圖》課件
- DB32T-建筑工程BIM規(guī)劃報建數(shù)據(jù)規(guī)范編制說明
- 給予是快樂的課件公開課專用
- 《口腔潔治課件》課件
- 基因工程的基本操作程序課件
- 《TA溝通分析課程》課件
- 《伊犁河大橋》課件
- 生活處處有哲學課件
- 單位管理制度展示匯編【員工管理篇】
- 中國武都頭風痛丸項目投資可行性研究報告
- (大潔王)化學品安全技術說明書
- 2022年科學道德與學術規(guī)范知識競賽決賽題庫(含答案)
- 智慧水庫平臺建設方案
- 市場調(diào)查與預測期末復習試題10套含答案
- 呼吸內(nèi)科國家臨床重點??平ㄔO項目評分標準試行
- 糧食平房倉設計規(guī)范
- 煤炭質(zhì)量分級及低位發(fā)熱量計算
- 通用個人全年工資表模板
- 帶電作業(yè)車庫技術規(guī)范書
- 電鍍工序FMEA
- 基坑總涌水量計算公式匯總(共5頁)
評論
0/150
提交評論