- 關於2D array
2Darray 中,系統預設是指向一維陣列的陣列指標,因此傳遞時必須給其大小(只能空一維)
maze[2][4],表示 maze[0][0] 與 maze[1][0] 相對位移量為 4
2Darray是一塊連續的記憶體空間,故
Maze[0][0]+5並不會爆掉(Maze[1][1])
一個動態配置的例子
int **ia = (int **)malloc(sizey * sizeof(void *)); for(y = 0; y != sizey; ++y)
ia[y] = (int *)malloc(sizex * sizeof(int));
-
應優先檢查邊界 If(A[i]符合條件 && i沒超過邊界 ) (X,A[i]可能爆掉) If(i沒超過邊界 && A[i]符合條件) (O, 超過邊界會early stop)
-
小提醒
- while()要記得i之類的變數有沒有++
- 裡面計數變數初始化要放loop外面
- local pointer
Local pointer在函式中宣告,可以回傳,離開函式會被收回,接到的會變垃圾
應傳入pointer的位置,在函式內直接去修改
例子:
char *fun(char*s){
char ans[100];
...
//return ans; is wrong
strcpy(s,ans);
return s;
}
- 關於getchar() 與 buffer
Getchar()甚麼都吃,包括空白 換行,使用時要注意
相當於一定從buffer中取出第一個
因此假設
1 2 buffer中會有1 2\n3 4
3 4 而前面scanf(“%d”….)也只會取走 數字部分,\n還是在buffer中
不要以為scanf會捨棄之前還在buffer內的data(往後指)
Eg 剛剛就算把數字都scan完,buffer還是存有兩個\n
解法fflush(stdin) 去清空buffer
fflush(stdin) in stdio.h
-
Overflow
檢查Overflow可以先用INT_MAX(or INT_MIN)
反運算看有沒有超過當前值
例如 x+5>INTMAX (X)
x>INTMAX-5 (o) -
Merge sort 用linked list 實作
1.可以用一個跑兩倍快的指標,與一個基本指標來決定middle
2.不要隨意動指標架構(insert)
,可以改動節點資料就好 -
甚麼時候要傳指標(位址) 當有改動到”資料本身”的時後 傳 ListNode * ptr 可以改指向ptr的結構的資料 但是ptr指向是無法更改的
(ptr=A 不改指標內的東西) (ptr->next=A ptr指向的東西被改變了!) 關鍵在有沒有反參考(取裡面的東西)
例子: 為甚麼我會需要新的變數p?
ANS:因為pop是把整個空間收回來
甚至沒有改動任何東西
-
小提醒:
記住任何”檢查條件”都有可能造成 Seg fault (應謹慎檢查指標)
指標初始化請務必 賦NULL -
運算中序->前序演算法
如果要使用堆疊法將運算式中序式轉為前序式,則使用迴圈由後往前取出中序式的字元,遇運算元直接輸出;
Rule 1
堆疊運算子與右括號; 堆疊中運算子優先順序若大於讀入的運算子優先順序的話,直接輸出堆疊中的運算子,再將讀入的運算子置入堆疊;
Rule 2
遇左括號輸出堆疊中的運算子至右括號。前面整個演算過程中被輸出的字元再反序列出,就是前序表示式。
Rule 3
無input就清空stack 至output
why?
- 前序式代表最後算的在最前面,所以遇到優先順序比自己小(後面的)的(或一樣的) 自己當然就先輸出
- 括號裡面東西最優先,尤其是越中間的括號優先度越大,所以碰到就把括號內包住的都輸出( 可視括號比*/優先度還大,所以碰到*/為input不輸出括號,直到又有一個新括號) ( 括號內也要遵守1)
*Ambiguous problem
如果自己定義變數無重複,那可能是與系統include檔重複了
總之=>改名
指標變數與指標內容
Cur=head的話
Cur=NULL 只是改動輔助指標,對list沒有實質影響
Cur->next=NULL 取用輔助指標指向的資料,並賦值,才算改動list!
應用: 刪除一個linked list的中間節點
Node=Node->next (X,只有指標改了)
Node=Node->next (O,改動指標指向的Node)
*STL小技巧 \vector<bool>temp(NUM,0); \vector<\vector<bool> > map(NUM,temp); 可做多維vector插入
要修改vector裡面的值要用reference