广义表的创建和操作(C语言)

定义:

广义表是n(n≥0)个元素a1,a2,…,ai,…,an的有限序列。

其中:

①ai--或者是原子或者是一个广义表。

②广义表通常记作:

Ls=( a1,a2,…,ai,…,an)。

③Ls是广义表的名字,n为它的长度

④若ai是广义表,则称它为Ls的子表

注意:

①广义表通常用圆括号括起来,用逗号分隔其中的元素。

②为了区分原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子

③若广义表Ls非空(n≥1),则al是Ls的表头,其余元素组成的表(a2,a3,…,an)称为Ls的表尾。

④广义表是递归定义的 [1]

广义表储存方式有两种:

头尾链表存储结构

typedef enum {ATOM, LIST} ElemTag; /* ATOM=0,表示原子;LIST=1,表示子表*/

typedef struct GLNode

{

ElemTag tag; /*标志位tag用来区别原子结点和表结点*/

union

{

AtomType atom; /*原子结点的值域atom*/

struct { struct GLNode * hp, *tp;} htp; /*表结点的指针域htp, 包括

表头指针域hp和表尾指针域tp*/

} atom_htp; /* atom_htp 是原子结点的值域atom和

表结点的指针域htp的联合体域*/

} *GList;

扩展线性存储

typedef enum {ATOM,LIST} ElemTag;

typedef struct GLNode

{ELemTag tag;

union

{AtomType atom;

struct GLNode *hp;

}

struct GLNode *ht;

}*GList;

下面我就扩展线性存储,创建广义表和操作

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#include <string.h>

typedef struct GLNode//定义广义表类型
{
    int tag;
    union
    {
        char atom;
        struct GLNode* hp;
    }atom_hp;
    struct GLNode* tp;
}GLNode;

void split_str(char* a, char* head, char* tail)//把传入的字符串,分割成表头和表尾
{
    if(a[1] == '(')
    {
        int i = 0;
        for(i = 0; i < strlen(a); i++)
        {
            if(a[i] == ')')
                break;
        }
        char newtail[20] = {0};
        strncpy(head, a+1, i);
        strncpy(tail, a+i+2,strlen(a)-i-2);
        newtail[0] = '(';
        strcat(newtail, tail);
        strcpy(tail, newtail);
    }
    else
    {
        char newtail[20] = {0};
        strncpy(head, a+1, 1);
        strncpy(tail, a+3,strlen(a)-2);
        newtail[0] = '(';
        strcat(newtail, tail);
        strcpy(tail, newtail);

    }
}

void creat_GLink(char* a, GLNode** GL)//通过输入自定义的字符串,创建广义表
{
    if(a[0] != '(' && a[strlen(a)-1] != ')')//输入格式必须为"(...)"
    {
        printf("输入不合法,应该以(开头,以)结尾");
    }
    *GL = (GLNode*)malloc(sizeof(GLNode));
    char head[20] = {0};//用来保存表头
    char tail[20] = {0};//用来保存表尾
    split_str(a, head, tail);
    if(head[0] != '(')//判断第一个元素是原子还是子表
    {
        (*GL)->tag = 0;
        (*GL)->atom_hp.atom = head[0];//给表头赋值
    }
    else
    {
        (*GL)->tag = 1;
        creat_GLink(head, &((*GL)->atom_hp.hp));//创建子表(表头)
    }
    if(tail[1] != '\0')
    {
        creat_GLink(tail, &((*GL)->tp));//创建子表(表尾)
    }
    else
    {
        (*GL)->tp = NULL;
        return;
    }



}

void get_head(GLNode* GL)
{
    if(GL->tag == 0)
    {
        printf("表头为%c\n",GL->atom_hp.atom);
    }
    else
    {
        printf("表头地址为%p\n", GL->atom_hp.hp);
    }
}

void get_tail(GLNode* GL)
{
    printf("表尾地址为%p\n", GL->tp);

}

void get_elem(GLNode* GL,char ch)//查找指定元素
{
    if(GL)//表不为空
    {
        if(GL->atom_hp.atom == ch)
        {
            printf("找到了,位置在:%p\n", &(GL->atom_hp.atom));
            return;
        }
        else if(GL->tag == 0)//递归查找元素
        {
            get_elem(GL->tp, ch);
        }
        else
        {
            get_elem(GL->atom_hp.hp, ch);//头部和尾部都为表,所以要分两步查找
            get_elem(GL->tp, ch);
        }
    }


}
int main()
{
    char input[20];
    GLNode* GL;
    printf("请输入您要创建的广义表,以回车键结束:>\n");
    scanf("%s",input);
    creat_GLink(input, &GL);
    get_head(GL);//找表头
    get_tail(GL);//找表尾
    get_elem(GL,'c');//查找元素
    return 0;
}

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
广义表是一种扩展了线性表的数据结构,能够存储多层次的数据。在C语言中,可以通过链表来实现广义表。 首先,我们需要定义广义表的节点结构。一个广义表节点包含一个元素值和两个指针,分别指向下一个元素节点和子广义表的头节点。可以使用以下结构体表示: ```c typedef struct GNode { int tag; // 标志位,用于区分元素节点和子广义表节点,0表示元素节点,1表示广义表节点 union { int data; // 元素节点的值 struct GNode* subList; // 子广义表的头节点指针 }; struct GNode* next; // 指向下一个节点的指针 } GNode; ``` 通过上述节点结构,可以构建出一个广义表的链表。在链表中,每个节点可以是元素节点或子广义表节点。当节点的tag为0时,表示该节点是一个元素节点,此时可以通过data字段访问该节点的值。当节点的tag为1时,表示该节点是一个子广义表节点,此时可以通过subList字段访问该子广义表的头节点。 可以通过以下代码示例来创建一个包含元素和子广义表广义表: ```c GNode* createGNode(int tag, int data, GNode* subList) { GNode* node = (GNode*)malloc(sizeof(GNode)); node->tag = tag; if (tag == 0) { node->data = data; } else if (tag == 1) { node->subList = subList; } node->next = NULL; return node; } GNode* createGeneralList() { GNode* list = createGNode(1, 0, NULL); // 创建一个空的子广义表 list->next = createGNode(0, 1, NULL); // 创建一个元素节点,值为1 list->next->next = createGNode(0, 2, NULL); // 创建一个元素节点,值为2 list->subList = createGNode(1, 0, NULL); // 创建一个空的子广义表作为头节点的子表 list->subList->subList = createGNode(0, 3, NULL); // 在子广义表创建一个元素节点,值为3 return list; } ``` 上述代码中,`createGeneralList`函数创建了一个广义表,包含了元素节点1、2和子广义表。 这只是广义表C语言中的一种实现方式,你可以根据实际需求来选择适合的数据结构和实现方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值