東北大學計算機專業(專業碩士)研究生入學考試2011年真題
阿新 • • 發佈:2019-02-03
/*--------------------------------------------------C語言部分--------------------------------------------------*/ /*1.試編寫一個程式,顯示指定的文字檔案中的內容,要求每行中顯示的字元數不得超過30個字元。*/ /*2.試編寫一個函式char *stuff(char *str1,char *str2,int i,int j),將串str1中的第i個字元到第j個字元間的字元替換成串str2.*/ char *stuff(char *str1,char *str2,int i,int j) { int len1,len2,len; char *p,*h; len1 = strlen(str1); len2 = strlen(str2); if (i <= j && i >= 1 && i <= len1 && j >= 1 && j <= len1) { len = len1-(j-i+1)+len2; /*新串長度*/ h = (char *)malloc(sizeof(char)*len+1); str1[i-1] = '\0'; strcpy(h,str1); p = h+i-1; strcpy(p,str2); p = p+len2; strcpy(p,str1+j); return h; } else return NULL; } /*3.試找出一個二維陣列中的鞍點。鞍點指該位置上的元素是該行上的最大值,也是該列上的最小值,二維陣列也可能沒有鞍點。*/ //鞍點問題詳見2002年四.1題 /*--------------------------------------------------------資料結構部分---------------------------------------------------------------*/ /*1.整數序列作為輸入資料,當輸入資料為0時表示輸入結束。編寫演算法,將資料按遞增順序用單鏈表存放,並列印該單鏈表。*/ //連結串列的詳細操作可見2006年四題 typedef struct LNode { int data; struct LNode *next; }LinkList; LinkList *InsertSort_L(Linklist *La) //用直接插入排序使連結串列遞增有序 { if(La->next) //連結串列不空 { p = La->next->next; La->next->next = NULL; while(p != NULL) { r = p->next; //暫存p的後繼 q = La; while(q->next && q->next->data < p->data) { q = q->next; //查詢插入位置 p->next = q->next; //插入 q->next = p; p = r; } } } return La; } void DisplayLinkList(Linklist *head) //列印連結串列 { Linklist *pTemp; pTemp = head->next; if (!pTemp) printf("Empty!"); else { while (pTemp) { printf("%d->", pTemp->data); pTemp = pTemp->next; } } } void main() { int num; LinkList *head,*p,*sortHead; //建立頭結點 head = (LinkList *)malloc(sizeof(LinkList)); head->next = NULL; printf("please input data:"); scanf("%d",&num); while(num != 0) { p = (LinkList *)malloc(sizeof(LinkList)); p->data = num; p->next = head->next; head->next = p; printf("please input data:"); scanf("%d",&num); } sortHead = InsertSort_L(head); //排序 DisplayLinkList(sortHead); } /*2.二叉樹採用二叉連結串列作為儲存結構。編寫演算法,求出二叉樹中第i層和第i+1層葉子結點個數之和。*/ int LeafKLevel(BTNode *b,int k) { BTNode *Qu[MaxSize]; //定義環形佇列 int front = 0,rear = 0; //定義隊首,隊尾指標 int leaf = 0; //累計葉子結點個數 int last; //定義當前層中最右結點在佇列中的位置 int level = 1; //定義當前結點的層號 if(b == NULL || k <= 1) return 0; rear++; //結點指標進入佇列 last = rear; //第1層的最右結點在佇列中的位置為1 Qu[rear] = b; while(rear != front) { front = (front + 1)%MaxSize; b = Qu[front]; //隊頭出佇列 if(level == k && b->lchild == NULL && b->rchild == NULL) leaf++; if(b->lchild != NULL) //左孩子入佇列 { rear = (rear + 1)%MaxSize; Qu[rear] = b->lchild; } if(b->rchild != NULL) //右孩子入佇列 { rear = (rear + 1)%MaxSize; Qu[rear] = b->rchild; } if(front == last) //同層的最右結點處理完畢,層數增1 { level++; last = rear; //讓last指向下一層的最右結點在佇列中的位置 } if(level > k) //當層號大於k時返回leaf,不再繼續 return leaf; } } void main() { int num,i; BTNode *head; num = LeafKLevel(head,i) + LeafKLevel(head,i + 1); } /*3.編寫演算法,求以鄰接表儲存的無向圖G的連通分量。(要求輸出每一連通分量的頂點值)*/ //使用DFS演算法 void DFS(AGraph *G,int v) { ArcNode *p; visited[v] = 1; //置已訪問標記 printf("%d",v); //輸出被訪問頂點的編號 p = G->adjlist[v].firstarc; //p指向頂點v的第一條邊的終結點 while(p != NULL) { if(visited[p->adjvex] == 0) //若p->adjvex頂點未訪問,遞迴訪問它 DFS(G,p->adjvex); p = p->nextarc; //p指向頂點v的下一條邊的終結點 } } void ConnWeight(AGraph *G) //求圖G的連通分量 { int i; for(i = 0; i < G->n; i++) visited[i] = 0; for(i = 0; i < G->n; i++) { if(visited[i] == 0) DFS(G,i); } }