广义表的建立与一般操作C\C++
来源:互联网 发布:教务管理系统uc矩阵 编辑:程序博客网 时间:2024/05/22 06:56
广义表的建立与一般操作C\C++
一、广义表的概念
广义表是线性表的推广,但线性表的元素仅限于原子项,原子作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限制,允许它们具有自身独立类型结构,就产生了广义表的概念。
广义表是n(n>=0)个数据元素a1,a2,......ai,......,an的有序序列,一般记作:
ls = (a1,a2 ,........,ai, ...an)
其中:ls是广义表的名称,n是它的长度。
二、广义表的数据结构
A = ()
B = (e)
C = (a,(b,(c,d)))
D = ((),B,C)
E = (a,E)
F = (())
图中为广义表的头尾表示法
头尾表示法的存储结构:
typedef enum {ATOM , LIST} Elemtag ;typedef struct node{ Elemtag tag ; //用以标记是单个元素或广义表 union { datatype data ; struct { struct node *hp , *tp ; //指向广义表头节点和尾节点的指针 } ptr ; };} GLNode , *GList ;孩子兄弟表示法的存储结构:
typedef enum {ATOM , LIST} ELemtag ;typedef struct GLENode{ Elemtag tag ; union{ datatype data ; struct GLENode *hp ; }struct GLENode *tp ;} *EGList ;三、广义表的操作
1、广义表的取头、取尾操作
/* *广义表的取头操作 */GList GetHead(GList ls){ GList list = NULL ; if(ls->tag == 1) { list = ls->ptr.hp ; } return list ;}/* *广义表的取尾操作 */GList GetTail(GList ls){ GList list = NULL ; if(ls->tag == 1) { list = ls->ptr.tp ; } return list ;}2、建立广义表的存储结构
/* *将字符串分为表头和表尾字符串 */void server(char *hsub , char *s){ int i , k ; for(i = 0 , k = 0 ; i < strlen(s) ; i++) { if(s[i] == '(') { k++; } if(s[i] == ')') { k--; } if(s[i] == ',' && k == 0) { break ; } } if(i < strlen(s)) { substr(s , hsub , 1 , i) ; substr(s , s , i + 2 , strlen(s) - i - 1) ; } else { substr(s , hsub , 1 ,strlen(s)) ; s[0] = '\0' ; }}/* *建立广义表的存储结构 */int CreateGList(GList *ls , char *s){ GLNode *p , *q ; char hsub[MAXSIZE] ; //字符串为空时,广义表为空 if(s == NULL) { *ls = NULL ; } else { if(!(*ls = (GList)malloc(sizeof(GLNode)))) { return 0 ; } //字符长度为1时,广义表为单个元素 if(strlen(s) == 1) { (*ls)->tag = 0 ; (*ls)->data = *s ; } else { substr(s , s , 2 , strlen(s) - 2) ; //去掉最外层括号; p = (*ls) ; p->tag = 1 ; do { server(hsub , s) ; //获取头节点 CreateGList(&(p->ptr.hp) , hsub) ; q = p ; if(*s != '\0') { p = (GList)malloc(sizeof(GLNode)) ; p->tag = 1 ; q->ptr.tp = p ; } else { p->ptr.tp = NULL ; } }while(*s != '\0') ; } } return 1 ;}3、以表头、表尾建立广义表
/* *以表头和表尾建立广义表 */int Merge(GList l1 , GList l2 , GList *ls){ if(!((*ls) = (GList)malloc(sizeof(GLNode)))) { return 0 ; } (*ls)->tag = 1 ; (*ls)->ptr.hp = l1 ; (*ls)->ptr.tp = l2 ; return 1 ;}4、求广义表的长度
/* *取得广义表的长度 */int Depth(GList ls){ GList p ; int max , depth ; if(ls == NULL) { return 1 ; //空表长度为1 } if(ls->tag == 0) { return 0 ; //单元素长度为0 } for(max = 0 , p = ls->ptr.tp; p ; p = p->ptr.tp) { depth = Depth(p) ; if(depth > max) { max = depth ; } } return max + 1 ;}5、复制广义表
/* *进行广义表的复制 */int CopyGList(GList ls , GList *ls1){ if(ls == NULL) { (*ls1) = NULL ; } else { if(!((*ls1)=(GList)malloc(sizeof(GLNode)))) { return 0 ; } if(ls->tag == 0) { (*ls1)->tag = 0 ; (*ls1)->data = ls->data ; } else { (*ls1)->tag = 1 ; CopyGList(ls->ptr.hp , &((*ls1)->ptr.hp)) ; CopyGList(ls->ptr.tp , &((*ls1)->ptr.tp)) ; } }}四、测试的全部代码
/* *操作均是建立在关于建立在头尾指针的广义表上 */#include<stdio.h>#include<malloc.h>#include<string.h>#define MAXSIZE 100/* *定义广义表节点的存储结构 */typedef char datatype ;typedef enum {ATOM , LIST} Elemtag ;typedef struct node{ Elemtag tag ; //用以标记是单个元素或广义表 union { datatype data ; struct { struct node *hp , *tp ; //指向广义表头节点和尾节点的指针 } ptr ; };} GLNode , *GList ;/* *进行字符串的裁剪,s为被裁剪的对象 */void substr(char *s , char *sub , int startIndex , int len){ int i ; for(i = 1 ; i < startIndex ; s++ , i++) ; for(i = 0 ; i < len ; i++) { sub[i] = s[i] ; } sub[len] = '\0' ;}/* *将字符串分为表头和表尾字符串 */void server(char *hsub , char *s){ int i , k ; for(i = 0 , k = 0 ; i < strlen(s) ; i++) { if(s[i] == '(') { k++; } if(s[i] == ')') { k--; } if(s[i] == ',' && k == 0) { break ; } } if(i < strlen(s)) { substr(s , hsub , 1 , i) ; substr(s , s , i + 2 , strlen(s) - i - 1) ; } else { substr(s , hsub , 1 ,strlen(s)) ; s[0] = '\0' ; }}/* *建立广义表的存储结构 */int CreateGList(GList *ls , char *s){ GLNode *p , *q ; char hsub[MAXSIZE] ; //字符串为空时,广义表为空 if(s == NULL) { *ls = NULL ; } else { if(!(*ls = (GList)malloc(sizeof(GLNode)))) { return 0 ; } //字符长度为1时,广义表为单个元素 if(strlen(s) == 1) { (*ls)->tag = 0 ; (*ls)->data = *s ; } else { substr(s , s , 2 , strlen(s) - 2) ; //去掉最外层括号; p = (*ls) ; p->tag = 1 ; do { server(hsub , s) ; //获取头节点 CreateGList(&(p->ptr.hp) , hsub) ; q = p ; if(*s != '\0') { p = (GList)malloc(sizeof(GLNode)) ; p->tag = 1 ; q->ptr.tp = p ; } else { p->ptr.tp = NULL ; } }while(*s != '\0') ; } } return 1 ;}/* *打印广义表 */void printGList(GList ls){ if(ls != NULL) { if(ls->tag == 0) { printf("%c " , ls->data) ; } else { printGList(ls->ptr.hp) ; printGList(ls->ptr.tp) ; } }}/* *以表头和表尾建立广义表 */int Merge(GList l1 , GList l2 , GList *ls){ if(!((*ls) = (GList)malloc(sizeof(GLNode)))) { return 0 ; } (*ls)->tag = 1 ; (*ls)->ptr.hp = l1 ; (*ls)->ptr.tp = l2 ; return 1 ;}/* *取得广义表的长度 */int Depth(GList ls){ GList p ; int max , depth ; if(ls == NULL) { return 1 ; //空表长度为1 } if(ls->tag == 0) { return 0 ; //单元素长度为0 } for(max = 0 , p = ls->ptr.tp; p ; p = p->ptr.tp) { depth = Depth(p) ; if(depth > max) { max = depth ; } } return max + 1 ;}/* *进行广义表的复制 */int CopyGList(GList ls , GList *ls1){ if(ls == NULL) { (*ls1) = NULL ; } else { if(!((*ls1)=(GList)malloc(sizeof(GLNode)))) { return 0 ; } if(ls->tag == 0) { (*ls1)->tag = 0 ; (*ls1)->data = ls->data ; } else { (*ls1)->tag = 1 ; CopyGList(ls->ptr.hp , &((*ls1)->ptr.hp)) ; CopyGList(ls->ptr.tp , &((*ls1)->ptr.tp)) ; } }}/* *广义表的取头操作 */GList GetHead(GList ls){ GList list = NULL ; if(ls->tag == 1) { list = ls->ptr.hp ; } return list ;}/* *广义表的取尾操作 */GList GetTail(GList ls){ GList list = NULL ; if(ls->tag == 1) { list = ls->ptr.tp ; } return list ;}//进行广义表的测试void main(){ GList ls1 , ls2 , ls3 , ls4 ; char s[MAXSIZE] , s1[MAXSIZE]; scanf("%s" , s) ; CreateGList(&ls1 , s) ; scanf("%s" , s1) ; CreateGList(&ls2 , s1) ; printGList(ls1) ; printf("\n") ; printGList(ls2) ; printf("\n") ; printf("the depth of ls1 is %d \n" , Depth(ls1)) ; printf("the depth of ls2 is %d \n" , Depth(ls2)) ; Merge(ls1 , ls2 , &ls3) ; printGList(ls3) ; printf("\n") ; printf("the depth of ls3 is %d \n" , Depth(ls3)) ; CopyGList(ls3 , &ls4) ; printGList(ls4) ; printf("\n") ; printf("the depth of ls4 is %d \n" , Depth(ls4)) ;}
0 0
- 广义表的建立与一般操作C\C++
- 广义表的建立与一般操作
- 广义表的建立与基本操作
- 广义表的建立与基本操作
- 9. 广义表的建立与基本操作
- 8. 广义表的建立与基本操作
- 稀疏矩阵与广义表的操作(用C写的)
- 广义表的建立与求深度
- [c]链表的建立与一些操作
- 【C++】广义表
- 广义表的C语言实现
- 广义表的C语言实现
- C 类LinkList实现线性链表的一般操作
- c文件操作的一般流程
- 建立广义表的算法
- 数据结构 广义表的建立与求深度
- 数据结构_数组与广义表_广义表的建立、遍历、复制、求深度
- c语言版数据结构(奇迹冬瓜)-数组和广义表(多维数组的基本操作)
- C++运算符重载
- Oracle创建触发器的时候因为大小写编译出错
- Cutting Tree(并查集)
- 初学Python(一)
- java.util.Collections.reverseOrder()方法实例
- 广义表的建立与一般操作C\C++
- C 一个数的立方等于连续奇数和
- hdu1239 Calling Extraterrestrial Intelligence Again (小组赛C) 素数对
- Git建立本地远程仓库
- 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明
- 欢迎使用CSDN-markdown编辑器
- linux 文件锁
- Android基础之AsyncTask源码解析
- 行级元素和块级元素