浅析数据结构之广义表

来源:互联网 发布:linux ntp配置文件 编辑:程序博客网 时间:2024/06/05 18:49

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

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


1 0
原创粉丝点击