当前位置:   article > 正文

广义表+ADT+C语言实现_c实现广义表并且画图

c实现广义表并且画图

广义表

线性表的推广

(1)表的元素可以是子表,子表的元素还可以是子表

(2)列表为其他列表所享有

(3)列表可以是一个可以递归的表,即列表可以是其本身的子表

广义表一般记作:

LS = (\alpha1,\alpha2,\alpha3...\alpha n)

 可以是单个元素,也可以是广义表,分别为广义表LS的原子子表

习惯上,用大写字母表示广义表的名称,用小写字母表示原子。

当广义表LS非空时,称第一个元素 \alpha1 为LS的表头(Head),称其余元素组成的表(\alpha2,\alpha3,...,\alpha n)是LS的表尾(Tail)

任何一个非空列表其表头可能是原子,也可能是列表,而其表尾必定为列表

(1)A = ()

(2)B = (e)

(3)C = (a,(b,c,d))

(4)D = (A,B,C)

GetHead(B) = e           GetTail(B) = ()

GetHead(D) = A          GetTail(D) = (B,C)

GetHead((B,C)) = B    GetTail((B,C)) = (C)

()(空表)长度为0,(())(非空表)长度为1

广义表的存储结构

表结点

tag = 1hptp

原子结点

tag = 0atom

ADT

  1. ADT GList{
  2. 数据对象:D={ei|i=1,2,...,n;n>=0;ei∈AtomSet或ei∈GList,
  3. AtomSet为某个数据对象}
  4. 数据关系:R1={<ei-1,ei>|ei-1,ei∈D,2<=i<=n}
  5. 基本操作:
  6. InitGList(&L);
  7. 操作结果:创建空的广义表.
  8. CreateGList(&L,S);
  9. 初始条件:S是广义表的书写形式串。
  10. 操作结果:有S创建广义表L。
  11. DestoryGList(&L);
  12. 初始条件:广义表L存在
  13. 操作结果:销毁广义表L。
  14. CopyGList(&T,L);
  15. 初始条件:广义表L存在
  16. 操作结果:由广义表L复制得到广义表T。
  17. GListLength(L);
  18. 初始条件:广义表L存在
  19. 操作结果:求广义表的长度,即元素个数
  20. GListDepth(L);
  21. 初始条件:广义表L的深度
  22. 操作结果:求广义表的深度
  23. GListEmpty(L);
  24. 初始条件:广义表存在
  25. 操作结果:判定广义表L是否为空
  26. GetHead(L);
  27. 初始条件:广义表L存在
  28. 操作结果:取广义表L的头
  29. GetTail(L);
  30. 初始条件:广义表L存在
  31. 操作结果:取广义表的尾
  32. InsertFirst_GL(&L,e);
  33. 初始条件:广义表L存在
  34. 操作结果:插入元素e作为广义表的第一元素。
  35. DeleteFirst_GL(&L,&e);
  36. 初始条件:广义表L存在
  37. 操作结果:删除广义表L的第一个元素,并用e返回其值
  38. Traverse_GL(L,visit());
  39. 初始条件:广义表L存在
  40. 操作结果:遍历广义表L,用函数visit处理每个元素
  41. }ADT GList;

建立广义表

基本项

当S为空表串时,置空广义表

当S为单字符串时,建原子结点子表

归纳项

sub为脱去最外层括弧的子串,'s1,s2,...,sn',为非空子串。对每一个Si建立一个表结点,并令其hp域的指针为由si建立的子表的头指针,除最后建立的表结点的尾指针为NULL之外,其余表结点的为指针均指向在它之后建立的表结点。

复制广义表 

基本项

InitGList(NEXLS){置空表},当LS为空表时

归纳项

COPY(GetHead(LS)->GetHead(NEWLS)){复制表头}

COPY(GetTail(LS)->GetTail(NEWLS)){复制表尾}

 求广义表的深度

 基本项:

DEPTH(LS)=1 当LS为空表时

DEPTH(LS)=0 当LS为原子时

归纳项

