【数据结构】广义表的同层链表结构

广义表的同层链表结构

  • 广义表除了同层链表结构还有头尾链表存储结构
  • 头尾链表存储结构较同层链表简单,容易求深度和长度。
  • 同层链表较头尾链表优势是占据空间较少。

代码收获

  • 同层链表和头尾链表结构主要区别在于头尾链表是所有表节点连接,而同层链表因为共用体的原因,原子节点可以链接表节点。
  • 复习了枚举类型的写法,枚举类型结构体中间都是逗号。
  • 由于同层链表连接结构,用递归可以求出其物理上实际的深度,但是不是其真实深度。
  • 复习了递归用法。递归的关键就是需要获得的值是几个,如果需要1个值,这个值又不需要什么中间参数的话,那么应该是需要2个参数在递归函数中传递。

A=(a(b,c)) B=(A,A,D) D=()

unionheadp
tailp
unionheadp
tailp
tailp
unionheadp
tailp
tailp
tailp
tailp
unionheadp
unionheadp
tailp
unionheadp
tailp
unionheadp
D
null
A
a
null
tmpa1
b
null
c
null
B
null
tmpb1
tmpb2
tmpb3
//广义表有一个标志位 代表后面放的是表还是原子节点  有三个域构成
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表的表节点。
暂未想到解决求深度的方法。真正要求深度请用头尾链表结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业火之理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值