C语言+数据结构总结
一、C語(yǔ)言部分
1、數(shù)據(jù)類型:
Int 整形 4字節(jié)Short 短整形 2字節(jié)Long 長(zhǎng)整形 4字節(jié)Float 單精度浮點(diǎn)型 4字節(jié)Double 雙精度浮點(diǎn)型 8字節(jié)Char 字符型 1字節(jié)2、變量
3、常用關(guān)鍵字
4、if…else語(yǔ)句:
if(表達(dá)式) {語(yǔ)句a; } else {語(yǔ)句b; }如果表達(dá)式結(jié)果為真,則執(zhí)行語(yǔ)句a,反之執(zhí)行語(yǔ)句b。
5、switch…case語(yǔ)句:
switch(i) {case a:語(yǔ)句1;break; case b:語(yǔ)句2;break; case c:語(yǔ)句3;break; defluat:語(yǔ)句4;break; }如果i等于a,則執(zhí)行語(yǔ)句1,等于b時(shí),執(zhí)行語(yǔ)句2,如果沒有與i對(duì)應(yīng)的case語(yǔ)句,就執(zhí)行default語(yǔ)句。
6、while循環(huán):
While(表達(dá)式) {循環(huán)體; }While循環(huán)先判斷表達(dá)式的結(jié)果真假,為真就執(zhí)行循環(huán)體,直到條件表達(dá)式的結(jié)果為假時(shí)跳出循環(huán)。
7、do…while循環(huán):
do {循環(huán)體; }while(表達(dá)式);無條件先執(zhí)行循環(huán)體,在進(jìn)行表達(dá)式結(jié)果真假性判斷。
8、for循環(huán)
for(表達(dá)式1;表達(dá)式2;表達(dá)式3) {循環(huán)體; }先執(zhí)行表達(dá)式1,只執(zhí)行一次,再進(jìn)行表達(dá)式2真假性判斷,為真時(shí)執(zhí)行循環(huán)體,接著執(zhí)行表達(dá)式3,在對(duì)表達(dá)式2進(jìn)行判斷,當(dāng)表達(dá)式2為假時(shí)跳出for循環(huán)。
9、goto語(yǔ)句:
//跳轉(zhuǎn)標(biāo)記: //語(yǔ)句段; //goto //跳轉(zhuǎn)標(biāo)記;int c=0; scanf("%d",&c); aa:a=0;b=0;if(c>10)goto aa;當(dāng)執(zhí)行到goto語(yǔ)句時(shí),跳轉(zhuǎn)到跳轉(zhuǎn)標(biāo)記處,開始執(zhí)行跳轉(zhuǎn)標(biāo)記后的語(yǔ)句段。執(zhí)行g(shù)oto語(yǔ)句時(shí)無條件跳轉(zhuǎn),可跳出多層循環(huán),這是break所不具備的。goto語(yǔ)句也可構(gòu)成一個(gè)循環(huán)。
10、函數(shù)的參數(shù)
(1)實(shí)際參數(shù)(實(shí)參):
真實(shí)傳給函數(shù)的參數(shù),叫實(shí)參。實(shí)參可以是:常量、變量、表達(dá)式、函數(shù)等。無論實(shí)參是何種類型的量,在 進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值,以便把這些值傳送給形參。
(2)形式參數(shù)(形參):
形式參數(shù)是指函數(shù)名后括號(hào)中的變量,因?yàn)樾问絽?shù)只有在函數(shù)被調(diào)用的過程中才實(shí)例化(分配內(nèi)存單 元),所以叫形式參數(shù)。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。
11、函數(shù)遞歸
(1)概念:
程序調(diào)用自身的編程技巧稱為遞歸。
(2)遞歸的兩個(gè)必要條件 :
存在限制條;每次遞歸調(diào)用之后越來越接近這個(gè)限制條件
12、數(shù)組
(1)一維數(shù)組
int arr[10];數(shù)組是一組相同類型元素的集合。arr[10]數(shù)組從arr[0]開始到arr[9]共10個(gè)元素,沒有arr[10]這個(gè)元素。數(shù)組是數(shù)組,不是指針,只是數(shù)組名具有指針的特性。
關(guān)于一維數(shù)組名的運(yùn)用:
arr arr數(shù)組 arr+0 arr數(shù)組首元素 *arr arr數(shù)組首元素值 &arr arr數(shù)組的地址 &arr+1 下一個(gè)數(shù)組的地址(越界) &arr[0] arr[0]的地址 &arr[0]+1 arr[1]的地址(2)二維數(shù)組
int arr[3][4];二維數(shù)組不要理解成3列4行的矩陣的樣式,應(yīng)該理解為有3組元素個(gè)數(shù)為4的一維數(shù)組的集合,例:
arr[3][4]={{0,1,2,3};{4,5,6,7};{8,9,10,11} };關(guān)于二維數(shù)組名的運(yùn)用:
arr[0][0] arr數(shù)組首元素的值 arr[0] arr數(shù)組中第一個(gè)一維數(shù)組 arr[0]+1 arr數(shù)組中第二個(gè)一維數(shù)組 *(arr[0]+1) arr數(shù)組中第一個(gè)一維數(shù)組第二個(gè)元素的值 &arr[0]+1 arr數(shù)組中第二個(gè)一維數(shù)組的地址(3)數(shù)組作為參數(shù)傳參時(shí)傳的是數(shù)組首元素的地址。
13、指針
指針是一個(gè)變量,存放著某一指定的變量單元的地址。例:
int a=10; int *p=&a;定義一個(gè)整形變量a,并初始化為10,在定義一個(gè)指向整形變量a的指針變量p,用于存放a的地址。因?yàn)榇娣胖鴄的地址,故而可以通過指針p來訪問a,對(duì)其解引用操作: printf(“%d”,*p);輸出結(jié)果為10,。也可通過指針p來修改a的值,如:*p=12;printf(“%d”,a);輸出結(jié)果為12。
指針的大小在32位平臺(tái)的大小為4個(gè)字節(jié),與其指向的數(shù)據(jù)類型無關(guān)。
指針的運(yùn)算一般與數(shù)組相結(jié)合,指針加1表示指針向后移動(dòng)其指向數(shù)據(jù)類型大小個(gè)字節(jié)。p+1就表示指針p向后移動(dòng)4個(gè)字節(jié)。
14、結(jié)構(gòu)體
Struct A {int a;int b[10];char *arr; };結(jié)構(gòu)體是一些變量的集合,可以是單個(gè)的變量,數(shù)組,指針,也可以是結(jié)構(gòu)體,結(jié)構(gòu)體傳參一般傳結(jié)構(gòu)體的地址,效率是最高的。
(1)結(jié)構(gòu)體內(nèi)存對(duì)齊:
**
原因:
不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址 處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。
原因在于,為了訪問未對(duì)齊的內(nèi)存,處理 器需要作兩次內(nèi)存訪問;而對(duì)齊的內(nèi)存訪問僅需要一次訪問。
規(guī)則:
第一個(gè)成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
其他成員變量要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍的地址處。對(duì)齊數(shù) = 編譯器默認(rèn)的一個(gè)對(duì)齊數(shù) 與 該成員大小的較小值。 VS中默認(rèn)的值為8
結(jié)構(gòu)體總大小為最大對(duì)齊數(shù)(每個(gè)成員變量都有一個(gè)對(duì)齊數(shù))的整數(shù)倍。
如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的最大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是
所有最大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍
(2)結(jié)構(gòu)體數(shù)組
Struct A a[10];定義一個(gè)結(jié)構(gòu)體數(shù)組a[10],該數(shù)組每個(gè)元素都代表一個(gè)結(jié)構(gòu)體變量,共10個(gè)元素。
15、枚舉
enum Day { Mon,Tues,Wed, Thur, Fri, Sat, Sun }定義一個(gè)枚舉類型Day,其內(nèi)容為所有取值可能,也叫枚舉常量,如果沒有對(duì)枚舉常量賦值,則第一個(gè)枚舉常量的值默認(rèn)為0,后面依次加1。
16、動(dòng)態(tài)內(nèi)存你分配
(1)void malloc (size_t size);*
這個(gè)函數(shù)向內(nèi)存申請(qǐng)一塊連續(xù)可用的空間,并返回指向這塊空間的指針。如果開辟成功,則返回一個(gè)指向開辟好空間的指針。 如果開辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。 返回值的類型是 void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時(shí)候使用者自己來決定。
如果參數(shù) size 為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。
(2) void calloc (size_t num, size_t size);*
該函數(shù)的功能是為 num 個(gè)大小為 size
的元素開辟一塊空間,并且把空間的每個(gè)字節(jié)初始化為0。 與函數(shù)
malloc 的區(qū)別只在于 calloc 會(huì)在返回地址之前把申請(qǐng)的空間的每個(gè)字節(jié)初始化為全0
(3)void realloc (void ptr, size_t size);**
ptr 是要調(diào)整的內(nèi)存地址 size 調(diào)整之后新大小 返回值為調(diào)整之后的內(nèi)存起始位置。
這個(gè)函數(shù)調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會(huì)將原來內(nèi)存中的數(shù)據(jù)移動(dòng)到 新 的空間。
(4)void free (void ptr);*
free函數(shù)用來釋放動(dòng)態(tài)開辟的內(nèi)存。 如果參數(shù) ptr 指向的空間不是動(dòng)態(tài)開辟的,那free函數(shù)的行為是未定義的。 如果參數(shù) ptr 是NULL指針,則函數(shù)什么事都不做。
17、文件
(1)文件指針
緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡(jiǎn)稱“文件指針”。
每個(gè)被使用的文件都在內(nèi)存中開辟了一個(gè)相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)
及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名FILE.
(2)打開、關(guān)閉一個(gè)文件
//打開文件 FILE* fopen ( const char * filename, const char * mode ); //關(guān)閉文件 int fclose ( FILE * stream );(3)文件打開方式
“r” 只讀 “w” 只寫 “a” 向文本文件尾添加數(shù)據(jù) “rb” 二進(jìn)制形式讀文件(只) “wb” 二進(jìn)制形式寫文件 “ab” 向一個(gè)二進(jìn)制文件尾添加數(shù)據(jù) “r+” 為了讀和寫,打開一個(gè)文本文件 “w+” 為了讀和寫,建議一個(gè)新的文件 “a+” 在文件尾進(jìn)行讀寫 “rb+” 為了讀和寫打開一個(gè)二進(jìn)制文件 “wb+” 新建一個(gè)新的二進(jìn)制文件讀和寫 “ab+” 打開一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫(4)sprintf(buf,”%d”,a);
把變量a以十進(jìn)制的形式打印給字符型數(shù)組buf。
Sscanf(buf,“%c”,&a);從字符型數(shù)組中獲取一個(gè)字符并賦給a。
fprintf(fp,”%d”,a);fp是指向一個(gè)文件的文件指針,該函數(shù)是將a以十進(jìn)制形式寫入fp指向的文件中。
fscanf(fp,”%d”,&a);fp是一個(gè)指向文件的指針,該函數(shù)是從fp指向的文件中以十進(jìn)制形式讀取數(shù)據(jù)并賦給a。
二、數(shù)據(jù)結(jié)構(gòu)
1、單鏈表
概念:
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈
接次序?qū)崿F(xiàn)的。
插入一個(gè)節(jié)點(diǎn):
ListNode *tem=(ListNode*)malloc(sizeof(ListNode)); tem->data=data; tem->next=head->next; head->next=tem;刪除一個(gè)節(jié)點(diǎn):
ListNode *tem=head; for(;tem->next!=NULL;tem=tem->next) {if(tem->data==data){tem->next=tem->next->next;break; } }刪除鏈表頭:
ListNode *tem=(*head)->next; Free(*head); *head=tem;2、棧
概念:
一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端
稱為棧頂,另一端稱為棧底。遵循先入后出的規(guī)則。
3、隊(duì)列
概念:
只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出入隊(duì)列:進(jìn)行插入操作的一端稱為隊(duì)尾
出隊(duì)列:進(jìn)行刪除操作的一端稱為隊(duì)頭。
4、二叉樹
概念 :
一棵二叉樹是結(jié)點(diǎn)的一個(gè)有限集合,該集合或者為空,或者是由一個(gè)根節(jié)點(diǎn)加上兩棵別稱為左子樹和右子樹
的二叉樹組成。
二叉樹的特點(diǎn):
總結(jié)
以上是生活随笔為你收集整理的C语言+数据结构总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python SimpleITK实现医学
- 下一篇: 解决exe文件在别人电脑上运行缺失文件情