DEPTH(LS)=1+Max{DEPTH(

)} 

  1. // 广义表.cpp : 定义控制台应用程序的入口点。
  2. //以字符串形式
  3. # include<stdio.h>
  4. # include<stdlib.h>
  5. # include<string.h>
  6. # define Status int
  7. # define AtomType char
  8. # define OK 1
  9. # define ERROR 0
  10. # define OVERFLOW -1
  11. # define MaxLength 60
  12. # include<iostream>
  13. using namespace std;
  14. typedef struct
  15. {
  16. AtomType str[MaxLength];
  17. Status length;
  18. }SString;//自定义字符串
  19. typedef enum {ATOM,LIST}ElemTag;//ATOM=0表示原子,List=1表示子表
  20. typedef struct GLNode
  21. {
  22. ElemTag tag;//标志tag用于区分元素是原子还是子表
  23. union
  24. {
  25. AtomType atom;//原子结点的值域,用户自己定义的类型
  26. struct {
  27. struct GLNode *hp, *tp;//hp指向表头,tp指向表尾
  28. }ptr;
  29. };
  30. }*GList,GLNode;
  31. //判断是否为空字符串
  32. Status StrEmpty(SString S)
  33. {
  34. if (S.length == 0)
  35. return OK;
  36. else
  37. return ERROR;
  38. }
  39. //求串长度
  40. Status StrLength(SString S)
  41. {
  42. return S.length;
  43. }
  44. //串比较
  45. Status StrCompare(SString S, SString T)
  46. {
  47. int i;
  48. for (i = 0; i < S.length && i < T.length; ++i)
  49. {
  50. if (S.str[i] != T.str[i])
  51. return S.str[i] - T.str[i];//返回第一个比较不同字符的大小
  52. }
  53. return S.length - T.length;//比较结束,返回两个串差值
  54. }
  55. //清空串
  56. void StrClear(SString *S)
  57. {
  58. S->length = 0;
  59. }
  60. //串的赋值操作
  61. void StrCopy(SString *T, SString S)
  62. {
  63. int i;
  64. for (i = 0; i < S.length; ++i)
  65. {
  66. T->str[i] = S.str[i];
  67. }
  68. T->length = S.length;
  69. }
  70. //串赋值
  71. void StrAssign(SString *S, char str[])
  72. {
  73. int i;
  74. for (i = 0; str[i] != '\0'; ++i)
  75. S->str[i] = str[i];
  76. S->length = i;
  77. }
  78. //截取从pos开始的长度为len的子串
  79. Status SubString(SString *Sub,SString S,int pos,int len)
  80. {
  81. int i;
  82. if (pos < 0 || len < 0 || pos + len - 1 > S.length)
  83. {
  84. printf("参数不合法!\n");
  85. return ERROR;
  86. }
  87. else
  88. {
  89. for (i = 0; i < len; ++i)
  90. Sub->str[i] = S.str[i + pos - 1];
  91. Sub->length = len;
  92. return OK;
  93. }
  94. }
  95. //将串Str分离成两个部分,HeadStr为第一个逗号之前的子串,Str为逗号后的子串
  96. void DistributeString(SString *Str,SString *HeadStr)
  97. {
  98. int i, len, k;
  99. SString ch, ch1, ch2, ch3;
  100. len = StrLength(*Str);
  101. StrAssign(&ch1, ",");
  102. StrAssign(&ch2, "(");
  103. StrAssign(&ch3, ")");
  104. SubString(&ch, *Str, 1, 1);//ch保存Str的第一个字符
  105. for (i = 0, k = 0; i <= len && StrCompare(ch, ch1) || k != 0; ++i)
  106. {//搜索str的最外层的第一个括号
  107. SubString(&ch, *Str, i, 1);
  108. if (!StrCompare(ch, ch2))
  109. k++;
  110. else if (!StrCompare(ch, ch3))
  111. k--;
  112. }
  113. if (i <= len)
  114. {
  115. SubString(HeadStr, *Str, 1, i - 2);
  116. SubString(Str, *Str, i, len - i + 1);
  117. }
  118. else//只包含一个子串
  119. {
  120. StrCopy(HeadStr, *Str);
  121. StrClear(Str);
  122. }
  123. }
  124. //创建广义表
  125. void CreateList(GList *L,SString S)
  126. {
  127. SString Sub, HeadSub, Empty;
  128. GList p, q;
  129. StrAssign(&Empty, "()");
  130. if (!StrCompare(S, Empty))
  131. *L = NULL;//如果输入是空串,则创建一个空的广义表
  132. else
  133. {
  134. if (!(*L = (GList)malloc(sizeof(GLNode))))
  135. {
  136. printf("内存分配失败!\n");
  137. exit(OVERFLOW);
  138. }
  139. if (StrLength(S) == 1)
  140. {//原子类型广义表
  141. (*L)->atom = S.str[0];
  142. (*L)->tag = ATOM;
  143. }
  144. else
  145. {
  146. (*L)->tag = LIST;
  147. p = *L;
  148. SubString(&Sub, S, 2, StrLength(S) - 2);//去除外层括号
  149. do {
  150. DistributeString(&Sub, &HeadSub);//将Sub分离出表头和表尾
  151. CreateList(&(p->ptr.hp), HeadSub);
  152. q = p;
  153. if (!StrEmpty(Sub))
  154. {
  155. if (!(p = (GLNode *)malloc(sizeof(GLNode)))) {
  156. printf("内存分配失败!\n");
  157. exit(OVERFLOW);
  158. }
  159. p->tag = LIST;
  160. q->ptr.tp = p;
  161. }
  162. } while (!StrEmpty(Sub));
  163. q->ptr.tp = NULL;
  164. }//else else
  165. }//else
  166. }
  167. //输出广义表的串表示形式
  168. void PrintList(GList L)
  169. {
  170. if (!L)
  171. {
  172. printf("()");
  173. }
  174. else
  175. {
  176. if (L->tag == ATOM)
  177. {
  178. printf("%c",L->atom);
  179. }
  180. else
  181. {
  182. printf("(");
  183. GLNode *p = L;
  184. while (p)
  185. {
  186. PrintList(p->ptr.hp);
  187. p = p->ptr.tp;
  188. if (p)
  189. printf(",");
  190. }//while
  191. printf(")");
  192. }//else else
  193. }//else
  194. }
  195. //获取广义表的表头节点
  196. Status GetHead(GList L)
  197. {
  198. if (L == NULL)
  199. {
  200. printf("广义表为空!\n");
  201. return ERROR;
  202. }
  203. GLNode *Head = L->ptr.hp;
  204. if (Head->tag == ATOM)
  205. {
  206. printf("表头:%c\n",Head->atom);
  207. }
  208. else
  209. {
  210. printf("表头:");
  211. PrintList(Head);
  212. printf("\n");
  213. }
  214. return OK;
  215. }
  216. //获取表尾节点
  217. Status GetTail(GList L)
  218. {
  219. if (L == NULL)
  220. {
  221. printf("空表!\n");
  222. return ERROR;
  223. }
  224. GLNode *tail = L->ptr.tp;
  225. printf("表尾:");
  226. PrintList(tail);
  227. printf("\n");
  228. return OK;
  229. }
  230. //求广义表长度
  231. Status GListLength(GList L)
  232. {
  233. int length = 0;
  234. GLNode *p = L;
  235. if (p == NULL)
  236. {
  237. printf("空表\n");
  238. return ERROR;
  239. }
  240. else
  241. {
  242. length = GListLength(p->ptr.tp);
  243. }
  244. return length + 1;
  245. }
  246. //求广义表的深度
  247. Status GListDepth(GList L)
  248. {
  249. int max,depth;
  250. GLNode *p;
  251. if (!L)
  252. return 1;
  253. if (L->tag == ATOM)
  254. return 0;
  255. for (max = 0, p = L; p; p = p->ptr.tp)
  256. {
  257. depth = GListDepth(p->ptr.hp);
  258. if (max < depth)
  259. max = depth;
  260. }
  261. return max + 1;
  262. }
  263. //赋值广义表
  264. Status CopyGList(GList *T, GList L)
  265. {
  266. if (!L)
  267. *T = NULL;
  268. else
  269. {
  270. *T = (GList)malloc(sizeof(GLNode));
  271. if (*T == NULL)
  272. {
  273. printf("内存分配失败!\n");
  274. exit(OVERFLOW);
  275. }
  276. (*T)->tag = L->tag;
  277. if (L->tag == ATOM)
  278. (*T)->atom = L->atom;
  279. else
  280. {
  281. CopyGList(&((*T)->ptr.hp), L->ptr.hp);
  282. CopyGList(&((*T)->ptr.tp), L->ptr.tp);
  283. }
  284. }
  285. return OK;
  286. }
  287. //求广义表原子节点的数目
  288. int CountAtom(GList L)
  289. {
  290. int n1, n2;
  291. if (L == NULL)
  292. return ERROR;
  293. if (L->tag == ATOM)
  294. return 1;
  295. n1 = CountAtom(L->ptr.hp);
  296. n2 = CountAtom(L->ptr.tp);
  297. return n1 + n2;
  298. }
  299. int main()
  300. {
  301. GList L, T;
  302. SString S;
  303. char str[60];
  304. printf("请输入广义表:\n");
  305. cin >> str;
  306. StrAssign(&S,str);
  307. CreateList(&L, S);
  308. printf("输出广义表中的元素是:");
  309. PrintList(L);
  310. printf("\n");
  311. GetHead(L);
  312. GetTail(L);
  313. printf("表的长度为:%d\n",GListLength(L));
  314. printf("表的深度为:%d\n", GListDepth(L));
  315. CopyGList(&T, L);
  316. printf("输出广义表中的元素是:");
  317. PrintList(T);
  318. printf("输出广义表中原子节点个数:%d\n",CountAtom(L));
  319. return 0;
  320. }

参考链接:https ://blog.csdn.net/qq_28598203/article/details/51212082 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/675111
推荐阅读
相关标签
  

闽ICP备14008679号