一、如何判斷乙個單鏈表是有環的?(注意不能用標誌位,最多只能用兩個額外指標)
struct node
bool check(const node* head) {} //return false : 無環;true: 有環
一種o(n)的辦法就是(搞兩個指標,乙個每次遞增一步,乙個每次遞增兩步,如果有環的話兩者必然重合,反之亦然):
bool check(const node* head)
return false;
} 二、刪除乙個單項鍊表的最中間的元素,要求時間盡可能短(不能使用兩次迴圈)
struct link
;void delmiddle(link *head)
else
link *temp = low->next;
low->next = low->next->next;
delete temp;}}
int main()
print(head);
delmiddle(head);
print(head);
return 0;
}三、輸入n,求乙個n*n矩陣,規定矩陣沿45度線遞增(威盛)
/*** 得到如下樣式的二維陣列
* zigzag(jpeg編碼裡取象素數據的排列順序)
** 0, 1, 5, 6,14,15,27,28,
* 2, 4, 7,13,16,26,29,42,
* 3, 8,12,17,25,30,41,43,
* 9,11,18,24,31,40,44,53,
* 10,19,23,32,39,45,52,54,
* 20,22,33,38,46,51,55,60,
* 21,34,37,47,50,56,59,61,
* 35,36,48,49,57,58,62,63
*/void zigzag(int n)
}bool flag = false; //這個標誌位用來判斷是從45度角生成還是225度角生成
int count = 0;
for(i=0; i=0; r--)
flag = true;}}
for(i=n-1; i>=0; i--) //生成的是下半部分的資料
網上還有乙個人寫了乙個比較巧的演算法:
/*** 得到如下樣式的二維陣列
* zigzag(jpeg編碼裡取象素數據的排列順序)
** 0, 1, 5, 6,14,15,27,28,
* 2, 4, 7,13,16,26,29,42,
* 3, 8,12,17,25,30,41,43,
* 9,11,18,24,31,40,44,53,
* 10,19,23,32,39,45,52,54,
* 20,22,33,38,46,51,55,60,
* 21,34,37,47,50,56,59,61,
* 35,36,48,49,57,58,62,63
*/#include
int main()
}/* 陣列賦值 */
squa = n*n;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
}/* 列印輸出 */
for(i = 0; i < n; i++)
return 0;
}四、列印1到1000的整數,不能使用流程控制語句(for,while,goto等)也不能使用遞迴
1.typedef struct _test
}test;
int test::a = 1;
int main()
2.#include
#define b p,p,p,p,p,p,p,p,p,p
#define p l,l,l,l,l,l,l,l,l,l
#define l i,i,i,i,i,i,i,i,i,i,n
#define i printf( "%3d ",i++)
#define n printf( "\n ")
int main() 或
#define a(x) x;x;x;x;x;x;x;x;x;x;
int main ()
五、struct s ;
void main()
問程式會在哪一行死掉。 (microsoft)
解: s s;
int * p = &s.i; 的位址儲存在p裡
p[0] = 4; //修改了s.i
p[1] = 3; //修改了s.p
s.p = p; 指向s.i
s.p[1] = 1; //修改s.p本身
s.p[0] = 2; 指向的是0x00000001,嘗試向這裡寫,出錯
s.p[0] = 2; 時出錯
因為s.p存的是s.i的位址,s.p[1]為s.p,當s.p[1]=1時,s.p此時存放的是1了,而不是位址s.i,故在s.p[0] = 2時出錯.
此時相當於s.p=ox00000001;位址ox0000001 = 2;當然就出錯了
如果語句s.p[0] =2 先於s.p[1]=1則程式就不會出錯.此時語句相當於s.i=2;s.p=1;
六、題目描述:
1. int swap(int *x,int *y)
請改錯,溢位已經考慮,不是錯誤
2. void foo(int *x, int *y)
void fun(int *x, int *y)
問兩個函式是否等價,能否互換
解答:第一題的函式是交換。但假如考慮x, y都是指向同乙個變數,結果是這個變數的值為0.
第二題的兩個函式是有區別的,也考慮x,y是指向同乙個變數.這樣第乙個函式的結果是這個變數的4倍.但第二個函式的結果是變數的3倍.
資料結構筆試題目
1 c 編成求二叉樹的深度 int bintreedepth link head 2 排序二叉樹插入乙個節點或雙向鍊錶的實現 排序二叉樹 左小於根,根小於右。左右又分別是排序二叉樹。前序遍歷 根左右 中序遍歷 左根右 後序遍歷 左右根 排序二叉樹插入乙個結點 大於左,往右找,小於右往左找,遞迴實現。...
筆試題之資料結構
時間複雜度 整個演算法的執行時間與基本操作重複執行的次數成正比。參考kmp演算法,該演算法的時間複雜度為q n 通常,模式串的長度n比主串的長度m要小的多 穩定排序 排序前後,數值的相對前後位置不變的為穩定排序,否則為不穩定排序。1 簡單排序,時間複雜度o n的平方 不穩定 2 快速排序,時間複雜度...
資料結構筆試題三
一 選擇題 每小題2分,共8分 1.若需要利用形參直接訪問實參,則應把形參變數說明為 引數。a.指標 b.引用 c.值 2.在乙個單鏈表hl中,若要在指標q所至結點的後面插入乙個由指標p所指向的結點,則執行 a.q next p next p next q b.p next q next q p c...