数据结构之树的双亲表示法

qianyanhd 2012-08-16 08:58:52
请问数据结构中 用双亲表示法这种存储结构来表示树时 其中删除操作中有一地方不明白!
程序倒数第8行 (*T).nodes[k-1]=(*T).nodes[k]; 因为for(k=j+1;k<=(*T).n;k++) k可以等于(*T).n,那么(*T).nodes[k]的值是什么呢? 也就是树的最后一个结点的后一个空间里的值是什么呢? 假如一棵树有14个结点, 用一维数组data[100]存储 a[0]存根结点,那a[13]存放的不就是最后一个结点了吗? a[14]中存放的是什么呢? 是随机数吗? 那么如何进行删除操作呢?

// 删除T中结点p的第i棵子树
void DeleteChild(PTree *T,TElemType p,int i)
{
int j,k,n=0;
LinkQueue q;
QElemType pq,qq;

for(j=0;j<=(*T).n;j++)
deleted[j]=0;
pq.name='a'; // 此成员不用
InitQueue(&q);
for(j=0;j<(*T).n;j++)
if((*T).nodes[j].data==p)
break;
for(k=j+1;k<(*T).n;k++)
{
if((*T).nodes[k].parent==j)
n++;
if(n==i)
break;
}
if(k<(*T).n)
{
n=0;
pq.num=k;
deleted[k]=1;
n++;
EnQueue(&q,pq);
while(!QueueEmpty(q))
{
DeQueue(&q,&qq);
for(j=qq.num+1;j<(*T).n;j++)
if((*T).nodes[j].parent==qq.num)
{
pq.num=j;
deleted[j]=1;
n++;
EnQueue(&q,pq);
}
}
for(j=0;j<(*T).n;j++)
if(deleted[j]==1)
{
for(k=j+1;k<=(*T).n;k++) //不明白k为什么可以等于(*T).n;
{
deleted[k-1]=deleted[k];
(*T).nodes[k-1]=(*T).nodes[k]; //此处不明白
if((*T).nodes[k].parent>j)
(*T).nodes[k-1].parent--;
}
j--;
}
(*T).n-=n;
}
}

...全文
453 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianyanhd 2012-08-17
  • 打赏
  • 举报
回复
果然是随机数呀! 这样不好! 应该在前面弄个赋值会更好! 呵呵 本科教材不都是采用严老师的书吗? 我是参考严老师的书! 谢谢!
titer1 2012-08-16
  • 打赏
  • 举报
回复
第二补充,正在复习数据结构,可以加我好友,一起讨论
titer1 2012-08-16
  • 打赏
  • 举报
回复
楼主可否给出 是哪本教材的,或者贴出全部源码。

没有背景的代码,看起来,很疼。。
至少,要交待了 树的基本结构 在代码中定义
jixingzhong 2012-08-16
  • 打赏
  • 举报
回复
数据结构可是基础中的基础,好好研究吧。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