广义表的创建及C语言代码实现
创作时间:
作者:
@小白创作中心
广义表的创建及C语言代码实现
引用
1
来源
1.
https://blog.dotcpp.com/course/133
广义表(Generalized List)是一种线性表的推广形式,其元素可以是原子也可以是另一个广义表。本文将详细介绍广义表的创建方法及其C语言代码实现,包括字符串切割、广义表创建和深度计算等核心功能。
广义表的创建
如图所示,广义表的每一个结点相互串联,有些结点存储原子数据,有些结点则存储另一份广义表数据。我们创建数据string ss = "(2,3,4, (1, (3, ( 7,8 ) ),2) )";
,其基本可以分成4层,每一个层中一个括号表示下一层,在数学表示中,我们也常用括号的级数表示广义表。
因此,广义表的创建就需要进行连接,连接的方法是更具tag
进行判断本结点中是Atom
(原子)还是Node
(结点),再根据其中的选择进行相对应的连接,可以由如下图可知。
对于代码的书写,我们首先需要对传入的字符串进行切割,将每一组括号“()”进行分割,每一组括号其中就表示的一份新的广义表,我们需要找到括号并且与这个括号相互匹配的括号数进行对应,找到并切割掉,以此分离出表头串,方便我们进行后续的操作。
void sever(string &str,string &hstr){
//将非空串str分割成两部分,hstr是表头
int n = str.size();
int i = -1;
int k = 0; //k记录尚未配对的“(” 数
char ch;
do{
//搜索最外层第一个(
++i;
ch = str[i];
if(ch == '(') ++k;
else if(ch == ')') --k;
}while(i<n&&(ch != ','||k!=0));
if(i<n){
hstr =str.substr(0,i);
str = str.substr(i+1,n-i-1);
}else{
hstr = str.substr(0,str.size());
str.clear();
}
}
我们通过分割以后可以通过上文介绍的方法进行指针的相互指引,核心就是要注意tag
的判断,以及Atom/Node
域是使用共用体创建的,要注意两者的空间不可以重叠,严格使用if(){}else{}
的语法结构不要乱套。
void CreateGList(GList &L,string s){
//采用头尾链表存储结构,创建L
if(s.compare(emp) == 0) L = NULL;
else{
L = (GList)malloc(sizeof(GLNode));
if(!L) exit(0);
if(s.size() == 1){ //单个元素,建立原子节点
L->tag = ATOM;
L->atom = s[0];
}else{ //表节点 ,表尾
L->tag = LIST;
GList p,q;
p = L; //p是指向当前子表(表尾节点)的指针
string sub;
sub = s.substr(1,s.size()-2); //去掉外层括号
string hsub;
do{
//重复建立n个子表
sever(sub,hsub); //sub中分理出表头串hsub ,同时,sub去除了hsub
CreateGList(p->ptr.hp,hsub);
q = p; //记录p,下面sub不为空,要再建立一个表尾节点,q记录上一层的p,用以连接q->ptr.tp = q
if(!sub.empty()) {
p = (GList)malloc(sizeof(GLNode));
if(!p)exit(0);
p -> tag = LIST;
q -> ptr.tp = p;
}
}while(!sub.empty());
q -> ptr.tp = NULL;
}
}
}
广义表的深度
我们只需要根据表的情况进行一个递归调用即可判断,当然需要特判一下空表的情况。
int GListDepth(GList L) {
if(!L) return 1; //空表1
if(L->tag ==ATOM ) return 0;
GList pp;
//遍历同一层,递归下一层,取表尾,取表头,第一步先去一个表头
int max;
for(max = 0, pp =L;pp!=NULL;pp = pp->ptr.tp){
int dep = GListDepth(pp->ptr.hp) ;
if(dep > max) max = dep; //这一步比较,是比较同一层的depth
}
return max+1;
}
热门推荐
火爆日本的「伪中国语」上线几天后,日本网民还真学出点东西来了
深圳十大高颜值绿道全攻略:免费骑行路线大公开!
充电器如何检测电池是否已经充满?
人民调解的程序是怎样的
帝王蟹不能跟什麼一起吃?
探究历史深处:中国历史上的十大暴君
哪些字代表花?汉字里的花卉世界
集成电路技术专业主要学什么-专业课程有哪些
万历皇帝朱翊钧的统治时期
解码徐州丨艰难走出产业转型“阵痛”后,“准万亿城市”徐州能否率先突围?
财旺身衰属于什么命格:八字命理深度解析
小仓鼠美味菜单大公开:适合食用的食物与水果清单!
如何在 R 中更改数据框的列名和行名
金华火腿食用指南:清洗、切割与简单烹饪方法
司机撞人了车主承担什么责任
体重突然变轻要警惕这10种癌!不明原因、进行性的消瘦最可怕!
李贺写下"天若有情天亦老",整个盛唐无人对上,宋朝才对出下句
梦魇之刃:解析梦中杀人的深层含义
【科普】冰箱杀手:神秘的李斯特菌
孩子很冷漠怎么办
拜伦的爱情感悟
什么是案底?什么情况下会留下案底?
狗被踢伤后的反应与处理:内脏受损能否自愈?
仓储优化:四大策略助力物流效率飞跃
蒲公英真的是“肺癌克星”吗?蒲公英代茶饮真的可以预防肿瘤吗?
一文读懂波浪理论与MACD的关系!
怪物猎人大剑新手做哪个
雨雾天出行安全提示:行车与骑行注意事项全攻略
满地鸡毛!去"鹤岗们"超低价买房,从来不是适合年轻人躺平的退路
纳兰性德:清代大词人的传奇人生