ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

广义表

2021-11-07 22:32:39  阅读:202  来源: 互联网

标签:GL slink Glist tag link 广义 NULL


广义表是n个元素的有限序列,每一个元素都是原子项或者是广义表,通常记作LS=(a1,a2,an),如果是a1广义表为其字表称为表头,其余元素为表尾。

广义表的性质:

(1)广义表的元素可以是子表或是元素,而子表内还可以包含子表,因此广义表可以多层结构。

(2)广义表具有递归和共享的性质。

广义表的基本运算:

  广义表是一种多层次的线性结构,根树形结构相同。所以有基本的取表头,取表尾,取表长,取表深度。

广义表的存储结构:

  由于元素本身具有结构,所以是一种带有层次的非线性结构,通常采用链式存储结构,每个元素可以用结点表示,结点结构分三部分,tag、data/slink, link。tag表示标志位,用来区分结点是原子还是子表,第二个slink存放子表地址,如果是原子,data表示值,link表示后一个结点。

 

#include <stdio.h>
#include <stdlib.h> 
#define DataType char

typedef enum {atom, list} NodeTag; // atom = 0 表示原子,list = 1 表示子表 
typedef struct CLNode{
    NodeTag tag;
    union {
        DataType data;
        struct CLNode *slink;
    };
    struct CLNode *link;
} *Glist;
Glist p;
/**
**创建广义表
**/ 
Glist CreateGList(Glist GL) {
    char ch;
    scanf("%c", &ch);
    if (ch == ' ') {
        GL = (Glist)malloc(sizeof(struct CLNode));
        if (ch == '(') {
            GL->tag = list;
            GL->slink = CreateGList(GL->slink);//递归调用 
        } else {
        GL->tag = atom;
        GL->data = ch;
        } 
    }else {
        GL = NULL;
    } 
    scanf("%c", &ch);
    if (GL != NULL) {
        if (ch == ',')
            GL->link = CreateGList(GL->link);
        else
            GL->link = NULL;
    }
    return GL;
} 
/**
**输出广义表
**/ 
void PrintGList(Glist GL) {
    if (GL != NULL) {
        if (GL->tag == list) {
            printf("(");
            if (GL->slink == NULL) printf(" ");
            else PrintGList(GL->slink);
        } else
            printf("%c", GL->data);
        if (GL->tag == list)
            printf(")");
        if (GL->link != NULL)
            printf(",");
            PrintGList(GL->link);
    }
}
/**
**查找广义表
**/
void FindGlistX(Glist GL, DataType x, int *mark) {
    if (GL != NULL) {
        if (GL->tag == 0 && GL->data == x) {
            p = GL;
            *mark = 1;
        } else 
            if (GL->tag == 1) FindGlistX(GL->slink, x, mark);
        FindGlist(GL->link, x, mark); 
    }
} 

/**
**表头
**/
Glist head(Glist GL) {
    Glist p;
    if (GL != NULL && GL->tag != 0) {
        p = GL->slink;
        p->link = NULL;
        return p; 
    } else 
        return NULL;
} 

/**
**表尾
**/
Glist tail(Glist GL) {
    Glist p;
    if (GL != NULL && GL->tag != 0) {
        p = GL->slink;
        p = p->link;
        GL->slink = p; 
    } else {
        return p;
    }
} 
/**
** 深度 
**/
void depth(Glist GL, int *maxdh) {
    int h;
    if (GL->tag == 0) *maxdh = 0;
    else {
        if (GL->tag == 1 && GL->slink == NULL) {
            *maxdh = 1;
        } else {
            GL = GL->slink;
            *maxdh = 0;
            do {
                depth(GL, &h);
                if (h > *maxdh) *maxdh = h;
                GL = GL->link;
            }while(GL != NULL);
            *maxdh = *maxdh + 1;
        }
    } 
}
View Code

 

标签:GL,slink,Glist,tag,link,广义,NULL
来源: https://www.cnblogs.com/Python-233/p/15501707.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有