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