广义表的同层链表结构
- 广义表除了同层链表结构还有头尾链表存储结构
- 头尾链表存储结构较同层链表简单,容易求深度和长度。
- 同层链表较头尾链表优势是占据空间较少。
代码收获
- 同层链表和头尾链表结构主要区别在于头尾链表是所有表节点连接,而同层链表因为共用体的原因,原子节点可以链接表节点。
- 复习了枚举类型的写法,枚举类型结构体中间都是逗号。
- 由于同层链表连接结构,用递归可以求出其物理上实际的深度,但是不是其真实深度。
- 复习了递归用法。递归的关键就是需要获得的值是几个,如果需要1个值,这个值又不需要什么中间参数的话,那么应该是需要2个参数在递归函数中传递。
A=(a(b,c)) B=(A,A,D) D=()
//广义表有一个标志位 代表后面放的是表还是原子节点 有三个域构成
typedef enum{//标志位
ATOM,
LIST,
}TAG,*TAGP;
typedef struct Node{
TAG tag;
union dd{
struct Node *headp;//中间区域指向表的时候
char data; // 如果不指向表 代表里面是数据
}atomunion;
struct Node *tailp;//指向下一个节点
}node,*nodep;
void initialnode(nodep* L){
(*L)=(nodep)malloc(sizeof(node));
(*L)->tag=LIST;//因为所有表就算是空表,第一个表示位都是list
(*L)->atomunion.headp=NULL;//先做成空的
(*L)->tailp=NULL;
}
void initialatom(nodep*L,char a){
(*L)=(nodep)malloc(sizeof(node));
(*L)->tag =ATOM;//原子节点赋值,表尾暂给NULL
(*L)->atomunion.data=a;
(*L)->tailp=NULL;
}
//求长度主要看标识和tailp
int lenlist(nodep L){
int k=0;
nodep mov;
if (L==NULL)return 0;
for(mov=L->atomunion.headp;mov!=NULL;mov=mov->tailp){//传来的必然是表,表节点headp不是空就是指向原子
k++;
}
return k;
}
int deeplist(nodep L,int k,int max){
nodep mov;
if(k==1&&L->atomunion.headp==NULL)return 0;
for(mov=L;mov!=NULL;mov=mov->tailp){//检索每排
int tmp;
if (mov->tag==ATOM);
else{//否则肯定有深度
if(mov->atomunion.headp!=NULL){//如果不是指向空的话
tmp=deeplist(mov->atomunion.headp,k+1,max);//带入下一层去这个函数
if(tmp>k)max=tmp;
if(tmp<k)max=k;
}
}
}
return max;
}
void main(){
//建表 A=(a(b,c)) B=(A,A,D) D=()
//D表
nodep D;
initialnode(&D);
//A表
nodep A,a,b,c,tmpa1;//表A,A的3个小元素,由于bc跟a不在一级,需要a的尾指向tmpa1,tmpa1指向b
initialnode(&A);
initialnode(&tmpa1);
initialatom(&a,'a');
initialatom(&b,'b');
initialatom(&c,'c');
A->atomunion.headp=a;//A指向a a尾巴指向tmpa1 tmpa1指向b b尾巴指向c
a->tailp=tmpa1;
tmpa1->atomunion.headp=b;
b->tailp=c;
//B表
nodep B,tmpb1,tmpb2,tmpb3;//B指向tmpb1,b1指向A,b1尾指向b2,b2同理 b3指向D
initialnode(&B);
initialnode(&tmpb1);
initialnode(&tmpb2);
initialnode(&tmpb3);
B->atomunion.headp=tmpb1;
tmpb1->atomunion.headp=A;
tmpb1->tailp=tmpb2;
tmpb2->atomunion.headp=A;
tmpb2->tailp=tmpb3;
tmpb3->atomunion.headp=D;
printf("A表长度%d深度%d\n",lenlist(A),deeplist(A,1,0));
printf("B表长度%d深度%d\n",lenlist(B),deeplist(B,1,0));
printf("D表长度%d深度%d\n",lenlist(D),deeplist(D,1,0));
}
A表长度2深度2
B表长度3深度4
D表长度0深度0
b表深度多出来的为a表的表节点。
暂未想到解决求深度的方法。真正要求深度请用头尾链表结构。