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