西南交通大学计算机专业考研真题答案详解2:2016年数据结构算法与程序设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83153713

本文编译环境:VS2015。

一、考研题目

四、算法设计与程序设计(30分,共3小题)

1、已知某双向链表结点的存储结构如图4所示,请按要求完成如下问题。(12分)

(1)写出该结点的存储结构定义,其中数据元素elem的类型为int.(2分)

(2)编写函数创造一个带头结点的双向链表,并返回创建后的双向链表的头结点,其中结点元素的值及该链表结点的个数(不包括头结点)通过参数传递方式传递给该函数。(5分)

(3)编写函数采用之间插入排序算法将创建后的双向链表从小到大的顺序排序。(5分)

2、一颗具有n个结点的完全二叉树以一维数组作为其存储结构,编写程序实现对该完全二叉树进行先序遍历的算法。(8分)

3、编写程序,实现将数组A[0……n-1]中所有奇数移动到所有偶数之前的算法,要求不另外增加存储空间,时间复杂度为o(n)。(10分)。

二、真题解析

第一题

1、已知某双向链表结点的存储结构如图4所示,请按要求完成如下问题。(12分)

(1)写出该结点的存储结构定义,其中数据元素elem的类型为int.(2分)

typedef struct DLNode
{
	int elem;
	struct DLNode *prior, *next;
}DLNode;

(2)编写函数创造一个带头结点的双向链表,并返回创建后的双向链表的头结点,其中结点元素的值及该链表结点的个数(不包括头结点)通过参数传递方式传递给该函数。(5分)

DLNode* create(DLNode* &L, int a[], int len)
{
	L = (DLNode*)malloc(sizeof(DLNode));
	L->next = NULL;

	DLNode *s, *r, *prior, *next;
	r = L;
	for (int  i = 0; i < len; i++)
	{
		s = (DLNode*)malloc(sizeof(DLNode));
		s->elem = a[i];
		s->prior = r;
		r->next = s;
		r = s;
	}
	r->next = NULL;
	return L;
}

补充:如果不给参数元素值和结点个数,改成从输入应该怎样实现?

(3)编写函数采用之间插入排序算法将创建后的双向链表从小到大的顺序排序。(5分)

DLNode* InsertSort(DLNode* head)
{
	if (head==NULL||head->next==NULL||head->next->next==NULL)
	{
		//如果链表为空,或只有一个结点,直接返回
		return head;
	}

	DLNode *pcur, *pre, *pne;
	//指向链表第一个元素
	pre =head->next;
	//指向链表第二个元素
	pcur = pre->next;

	while (pcur != NULL)
	{
		if (pre->elem < pcur->elem)
		{
			pcur = pcur->next;
			pre = pre->next;
		}
		else
		{
			//从表头开始找,
			pne =head;
			//找到第一个大于pcur的位置
			while ((pne->next != NULL) && (pne->next->elem < pcur->elem))
			{
				pne = pne->next;
			}
			//删除pcur
			pre->next = pcur->next;
			pcur->next->prior = pre;

			//将pcur插入pne之后
			pcur->next = pne->next;
			pne->next->prior = pcur;
			pne->next = pcur;
			pcur->prior = pne;

			//pcur指向下一个元素
			pcur = pre->next;
		}
	}
	
	return head;
}

第二题

2、一颗具有n个结点的完全二叉树以一维数组作为其存储结构,编写程序实现对该完全二叉树进行先序遍历的算法。(8分)

//先序遍历二叉树
void PreOderTravelsel(int* arr,int index,int len)
{
	printf("%d ",arr[index]);
	//访问左子树
	if (index*2<=len)
	{
		PreOderTravelsel(arr,index*2,len);
	}
	//访问右子树
	if (index*2+1<=len)
	{
		PreOderTravelsel(arr,index*2+1,len);
	}
}

如果对答案不是很懂,可以参考文章:二叉树数组存储:前序遍历、打印二叉树,这篇文章有详细测试代码

第三题

3、编写程序,实现将数组A[0……n-1]中所有奇数移动到所有偶数之前的算法,要求不另外增加存储空间,时间复杂度为o(n)。(10分)。

void Reverse(int* arr,int len)
{
	int i=0,j=len-1,temp;
	while (i<j)
	{
		while (i<j&&arr[i]%2==1)
		{
			i++;
		}
		while(i<j&&arr[j]%2==0)
		{
			j--;
		}
		if (i<j)
		{
			temp=arr[j];
			arr[j]=arr[i];
			arr[i]=temp;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/83153713