zoukankan      html  css  js  c++  java
  • 广义表

    广义表是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
  • 相关阅读:
    poj 2362 Square
    poj 1011 Sticks
    hust 1062 Divisibility
    hdu 4115 Eliminate the Conflict
    Android
    android stdio 快捷键
    Android Lint的使用
    Android studio导出配置
    fragment显示 Binary XML file line #12: Error inflating class fragment 错误
    markdown 字体颜色
  • 原文地址:https://www.cnblogs.com/Python-233/p/15501707.html
Copyright © 2011-2022 走看看