資料結構 廣義表的實現

2021-07-23 02:56:57 字數 2878 閱讀 3202

【前言】學完了順序表,鍊錶這些線性的資料結構,現在開始進入非線性的資料結構了。難度也比線性結構更大,本篇文章對廣義表這種資料結構進行介紹並附上其實現的**,廣義表的實現主要應用遞迴,通過廣義表可以更加理解和靈活使用遞迴,希望能給學習這塊知識的朋友們帶來幫助。

一、廣義表概念

廣義表是線性表的推廣,是一種非線性的資料結構,也有人稱其為列表。

舉幾個例子:

(1)a=()  //a是乙個空表

(2)b=(b) //b有乙個元素

(3)c=(a, (b, c,  d)) //c有兩個元素分別是a和字表(b, c, d)

(4)d=(a, (a, (a, . . .))) //遞迴的表,相當於乙個無限的列表。

從上面幾個例子,我們可以得出重要的結論:

列表的元素可以是資料元素或子表,列表可以是乙個遞迴的表。

二、廣義表的儲存結構:

由於廣義表的元素可以具有不同的結構(資料元素或子表),所以難以用順序儲存結構表示,通常採取鏈式儲存結構。

怎麼來設定結點的結構呢?

我們設定三種結構的結點:

<1>頭 head <2>資料元素value <3>子表 sub

將上面例子(1)(2)(3)用這三種結點表示出來為:

廣義表結點的定義:

enum nodetype

;struct generallistnode

; generallistnode(nodetype type, char value = ' ')

:_type(type)

,_next(null)

else if(_type == sub)}};

三、廣義表的實現:

1.generallists.h

#pragma once 

#include #include #include using namespace std;

enum nodetype

;struct generallistnode

;generallistnode(nodetype type, char value = ' ')

:_type(type)

,_next(null)

else if(_type == sub)

}};class generallist

generallist(const char* str)

:_head(null)

generallist(const generallist& gl)

~generallist()

void print()

//傳統寫法

/* generallist& operator=(const generallist& g)

return *this;

} */

//現**法

generallist& operator=(const generallist& g)

return *this;

}size_t size()

size_t depth()

private:

node* creatlist(const char*& str);

bool isvalue(char value);

void print(node* head);

node* copy(node* head);

void release(node* head);

size_t count(node* head);

size_t dep(node* node);

protected:

node* _head;

};

2.generallists.cpp

#include "generallists.h"

generallist::node* generallist::creatlist(const char*& str)

else if(isvalue(*str))

else if(*str == ')')

else

}return head;

}bool generallist::isvalue(char value)

void generallist::print(generallistnode* head)

else if (cur->_type == sub)

}else

}cur = cur->_next;

} cout << ")";

}generallist::node* generallist::copy(generallist::node* head)

else if (cur->_type == sub)

else //value

}return newhead;

}void generallist::release(node* head)

else // sub

}} head = null;

}size_t generallist::count(node* head)

else if (cur->_type == sub)

cur = cur->_next;

} return count;

}size_t generallist::dep(node* node)

if (nd > dep)

cur = cur->_next;

} return dep;

}

以上就是廣義表的這部分知識,希望能給朋友們帶來幫助!!

資料結構 廣義表

廣義表 lists,又稱列表 是一種非線性的 資料結構 是線性表 的一種推廣。即廣義表中放鬆對錶元素的原子限制,容許它們具有其自身結構。思想 廣義表就類似下圖的結構,他的大體 下圖第一行 相當於乙個帶頭結點的鍊錶,思想,首先要有乙個頭結點為head型別,每乙個廣義表有且只有乙個head,而後每個節點...

資料結構 廣義表

概念 陣列和廣義表可以看成是線性表在下述含義上的擴充套件,表中資料元素本身也是乙個資料結構。廣義表也可以看作是線性表的推廣。1 廣義表的元素可以是子表,而子表的元素還可以包含子表。2 列表可以被其他列表所共享。3 列表可以是乙個遞迴的表,也就是說列表也可以是自身的子表。由於廣義表裡面的資料元素可以具...

資料結構 廣義表

一 問題概述 廣義表是非線性的資料結構,是由若干個元素組合而成的,廣義表中可以有子表,類似這樣的 我們以c a,b,c,d 為例,將它定義為這樣的資料結構 我們會給定字串的形式,如 char str a,b,c,d 然後將它轉化為如上的資料結構。二 解決辦法 1 將符號 看作是頭節點,然後將是數值的...