一、广义表深度计算
广义表的深度计算可以按递归定义:如果当前节点是一个原子节点,则当前节点的深度为0;如果当前节点是一个子表,则当前节点的深度为1;同级多表中找出最大深度则为广义表深度。下面我们在上一节例子的基础上来实现这个递归算法:
typedef struct s_list
{
//0表示原子,1表示子表
int tag;
//指数
int exp;
//共用体
union
{
//系数
int coe;
//子表
struct s_list* child;
};
//下一个结点
struct s_list* next;
} s_list;
//求广义表深度
void list_depth(s_list *list, int *depth)
{
if (list == null)
{
return;
}
if (depth == null)
{
return;
}
//如果当前节点是子表
if (list->tag)
{
*depth += 1;
//递归求子表深度
list_depth(list->child, depth);
}
//如果下一节点不为空
if (list->next != null)
{
//求同级子表最大深度
int m = 0;
list_depth(list->next, &m);
if (*depth < m)
{
*depth = m;
}
}
}
写一个main函数来计算广义表深度:
#include <stdlib.h>
#include <stdio.h>
#include "list.h"
int main(int argc, char **args)
{
//创建广义表部分与上一节相同,代码略
//显示多项式
list_display(list6, 'z');
printf("\n");
//求广义表list6深度
int depth = 0;
list_depth(list6, &depth);
printf("depth = %d \n", depth);
//销毁广义表,释放内存
list_destory(list6);
return 0;
}
运行结果:
((+1x^10++2x^6)y^3+(+3x^5)y^2)z^2+((+1x^4++6x^3)y^4++2y^1)z^1++15z^0 depth = 2
注意深度从0开始,深度为2表示此广义表有3层。
二、复制广义表
复制广义表与深度计算的原理一致,都是使用递归算法对广义表的每一个节点进制复制操作,如果当前节点是一个原子节点,则复制完成,如果当前节点是一个子表,则对此子表继续复制。
//复制广义表
void list_copy(s_list *target, s_list *source)
{
if (source == null)
{
return;
}
memcpy(target, source, sizeof(s_list));
//如果当前节点是子表
if (source->tag)
{
//递归复制子表
s_list *clist = (s_list *) malloc(sizeof(s_list));
list_copy(clist, source->child);
target->child = clist;
}
//如果下一节点不为空
if (source->next != null)
{
//递归复制同级广义表
s_list *nlist = (s_list *) malloc(sizeof(s_list));
list_copy(nlist, source->next);
target->next = nlist;
}
}
再来看一下main函数:
#include <stdlib.h>
#include <stdio.h>
#include "list.h"
int main(int argc, char **args)
{
//创建广义表部分与上一节相同,代码略
//显示多项式
list_display(list6, 'z');
printf("\n");
//求广义表list6深度
int depth = 0;
list_depth(list6, &depth);
printf("depth = %d \n", depth);
s_list *list13 = (s_list *) malloc(sizeof(s_list));
list_copy(list13, list6);
//显示多项式
list_display(list13, 'z');
printf("\n");
//求广义表list13深度
depth = 0;
list_depth(list13, &depth);
printf("depth = %d \n", depth);
//销毁广义表,释放内存
list_destory(list6);
list_destory(list13);
return 0;
}
运行结果:
((+1x^10++2x^6)y^3+(+3x^5)y^2)z^2+((+1x^4++6x^3)y^4++2y^1)z^1++15z^0 depth = 2 ((+1x^10++2x^6)y^3+(+3x^5)y^2)z^2+((+1x^4++6x^3)y^4++2y^1)z^1++15z^0 depth = 2
可见,复制后的广义表完全相同。
本例代码:
code path chapter.04/e.g.4.4/ https https://github.com/magicworldos/datastructure.git git git@github.com:magicworldos/datastructure.git subverion https://github.com/magicworldos/datastructure
Copyright © 2015-2023 问渠网 辽ICP备15013245号