1. 程式人生 > >東北大學計算機專業(專業碩士)研究生入學考試2011年真題

東北大學計算機專業(專業碩士)研究生入學考試2011年真題

/*--------------------------------------------------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);
	}
}