版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
如果答案不是很懂,可以参看:数据结构:创建二叉树、中序遍历二叉树、先序遍历二叉树、后序遍历二叉树,这篇文章中有详细的调试信息。