c语言广义表

c语言广义表,第1张

网上搜了个类似程序,希望满足你要求:

#include<stdafx.h>

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

typedef

char

ElemType

//自定义结构体存放广义表中单元素节早隐点和字表节点

typedef

struct

lnode

{

int

tag

union

{

ElemType

data

struct

lnode

*sublist

}val

struct

lnode

*next

}GLNode

//自定义函数来仿嫌实现广义表创建

void

creatGList(struct

lnode

**gl)

{

char

ch

ch=getchar()

if(ch=='#')

*gl=NULL

else

if(ch=='(')

//输入左括号则递归构造字表

{

*gl=(lnode*)malloc(sizeof(struct

lnode))

(*gl)->tag=1

creatGList(&((*gl)->val.sublist))

}

else

//输入为字符则建立单元素节点

{

*gl=(lnode*)malloc(sizeof(struct

lnode))

(*gl)->tag=0

(*gl)->val.data=ch

}

ch=getchar()

if(*gl==NULL)

else

if(ch==',')

//若输入为逗号则递归构建后陆大厅继表

creatGList(&((*gl)->next))

else

(*gl)->next=NULL

return

}

//自定义函数实现广义表输出

void

printGList(struct

lnode

*gl)

{

if(gl->tag==1)//判断是否存在字表

{

printf("(")

if(gl->val.sublist==NULL)

printf("#")

else

printGList(gl->val.sublist)//递归输出字表

printf(")")

}

else

printf("%c",gl->val.data)//单个元素则直接输出

if(gl->next!=NULL)

//输出节点的后继表

{

printf(",")

printGList(gl->next)

}

return

}

//求广义表长度

int

GLLength(GLNode

*gl)

{

int

n=0

gl=gl->val.sublist

while(gl

!=

NULL)

{

n++

gl=gl->next

}

return

n

}

//求广义表深度

int

GLDepth(GLNode

*gl)

{

int

max=0,dep

if(gl->tag==0)

return

0

gl=gl->val.sublist

if(gl

==

NULL)

return

1

while(gl

!=

NULL)

{

if(gl->tag==1)

{

dep=GLDepth(gl)

if(dep>max)

max=dep

}

gl=gl->next

}

return

max+1

}

void

main()

{

int

len=0

int

dep=0

struct

lnode

*h

printf("input

the

list:\n")

creatGList(&h)

len=GLLength(h)

dep=GLDepth(h)

printf("\n")

printf("the

length

is:")

printf("%d\n",len)

printf("the

depth

is:")

printf("%d\n",dep)

if(h

!=

NULL)

{

printf("GList

is:")

printGList(h)

printf("\n")

}

else

printf("GList

is

NULL\n")

_getch()

}

广义表广义表,顾名思义,它也是线性表的一种推广。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。在第二章中,线性表被定义为一个有限的序列(a1,a2,a3,...,an)其中ai被限定为是单个数据元素。广义表也是n个数据元素d1,d2,d3,...,dn的有限序列,但不同的是,广义表中的di 则既可以是单个元素,还可以是一个广义表,通常记作:GL=(d1,d2,d3,...,dn)。GL是广义表的名字,通常广义表的名字用敏拆局大写字母表示。n是广义表的长度。若其中di是一个广义表,则称di是广义表GL的子表。在广义表GL中,d1是广义表GL的表头,而广义表GL其余部分组成的表(d2,d3,...,dn)称为广义表的表尾。由此可见广义表的定义是递归定义的。因为在定义广义表时,又使用了广义表的概念。下面给出一些广义表的例子,以加深对广义表概念的理解。l D=()御缺 空表;其长度为零。l A=(a,(b,c)) 表长度为2的广义表,其中第一个元素是单个数据a,第二个元素是一个子表(b,c)。l B=(A,A,D) 长度为3的广义表,其前两个元素为表A,第三个元素为空表D。l C=(a,C) 长度为2递归定义的广义表,C相当于无穷表C=(a,(a,(a,(...))))。其中,A,B,C,D是广义表的名字。下面以广义表A为例,说明求表头、表尾的 *** 桥让作如下:head(A)=a; 表A的表头是:atail(A)=((b,c)); 表A的表尾是((b,c))。广义表的表尾一定是一个表。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8267053.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存