1. 程式人生 > 實用技巧 >期末考試 函式題 PTA~

期末考試 函式題 PTA~

6-1 求順序表最大值 (10分)
int GetMax(SqList L){
    int i,maxx;
    for(i=0;i<L.length;i++){
        if(maxx<L.elem[i]){
            maxx=L.elem[i];
        }
    }
    return maxx;
}
6-2 單鏈表逆置(*) (10分)
void LListReverse(LLIST *list){    
    NODE *p, *q;
    NODE *zc=list->head;
    p = zc->next;    //
P指向連結串列第一個元素 zc->next = NULL; //斷開頭結點與連結串列 while(p != NULL) { q = p; p = p->next; q->next = zc->next; //相當於前插法構建新的連結串列,和原來的相反 zc->next = q; } } 6-3 十進位制轉二進位制(順序棧設計和應用) (10分) bool isEmpty(){ if(top==-1) return 1; else return 0; } void
Push(int x){ mystack[++top]=x; } int getTop(){ return mystack[top]; } void Pop(){ top--; } 6-5 求二叉樹高度 (20分) int GetHeight( BinTree BT ) { int l=0,r=0; if(!BT) return 0; else{ l=GetHeight(BT->Left); r=GetHeight(BT->Right); return (l>=r?l:r)+1; } }
6-6 二叉樹的遍歷 (25分) void InorderTraversal(BinTree bt)///////////////////////////// { if (bt == NULL){ return; } //遞迴呼叫的結束條件 else { InorderTraversal(bt->Left); printf(" %c",bt->Data); //前序遞迴遍歷bt的左子樹 InorderTraversal(bt->Right); //前序遞迴遍歷bt的右子樹 } } void PreorderTraversal(BinTree bt)/////////////////////////// { if (bt == NULL){ return; } //遞迴呼叫的結束條件 else { printf(" %c",bt->Data); PreorderTraversal(bt->Left); //前序遞迴遍歷bt的左子樹 PreorderTraversal(bt->Right); //前序遞迴遍歷bt的右子樹 } } void PostorderTraversal(BinTree bt) { if (bt == NULL){ return; } //遞迴呼叫的結束條件 else { PostorderTraversal(bt->Left); //前序遞迴遍歷bt的左子樹 PostorderTraversal(bt->Right); printf(" %c",bt->Data); //前序遞迴遍歷bt的右子樹 } } void LevelorderTraversal(BinTree bt) { BinTree Q[100], q = NULL; //順序佇列最多100個結點 int front = -1, rear = -1; //佇列初始化 if (bt == NULL) return; //二叉樹為空,演算法結束 Q[++rear] = bt; //根指標入隊 while (front != rear) //當佇列非空時 { q = Q[++front]; printf(" %c",q->Data); if (q->Left!= NULL) Q[++rear] = q->Left; if (q->Right != NULL) Q[++rear] = q->Right; } } 6-7 先序輸出葉結點 (15分) void PreorderPrintLeaves( BinTree BT ) { if (BT == NULL) { return; } //遞迴呼叫的結束條件 else { if(BT->Left==NULL&&BT->Right==NULL){ printf(" %c",BT->Data); } PreorderPrintLeaves(BT->Left); PreorderPrintLeaves(BT->Right); } } 6-8 鄰接矩陣儲存圖的深度優先遍歷 (20分) void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ){ Visit(V); Visited[V] = true; for (int j = 0; j < Graph->Nv; j++) if (Graph->G[V][j] == 1 && Visited[j] == false) DFS(Graph,j,Visit); } 6-9 鄰接表儲存圖的廣度優先遍歷 (20分) void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ){ int w, j, Q[1000]; //採用順序佇列 int front = -1, rear = -1; //初始化佇列 PtrToAdjVNode p = NULL; //cout << adjlist[v].vertex; Visit(S); Visited[S] = 1; Q[++rear] = S; //被訪問頂點入隊 while (front != rear) //當佇列非空時 { w = Q[++front]; p=Graph->G[w].FirstEdge; //p = adjlist[w].FirstEdge; //工作指標p指向頂點v的邊表 while (p != NULL) { j = p->AdjV; if (Visited[j] == 0) { //cout << adjlist[j].vertex; Visit(j); Visited[j] = 1; Q[++rear] = j; } p = p->Next; } } 6-10 二分查詢 (20分) Position BinarySearch( List L, ElementType X ){ for(int i=1;i<=L->Last;i++){ if(X==L->Data[i]){return i;} } return NotFound; } 6-11 快速排序 (15分) int Partition(SqList &L, int low, int high){ int pivot = L.r[low].key; while(low < high){ while(low < high && L.r[high].key >= pivot){ high --; } L.r[low].key= L.r[high].key; while(low < high && L.r[low].key <= pivot){ low ++; } L.r[high].key = L.r[low].key; } L.r[low].key = pivot; return low; } void QuickSort(SqList &L, int low, int high){ if(low < high) { int pivot = Partition(L,low,high); QuickSort(L,low,pivot - 1); QuickSort(L, pivot + 1, high); } } 6-12 氣泡排序 (10分) void bubbleSort(int arr[], int n){ int i,j,temp; for(i=0;i<n-1;i++){ for(j=0;j<n-1-i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; } } } }