您的位置:首页 > 理论基础 > 数据结构算法

数据结构:广义表

2016-07-25 11:18 288 查看
    概念:数组和广义表可以看成是线性表在下述含义上的扩展,表中数据元素本身也是一个数据结构。

    广义表也可以看作是线性表的推广。

    (1)广义表的元素可以是子表,而子表的元素还可以包含子表。

    (2)列表可以被其他列表所共享。

    (3)列表可以是一个递归的表,也就是说列表也可以是自身的子表。

     

       由于广义表里面的数据元素可以具有不同的结构,所以使用的是链式存储结构,一个结点表示一个数据元素。

       我在这里对于广义表结点的构造如下:(可能与书上不一致但是我较为习惯,功能一致)

       三个域:标志域(元素类型的标志,0表示头结点,1表示int,2表示char,3表示子表)

                     数据域(依照标志域而数据不同,如果是头结点,则放的是指针计数)

                     指针域(指向下一个结点)

typedef enum[HEAD = 0,INT = 1,CHAR = 2,LIST = 3]  NodeType;//用枚举表示类型

struct GenNode;//先声明一下结构体

typedef union

{

         int ref;

         int intinfo;

         char charinfo;

         GenNode* hlink;

}ElemType;//用的是联合体,这样子节省空间

struct GenNode

{

         NodeType utype;

         ElemType value;

         GenNode *tlink;

}                     

有了这样一个结构体,接下来

(1)获得头结点

(2)获得普通结点

(3)依照相应元素想办法初始化广义表

(4)实现增删查改等操作

(5)注意不要发生内存泄漏

可以用字符串赋值的方式进行

对于广义表的构造,我学到的方式是通过类来构造,想来如果非要用结构体也是可以得。

可以通过构造函数来初始化广义表,参数形式就如上述所说可以是字符串

那么接下来的难题就只存在于如何把字符串分解开来然后作为一个个结点的数据构造出我们需要的广义表,由于能学到广义表,那我想链表方面应该都很熟练了,链表的构造添加什么的我就都不说了,唯一有可能有难度的就是子表的递归建立了,但是知道是用递归接着往上面靠就好了,如果要检验输出那么子表也要用递归的方式输出最佳,所以广义表相较于之前的数据结构其实不同的也就只是在于我们对于递归的运用而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: