中興筆試題
下麵這段代碼的輸出是多少(在32位機上).char *p;//指針char *q[20];//指針數組char *m[20][20];//二維指針數組int (*n)[10]; // 這是行指針struct MyStruct{char dda;double dda1;int type ;};MyStruct k;printf(“%d %d %d %d”,sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));答案:4,80,1600,4,24(1)char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };for(int i=0;i<12;i++)printf(“%d “,__a[0][0]_); // a[0][0][i]在空格處填上合適的語句,順序打印出a中的數字(2)char **p, a[16][8];問:p=a是否會導致程序在以後出現問題?為什麼?答:沒有問題,隻是使用時要小心,p是指向指針的指針。3.用遞歸方式,非遞歸方式寫函數將一個字符串反轉.函數原型如下:char *reverse(char *str);答: // 非遞歸實現字符串反轉 char *Reverse(char *str) { int len = strlen(str); char temp; for (int i = 0, j = len - 1; i <= len / 2; ++i, --j) { temp = str[i]; str[i] = str[j]; str[j] = temp; } return str; } // 遞歸實現字符串反轉 char *Reverse_Recur(char *str) { if (str == NULL) { return NULL; } static int len = strlen(str); static int pre = 0; static int post = len - 1; char temp = str[pre]; str[pre++] = str[post]; str[post--] = temp; if (pre <= post) // 未到達中點,則遞歸 Reverse_Recur(str); return str; }4.strcpy函數和memcpy函數有什麼區別?它們各自使用時應該注意什麼問題?答:strcpy函數:拷貝字符串memcpy函數:拷貝任何數據 使用strcpy函數時,需要注意目的串與原字符串的長度的問題,應該要保證目標串的長度大於或者等於原字符串的長度 使用memcpy函數時,需要指定拷貝的字符串的長度,指定的長度必須保證小於目標串的長度5.寫一個函數將一個鏈表逆序.答: // 鏈表逆序 void ReverseLinkList(LinkList L) { if (L->next == NULL || L == NULL) return; LinkList p = L->next; LinkList q = NULL; if (p->next != NULL) { q = p->next; } L->next = NULL; while (p != NULL) { p->next = L->next; L->next = p; p = q; if (q != NULL) { q = q->next; } } }6一個單鏈表,不知道長度,寫一個函數快速找到中間節點的位置.答: // 未知單鏈表表長,查找中間結點的位置 LinkList FindMiddle(LinkList L) { if(L == NULL || L->next == NULL){ return NULL; } vector<LinkList> v; LinkList p = L->next; while (p != NULL) { v.push_back(p); p = p->next; } return v.at((v.end() - v.begin()) / 2); } 7 寫一個函數找出一個單向鏈表的倒數第n個節點的指針.(把能想到的最好算法寫出).答:LinkList GetLastNListNode(LinkList L, int n) { if(L == NULL || L->next == NULL){ return NULL; } vector<LinkList> v; LinkList p = L->next; while (p != NULL) { v.push_back(p); p = p->next; } return v.at(v.end() - v.begin() - n); } 8補充一題:給你一個單向鏈表的頭指針,可能最後不是NULL終止,而是循環鏈表。題目問你怎麼找出這個鏈表循環部分的第一個節點。比如下麵的鏈表:0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> (3) 循環,就應該返回結點3的位置。當然盡量用少的空間和時間是題目的要求。答:10.判斷鏈表是否循環;答:bool IsLoopList(LinkNode *head){LinkNode *p1= head,*p2= head;if(head ->next==NULL)//隻包含頭節點,且頭節點的next為NULL說明肯定不是循環鏈表return false;do{p1=p1->next; //步長為1p2=p2->next->next; //步長為2}while(p2 && p2->next && p1!=p2);if(p1==p2)return true;elsereturn false;}11.用遞歸算法判斷數組a[N]是否為一個遞增數組。答:遞歸算法:#include <stdio.h>#include <conio.h>#define N 5int Judgment(int a[]);int main(){int a[N], i, flag = 1;printf(“Enter array data: “);for (i = 0; i < N; i++){scanf(“%d”, &a); //輸入數組元素。}flag = Judgment(a); //調用遞歸函數if (flag == 1){printf(“increment array.\n”);}else if (flag == 0){printf(“no increment array.\n”);}getch();return 0;}int Judgment(int a[]){static i = 0; //注意這個是靜態變量,必須用staticif(i < N – 1){if (a > a[i + 1]){return 0;}i++;Judgment(a);}return 1;}非遞歸算法:#include <stdio.h>#include <conio.h>#define N 5int Judgment(int a[], int num);int main(){int a[N], i, flag = 1;printf(“Enter array data: “);for (i = 0; i < N; i++){scanf(“%d”, &a);}flag = Judgment(a, N);if (flag == 1){printf(“increment array.\n”);}else if (flag == 0){printf(“no increment array.\n”);}getch();return 0;}int Judgment(int a[], int num){static i = 0, flag = 1;for(i=0; i<num; i++){if (a >= a[i+1]) //假如發現哪兩個不是遞增,立刻跳出;{flag = 0;break;}}return flag;}
最後更新:2017-04-03 15:21:46