資料結構 廣義表

2021-07-25 08:23:01 字數 2087 閱讀 1278

一、問題概述

廣義表是非線性的資料結構,是由若干個元素組合而成的,廣義表中可以有子表,類似這樣的:

我們以c=(a,b,(c,d))為例,將它定義為這樣的資料結構:

我們會給定字串的形式,如:char * str = "(a,b,(c,d))";     然後將它轉化為如上的資料結構。

二、解決辦法

(1)將符號'('看作是頭節點,然後將是數值的部分鏈入當前位置的下乙個位置;

(2)當遇到sub時,就鏈入它的_sublink(連線子表的指標),此時可用遞迴(子表相當於是表的子問題);

(3)直到str為空時,廣義表的資料結構建立完成。

三、實現**

#pragma once 

#includeusing namespace std;

#includeenum type

;struct generalizelistnode

; generalizelistnode(type type,char value = 0)

:_next(null)

,_type(type)

,_value(value)

if(type == sub)

}};class generalizelist

//建構函式

generalizelist(const char* str)

//拷貝建構函式

generalizelist(const generalizelist& g)

//賦值運算子過載(1)

//generalizelist& operator=(const generalizelist& g)

// // return *this;

//}//賦值運算子過載(2)

generalizelist& operator=(const generalizelist& g)

return *this;

} ~generalizelist() }

void print()

else if(*str == '(')

else if(*str == ')')

else

}return head;

} void _print(node* head)

else if(cur->_type == value)

}else if(cur->_type == sub)

}else

cur = cur->_next;

} cout<

} node* _copy(node* head)

else if(cur->_type == value)

else if(cur->_type == sub)

else

}return newhead;

} void _destroy(node* head) //銷毀表

else if(cur->_type == sub)

else

}} size_t size()

size_t _size(node* head) //元素個數

else if(cur->_type == sub)

cur = cur->_next;

} return count;

} size_t depth()

size_t _depth(node* head) //表的深度

}cur = cur->_next;

} return maxdepth;

}protected:

node* _head;

};void funtest()

四、執行結果

資料結構 廣義表

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

資料結構 廣義表

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

資料結構 廣義表

根據表頭 表尾的定義可知 任何乙個非空廣義表的表頭是表中第乙個元素,它可以是原子,也可以是子表,而其表尾必定是子表。也就是說,廣義表的head操作,取出的元素是什麼,那麼結果就是什麼。但是tail操作取出的元素必須外加乙個表 舉乙個簡單的列子 已知廣義表ls a,b,c d,e,f 如果需要取出這個...