广义表的长度,深度及复制广义表的算法

时间:2021-10-13 21:16:57

定义一个广义表类型如下:

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;
}