浅析数据结构之广义表

  • 广义表又称列表,是线性表的推广
  • 一般线性的元素都是单个元素
  • 广义表的元素既可以是单个元素也可以是广义表,又称原子和子表
  • 当广义表非空时,称第一个元素为其表头,剩下的元素为其表尾,很显然,广义表的定义是递归的
  • 由于广义表中的数据元素可以有不同结构,因此很难用顺序存储结构来表示,通常采用链式的存储结构来存储广义表,每个元素可用一个结点来表示,结点有两种结构,一种是原子结点一种是表结点

#include "stdio.h"
typedef int ElemTag;
typedef int Elemment;

typedef struct GLNode
{
    ElemTag tag;
    union
    {
        Elemment data;        //标志域,等于0表示原子,等于1表示子表
        struct
        {
            struct GLNode *hp;        //表头指针域
            struct GLNode *tp;        //表尾指针域
        } ptr;
    }
} GLNode;

//取表头
GLNode* GetHead(GLNode *L)
{
    if(!L)return;
    if(L->tag==1)
        return (L->ptr).hp;
    if(L->tag==0)
        return L;
}

//取表尾
GLNode* GetTail(GLNode *L)
{
    if(!L)return;
    if(L->tag==1)
        return (L->ptr).tp;
    if(L->tag==0)
        return L;
}
//广义表初始化
GLNode* InitGLNode(GLNode* L)
{
    L=(GLNode*)malloc(sizeof(GLNode));
    return L;
}
//创建带n个结点的广义表,每个结点都是一个一维数组
GLNode* CeateGLNode(GLNode* L,Elemment p[3][5],int n)
{
    int i,j;
    GLNode *p1,*p2,*h;
    L=InitGLNode(L);
    h=L;
    L->tag=1;
    for(i=0; i<n; i++)
    {
        p1=(GLNode*)malloc(sizeof(GLNode));
        p1->tag=1;
        (L->ptr).hp=p1;
        p2=(GLNode*)malloc(sizeof(GLNode));
        p2->tag=1;
        (L->ptr).tp=p2;
        L=p2;
        for(j=0; j<p[i][0]; j++)
        {
            p2=(GLNode*)malloc(sizeof(GLNode));
            p2->tag=0;
            p2->data=p[i][j+1];
            (p1->ptr).hp=p2;
            p2 =(GLNode*)malloc(sizeof(GLNode));
            p2->tag=1;
            (p2->ptr).hp=0;
            (p1->ptr).tp=p2;
            p1=p2;
        }
    }
    return h;
}
//输出广义表
void Input(GLNode *L)
{
    int i=0;
    GLNode *p;
    p=L;
    while(p=GetTail(p))
    {
        L=GetHead(L);
        i++;
        printf("输出第%d个结点 :",i);
        while(1)
        {
            if(!GetHead(L))break;
            printf("%d ",GetHead(L)->data);
            L=GetTail(L);

        }
        printf("\n");
        L=p;
    }
}
int main()
{
    GLNode* L;
    int n=3;
    Elemment p[3][5]= {{3,1,2,3,0},{3,4,5,6,0},{3,7,8,9,0},{3,11,12,13,0}};
    L =CeateGLNode(L,p,n);
    Input(L);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值