視覺設(shè)計(jì)——王曉豪
數(shù)據(jù)結(jié)構(gòu)與算法
線性表1
線性表:由0個或多個數(shù)據(jù)元素組成的有限序列
數(shù)學(xué)語言定義
數(shù)據(jù)類型
例如:整型,浮點(diǎn)型蕊苗,字符型.......
抽象數(shù)據(jù)類型
線性表的抽象數(shù)據(jù)類型
Operation
C語言
遞歸漢諾塔
#include <stdio.h>
#define MAX_NUM 64
int schedule[MAX_NUM+1][MAX_NUM+1];
int arrange(int begin, int num);
int arrange(int begin, int num)
{
? ? ? ? int i, j;
? ? ? ? if (num == 2)
? ? ? ? {
? ? ? ? ? ? ? ? schedule[begin][1] = begin;
? ? ? ? ? ? ? ? schedule[begin][2] = begin + 1;
? ? ? ? ? ? ? ? schedule[begin+1][1] = begin + 1;
? ? ? ? ? ? ? ? schedule[begin+1][2] = begin;
? ? ? ? ? ? ? ? return 0;
? ? ? ? }
? ? ? ? arrange(begin, num/2);
? ? ? ? arrange(begin + num/2, num/2);
? ? ? ? for (i = begin + num/2; i < begin + num; i++)
? ? ? ? {
? ? ? ? ? ? ? ? for (j = num/2 + 1; j <= num; j++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? schedule[i][j] = schedule[i-num/2][j-num/2];
? ? ? ? ? ? ? ? }
? ? ? ? }
? ? ? ? for (i = begin; i < begin + num/2; i++)
? ? ? ? {
? ? ? ? ? ? ? ? for (j = num/2 + 1; j <= num; j++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? schedule[i][j] = schedule[i+num/2][j-num/2];
? ? ? ? ? ? ? ? }
? ? ? ? }
}
int main(void)
{
? ? ? ? int num, i, j;
? ? ? ? printf("請輸入?yún)①惖年?duì)伍數(shù)量:");
? ? ? ? scanf("%d", &num);
? ? ? ? // 檢查num是否2的N次方
? ? ? ? // 注意难菌,這里是&,不是&&
? ? ? ? // &是按位與操作,1&1==1硫眨,0&1==0,0&0 == 0
? ? ? ? if (num & num - 1)
? ? ? ? {
? ? ? ? ? ? ? ? printf("參數(shù)隊(duì)伍的數(shù)量必須是2的N次方巢块!\n");
? ? ? ? ? ? ? ? return -1;
? ? ? ? }
? ? ? ? arrange(1, num);
? ? ? ? printf("編 號");
? ? ? ? for (i = 1; i < num; i++)
? ? ? ? {
? ? ? ? ? ? ? ? printf("\t第%d天", i);
? ? ? ? }
? ? ? ? putchar('\n');
? ? ? ? for (i = 1; i <= num; i++)
? ? ? ? {
? ? ? ? ? ? ? ? for (j = 1; j <= num; j++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? printf("%3d\t", schedule[i][j]);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? putchar('\n');
? ? ? ? }
? ? ? ? return 0;
}
分析
快速排序
動態(tài)內(nèi)存管理
malloc函數(shù)
free函數(shù)
內(nèi)存泄漏
初始化內(nèi)存空間
memset 函數(shù)
calloc 函數(shù)
realloc?函數(shù)
C語言內(nèi)存布局規(guī)律
堆和棧
高級宏定義
內(nèi)聯(lián)函數(shù)
#?和 ##
可變參數(shù)
結(jié)構(gòu)體
結(jié)構(gòu)體聲明
定義結(jié)構(gòu)體類型變量
訪問結(jié)構(gòu)體變量
初始化結(jié)構(gòu)體變量
結(jié)構(gòu)體嵌套
結(jié)構(gòu)體數(shù)組
初始化結(jié)構(gòu)體數(shù)組
結(jié)構(gòu)體指針
指針 *pt
箭頭 ->
傳遞結(jié)構(gòu)體變量
傳遞結(jié)構(gòu)體變量的指針
動態(tài)申請結(jié)構(gòu)體
鏈表
· 概念: 鏈表是一種線性的數(shù)據(jù)結(jié)構(gòu)礁阁,通過指針將零散的內(nèi)存塊連接起來巧号,鏈表的每個內(nèi)存塊成為節(jié)點(diǎn)
· 鏈表的實(shí)現(xiàn)方法: 鏈表一結(jié)構(gòu)體為節(jié)點(diǎn)(包含數(shù)據(jù)域和指針域),利用數(shù)據(jù)域來存儲數(shù)據(jù)姥闭,然后將每個節(jié)點(diǎn)的指針都指向下一個節(jié)點(diǎn)丹鸿,以此來實(shí)現(xiàn)數(shù)據(jù)的儲存
·?鏈表的優(yōu)缺點(diǎn)(相較于數(shù)組而言):
·?優(yōu)點(diǎn):?可以不斷擴(kuò)展鏈表的長度,刪除和插入操作比較方便
· 缺點(diǎn):?創(chuàng)建棚品,查找操作較為麻煩
創(chuàng)建鏈表
頭插法
操作:每次都會將新節(jié)點(diǎn)插在頭結(jié)點(diǎn)之后卜高。
特點(diǎn):數(shù)據(jù)的輸入順序與鏈表的存儲順序相反
打印成員
釋放頭指針
尾插法
操作:將新節(jié)點(diǎn)不斷地插入鏈表的末尾從而來創(chuàng)建鏈表
特點(diǎn):數(shù)據(jù)的輸入順序與鏈表的存儲順序相同
提高效率
搜索單鏈表
中間插入
鏈表中刪除?
鏈表的遍歷
思路:先定義一個節(jié)點(diǎn)讓它等于鏈表的第一個節(jié)點(diǎn),再在遍歷時不斷對其進(jìn)行判斷南片,若為BULL則鏈表到頭了應(yīng)該結(jié)束循環(huán)掺涛,若不為NULL則該節(jié)點(diǎn)等于鏈表的下一個節(jié)點(diǎn)并繼續(xù)循環(huán)
增加新節(jié)點(diǎn)
思路:遍歷鏈表找到要插入的位置的前一個節(jié)點(diǎn),操作指針插入新節(jié)點(diǎn)即可
說明:該函數(shù)第一個參數(shù)是鏈表頭的地址疼进,第二個參數(shù)是要插入的位置薪缆,第三個參數(shù)是新節(jié)點(diǎn)的數(shù)據(jù)。而第一個參數(shù)之所以是鏈表頭的地址而非是鏈表頭是因?yàn)椋杭偃裟阆胍迦氲降?個節(jié)點(diǎn)之后(第一個節(jié)點(diǎn)之前)伞广,那么就要操作頭結(jié)點(diǎn)的指針了拣帽,為了使在函數(shù)中的操作能影響到鏈表頭,所以傳入的是鏈表頭的地址嚼锄。
刪除節(jié)點(diǎn)
1.按位刪除節(jié)點(diǎn)
思路:刪除節(jié)點(diǎn)的關(guān)鍵在于找到要刪除節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)减拭,然后通過改變前驅(qū)節(jié)點(diǎn)的指針域來完成刪除操作
2.按數(shù)據(jù)刪除節(jié)點(diǎn)
思路:和按位刪除節(jié)點(diǎn)一樣的原理,不過要注意:我們刪除的可能不止一個節(jié)點(diǎn)区丑,而當(dāng)我們刪除了一個節(jié)點(diǎn)之后拧粪,我們維系的前后指針關(guān)系就會破壞,因此每當(dāng)我們刪除一個節(jié)點(diǎn)之后要及時恢復(fù)前后指針的關(guān)系
內(nèi)存池
讓程序額外維護(hù)一個緩存區(qū)域
鏈表
小知識
內(nèi)存4區(qū):
1.代碼區(qū):函數(shù)代碼沧侥,存放在代碼區(qū)可霎,函數(shù)名就是這個函數(shù)的地址。
2.全局區(qū):全局的變量宴杀,字符串常量癣朗,初始化(int a...)
3.棧區(qū):告訴計(jì)算機(jī)? int double char?定義一個變量
4.堆區(qū):自己確定有多大,裝什么數(shù)據(jù)...用完之后還要不要繼續(xù)使用旺罢,自己需要決定開辟和釋放? include<stdlib.h>
? ? ? ? ? ? ? malloc(? )函數(shù):開辟內(nèi)存? ??
? ? ? ? ? ? ? (int *)malloc(n)? 存放int類型
? ? ? ? ? ? ? (float **)malloc(n)? 存放地址類型