广义表

广义表是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

 

上一篇:git push异常


下一篇:centos nginx gerrit