定义一个广义表类型如下:
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; }