定义一个广义表类型如下:
typedef struct node{
int flag;
union{
elemType data;
struct node *pointer;
};
struct node *link;
}BSNode, *BSLinkList;
求一个广义表的长度,包括递归算法和非递归算法:
/* 求广义表的长度 */
int genlistLen( BSLinkList list ){
int n = 0;
BSLinkList p = list->pointer;
while( p != NULL ){
n++;
p = p->link;
}
return n;
}
/* 递归算法求广义表的长度, 调用该算法时,传递给实参变量list的应该是头结点的下一个结点,即头结点pointer域指向的结点 */
int genlistLen( BSLinkList list ){
if( list != NULL )
return 1 + genlistLen( list->link );
else
return 0;
}
求广义表的深度:
int genlistDepth( BSLinkList list ){ /* list存放广义链表的首地址,该算法返回广义链表的深度 */
BSLinkList stack1[ M ], p; /* stack1用来记录子表的起始位置 */
/* stack2用来记录子表当前的深度,depth用来表示当前所求子表的深度,maxdep用来记录当前已求出的那些子表的最大深度, stack1和stack2共用一个栈顶指针 */
int stack2[ M ], depth = 0, maxdep = 0, top = -1;
p = list->pointer; /* 将p指针指向广义链表的第一个元素所在的链接点 */
if( p != NULL ){
do{
while( p != NULL ){
stack1[ ++top ] = p; /* 记录当前子表的起始位置 */
stack2[ top ] = depth; /* 记录当前所求子表的深度 */
if( p->flag == 1 ){ /* 当前链接点元素是子表 */
depth++; /* 当前层次数加1 */
p = p->pointer; /* 移动到下一层 */
}
else
p = NULL;
}
if( maxdep < depth ){
maxdep = depth; /* 记录当前已求得的最大层次数 */
}
p = stack1[ top ]; /* 退回到上一层,移动到下一个元素,查看是否有子表 */
depth = stack2[ top-- ];
p = p->link;
}( p != NULL && top != -1 );
}
return maxdep+1;
}
复制一个广义表:
/* 复制广义表 */
BSLinkList copyBSList( BSLinkList lista ){
BSLinkList listb = NULL;
if( lista != NULL ){
listb = ( BSLinkList )malloc( sizeof( BSNode ) );
listb->flag = lista->flag;
if( lista->flag == 0 )
listb->data = lista->data;
else
listb->pointer = copyBSList( lista->pointer );
listb->link = copyBSList( lista->link );
}
return listb;
}