西南交通大学计算机专业考研真题答案详解3:2015年算法设计题

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

一、考研题目

五、算法设计题

1、单向循环链表结点结构如本试卷第三大题第二小题所示,单向循环链表无附加头结点,已知某结点地址P,试写一个算法,填充所有结点的sum域,要求每个结点sum域值为其余结点的data域值之和。(10分)

如:表长为3,结点的data域值为(1,-1,2),则填充后的sum域值为(1,3,0)。

2、二叉树采用三叉链表存储结构如本试卷第三大题第三小题所示,试编写算法,从键盘输入字符序列,用先序遍历递归法建立三叉链表存储结构,返回二叉树根结点地址。要求算法能正确填充每个结点的parent域。

若输入字符序列AB#DF##G##C#E##,则建立的二叉树如试卷第四大题第一小题的二叉树所示(#字符表示NULL指针)。

二、真题分析

1、单向循环链表结点结构如本试卷第三大题第二小题所示,单向循环链表无附加头结点,已知某结点地址P,试写一个算法,填充所有结点的sum域,要求每个结点sum域值为其余结点的data域值之和。(10分)

单向循环链表结点结构:

typedef struct node {
	int data, sum;
	struct node *next;
}LNode;

计算每个结点的sum域值:

void FillSum(LNode* L)
{
	int temp;
	LNode *p, *q;
	p = L->next;
	while (p != L)
	{
		q = p;
		p = p->next;
		temp = 0;
		while (q != p)
		{
			temp =temp+ p->data;
			p = p->next;
		}
		//退出循环时,p=q
		p->sum = temp;
		p = p->next;

	}
	//计算L节点的sum值
	p = L->next;
	temp = 0;
	while (p != L)
	{
		temp = temp + p->data;
		p = p->next;		
	}
	L->sum = temp;
}

如果不是很明白,可以参考《数据结构:单向循环链表,创建、打印、求结点sum域值》,该文章有详细的测试DEMO.

2、二叉树采用三叉链表存储结构如本试卷第三大题第三小题所示,试编写算法,从键盘输入字符序列,用先序遍历递归法建立三叉链表存储结构,返回二叉树根结点地址。要求算法能正确填充每个结点的parent域。

三叉链表存储结构:

typedef struct node {
	char data;
	struct node *parent, *lchild, *rchild;
}BTNode;

创建二叉树:

//创建带头结点的二叉树
BTNode* CreateTreeWithParent(BTNode* par)
{
	BTNode* T;
	char m_ch;
	cin>>m_ch;	
	if ('#'==m_ch)
	{
		T=NULL;
	} 
	else
	{
		T=new BTNode;
		T->data=m_ch;
		T->parent=par;
		T->lchild=CreateTreeWithParent(T);
		T->rchild=CreateTreeWithParent(T);
	}
	return T;
}

如果答案不是很懂,可以参看:数据结构:创建二叉树、中序遍历二叉树、先序遍历二叉树、后序遍历二叉树,这篇文章中有详细的调试信息。

猜你喜欢

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