东北大学计算机专业研究生入学考试2000年真题
生活随笔
收集整理的這篇文章主要介紹了
东北大学计算机专业研究生入学考试2000年真题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*--------------------數據結構部分------------------------*/
/*二.設有一個由正整數組成的無序單鏈表,編寫完成下列功能的算法:1.找出最小值結點,且打印該數值;2.若該數值是奇數,則將其與直接后繼結點的數值交換;3.若該數值是偶數,則將其直接后繼結點刪除。*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,* LinkList;Status CreateList(LinkList &L,int n){ //創建鏈表LinkList p,q;L=(LinkList)malloc(sizeof(LNode));p=L;for(int i=0;i<n;i++){q=(LinkList)malloc(sizeof(LNode));scanf("%d",&q->data);p->next=q;p=q;}p->next=NULL;return OK;
}Status MinList(LinkList L){LinkList p,q;ElemType min;p=L->next;min=p->data;q=p;while(p){if(p->data>min) p=p->next;else{ min=p->data;q=p;p=p->next;}}printf("最小值結點值為:%d \n",min);if(q->next!=NULL){if(min%2==0){p=q->next;q->next=p->next;free(p);}else{p=q->next;q->data=p->data;p->data=min;}}else printf("最小值結點直接后繼為空\n");return OK;
}Status ShowList(LinkList L){LinkList p;p=L->next;while(p){printf("%4d",p->data);p=p->next;}printf("\n\n");return OK;
}
int main(){LinkList L;int n;printf("請輸入元素個數為: ");scanf("%d",&n);CreateList(L,n);printf("輸出當前單鏈表為: \n");ShowList(L);MinList(L);printf("輸出當前單鏈表為: \n");ShowList(L);system("pause");
}/*四.3.假設一個有向圖g已經以十字鏈表形式存儲在內存中,試編寫一個判斷該有向圖中是否有環(回路)的算法*/
//對十字鏈表儲存結構的有向圖采用拓撲排序
Status toposort (OLGraph G)
{findindegree (G, indegree); //對各項點求入度InitQueue (Q); //隊列初始化Count=0; //計數器初始化for(i=0;i<G.Vernum;i++)if(G.Ver[ i ].indegree==0)Enqueue(Q,i); //入度為零的頂點入隊While(!QueueEmpty (Q) ) ﹛Dequeue(Q,i); //隊頭出隊Count++;P=G. ver [ i ].firstout; //取鄰接點while(p) ﹛ //處理鄰接點的入度j=p→ headvex;G.ver [ j ].indegree--;if(G.ver [ j ].indegree==0)Enqueue (Q,j); //頂點j入隊p=p→tlink;//指針后移}//while}//whileif ( (count<G.vernum) //有環return ERROR;else return OK;
} // toposort /*五、寫出刪除二叉排序樹bt中值為x的結點的算法(二叉排序樹以二叉鏈表形式存儲,刪除后仍保持二叉排序性質)*/
Status delete(BiTree ﹠t ,ElemType x)
{// 刪除二叉排序樹中的x接點if(x<p→data{q=p;p=p->lchild;} // ifelse{q=p;p=p->rchild;} // elseif(!p) return false; // 來找到else if(!p->rchild){ //被刪結點無右子權q=p; p=p->lchild; // 重接free(q);} // ifelse if(!p->rchild){ // 無左子樹q=p;p=p->rchild; // 重接free(q);} // ifelse{ //左、右子樹均不空q=p;s=p->rchild;while(s->rchild){ // 轉左、右找q=s;s=s->rchild;} // whilep→data=s->data; // 置換if(q!=p)q->rchild=s->lchild; // 重接左子樹elseq->rchild=s->lchild; // 重接右子樹}// else
} //delete/*六、設有n個大小不等的數據組(n個數據組中數據的總數為m),順序存放在空間區D內,每個數據占一個存儲單元。
數據組的首地址由數組S給出(如下圖所示),試編寫將新數據x插入到第i個數據組的末尾且屬于第i個數據組的算法,
插入后,空間區D和數組S的相互關系仍保持正確。*/
void lnsert_x(sqlist ﹠L, int I, ElemType x )
{// 將數據x插入到D區,插入后D和S關系不變if( i>=I &&i <= L.length){for(j=0 , p=L. elem[ 0 ],j<=m; j+ +)p++; // 求D區空閑空間首地址if(i==L.lingth)*p=x;else{ // 不插入第n個數組for(q=L.elem[ i ]; p>=q;--p)*(p+l)=*p; //后移*p=x; //插入xfor(q = &L.elem[i],p = &L.elem[ L.length-I];p >= q;q++)(*q)++;m++;}}
} //Insert_x/*--------------------C語言部分----------------------*/
/*二.編寫一個函數void merge(int ary1[], int n, int ary2[], int m),其中n為數組ary1中元素的人數,m為數組ary2中元素的個數,
數組ary1和ary2已按升序排序。該函數將ary1和ary2進行合并,合并后的結果存放在數組ary1中且保序。假定數組ary1有足夠的存儲空間。*/
void merge(int ary1[], int n, int ary2[], int m)
{int i = 0, j = 0, k = 0, index;while(i < n && j < m){if(ary1[i] <= ary2[j])ary1[k++] = ary1[i++];elseary1[k++] = ary2[j++];}//將較長的數組中剩余元素繼續插入到ary1中while(i < n){ary1[k++] = ary1[i++];}while(j < m){ary1[k++] = ary2[j++];}
}/*三.寫一遞歸函數,完成回文的判定。回文是只有如下形式的字符串"a","abccba","abcdcba"回文是指串正讀和反讀都一樣*/int turn(char *str){char *p;p=str+strlen(str)-1;if(*str != *p)return 0;else{if(p->str <= 2)return 1;else{*p = '\0';return(turn(str+1));}}}/*五.對于僅含+、-、*、\的算術表達式(1)寫一函數,建立表達式樹,該函數的輸入為算術表達式的字符串(2)寫一函數,按逆波蘭式(后序遍歷)輸出該表達式,該函數的輸入為表達式樹*/#include <stdio.h>
#include <stdlib.h>typedef char Elem;typedef struct Node
{Elem data;struct Node *pLchild;struct Node *pRchild;
}BTreeNode, *BTree;BTree CreateBTree(BTree T, Elem *str)//創建二叉樹
{static int i = 0;if ('0' == str[i]){T = NULL;}else{T = (BTree) malloc (sizeof(BTreeNode));T->data = str[i++];T->pLchild = CreateBTree(T->pLchild, str);i++;T->pRchild = CreateBTree(T->pRchild, str);}return T;
}void PostTraverseBTree(BTree T)//后序
{if (NULL != T){PostTraverseBTree(T->pLchild);PostTraverseBTree(T->pRchild);printf("%c ", T->data);}
}void InTraverseBTree(BTree T)//中序
{if (NULL != T){InTraverseBTree(T->pLchild);printf("%c ", T->data);InTraverseBTree(T->pRchild); }
}void PreTraverseBTree(BTree T)//前序
{if (NULL != T){printf("%c ", T->data);PreTraverseBTree(T->pLchild);PreTraverseBTree(T->pRchild);}
}int main(void)
{BTree T = NULL;Elem str[] = "+-/+a00b00c00d00*e00f00";T = CreateBTree(T, str);printf("\n\n");printf("先序遍歷(前綴式):\n");PreTraverseBTree(T);printf("\n\n");printf("中序遍歷(中綴式):\n");InTraverseBTree(T);printf("\n\n");printf("后序遍歷(后綴式):\n");PostTraverseBTree(T);printf("\n\n");system("pause");
}
總結
以上是生活随笔為你收集整理的东北大学计算机专业研究生入学考试2000年真题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学在生活中无处不在,36个生活小故事涵
- 下一篇: 三元组问题解决方法