7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。

Slides:



Advertisements
Similar presentations
首页 全国高等学校招生考试统一考试 监考员培训 广州市招生考试委员会办公室.
Advertisements

人口增长.
第一章 会计法律制度 补充要点.
二、个性教育.
第7章 樹與二元樹 (Trees and Binary Trees)
四資二甲 第三週作業 物件導向程式設計.
程序设计实习 3月份练习解答
第6章 二叉树和树 前面的章节主要讨论的是线性结构,二叉树和树属于非线性的结构。遍历非线性结构比线性结构要麻烦。
第一章 C语言概述 计算机公共教学部.
数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
AI人工智慧報告 黑白棋 班級:資工四乙 學號:498G0009 姓名:盧冠妤.
计算机硕士专业基础—C语言 赵海英
<<广东省中小学生体能素质评价标准>>
補充: Input from a text file
数据结构——树和二叉树 1/96.
面向海洋的开放地区——珠江三角洲 山东省高青县实验中学:郑宝田.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
存货的核算 一、项目任务 1、原材料核算 ——按实际成本核算 ——按计划成本核算 2、低值易耗品及包装物核算 3、存货清查的核算
数据结构与算法 数据结构与算法实验
专题研讨课二: 数组在解决复杂问题中的作用
江苏省2009年普通高校 招生录取办法 江苏省教育考试院
一、单选题 1、 字符串“ababacbab”和字符串“abcba”的最长公共子串是( )。
Linked List Operations
單向鏈結串列 Singly Linked Lists.
第4章 串 串的基本概念和C语言的串函数 串的存储结构 动态数组实现的顺序串 串的模式匹配算法——BF算法 主要知识点.
数据结构 Data Structure 主讲人:王国军,郑瑾 中南大学 中南大学信息院计科系
Class 2 流程控制-選擇敘述與迴圈.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第五章 数组和 广义表 数组 稀疏矩阵 广义表.
第五章 数组和广义表.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第12章 樹狀搜尋結構 (Search Trees)
STRUCTURE 授課:ANT 日期:2010/5/12.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
流程控制、陣列 台南市聖功女子高級中學 毛全良.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
C语言 程序设计基础与试验 刘新国、2012年秋.
第一章 绪论.
THE C PROGRAMMING LANGUAGE
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
6.3 遍历二叉树和线索二叉树(知识点二) 遍历二叉树 一、问题的提出
第四章串 4.1 串类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例.
第四章 串.
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
数组 梁春燕 华电信息管理教研室.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
3.1 线性表及逻辑结构 3.2 线性表的顺序存储 3.3 线性表的链式存储 3.4 链式存储结构的应用
自我參考結構 (self-reference – 1)
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
C语言概述 第一章.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
C语言复习3----指针.
第7章 樹與二元樹(Trees and Binary Trees)
C程序设计.
C程序设计.
第4章 数 组.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
#include <iostream.h>
Ch.5 数组和广义表 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
第13章 文 件.
第三章 线性表 3.1 线性表的类型定义 3.2 顺序存储的线性表 3.3 链式存储的线性表 3.4 有序表 3.5 顺序表和链表的综合比较.
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
Presentation transcript:

7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。 广义表可以看作是线性表的推广,但如果从原子数据元素的角度看,一个数据元素有多个后继原子数据元素,就属于下一章要讨论的树型结构。所以,广义表本质上是非线性结构。

一个广义表通常用一对圆括号括起来,这样当这个广义表中的某个数据元素又是一个广义表时,就可以再用一对括号括起来。广义表中的原子数据元素通常用小写字母表示,而广义表通常用大写字母表示。从结构上看一个广义表对应了一棵树。例如,设有如下广义表: A = () B = (a, b, c) C = (d) D = (B, C) = ((a, b, c), (d)) E = (D, e) = (((a, b, c), (d)), e)。

广义表E的图形表示

广义表的长度指广义表中数据元素(原子元素或广义表)的个数。如广义表A的长度为0,广义表B的长度为3,广义表C的长度为1,广义表D的长度为2(注意D中只有两个数据元素B和C),广义表E的长度为2。 广义表的原子元素个数指广义表中原子数据元素的个数。如广义表A的原子元素个数为0,广义表B的原子元素个数为3,广义表C的原子元素个数为1,广义表D的原子元素个数为4,广义表E的原子元素个数为5。 广义表的深度指广义表中所有原子数据元素到达根结点的最大值。一个广义表对应了一棵树,广义表的深度即是指广义表所对应的树的深度。如广义表A,B和C的深度均为1,广义表D的深度为2,广义表E的深度为3。

一个广义表无论简单或复杂,都可以分做表头和表尾两部分。任何一个非空广义表的表头既可能是原子也可能是广义表,但非空广义表的表尾一定是一个广义表。 例如广义表(a,b),其表头为原子a,其表尾为广义表(b);又例如广义表(b),其表头为原子b,其表尾为空广义表();又例如广义表(((a,b,c),(d)),e),其表头为广义表((a,b,c),(d)),其表尾为广义表(e)。 对任何一个广义表的处理都可以由对表头的处理部分和对表尾的处理部分两部分组成。 广义表有许多应用,其中最典型的,是在表处理语言LISP中,把广义表作为基本的数据结构,就连程序也表示为一系列的广义表。另外,广义表还可以用来表示m元多项式。所谓m元多项式就是其每一项最多允许有m个变元。

广义表抽象数据类型 数据集合: 广义表的数据集合可以表示为a0, a1, a2, ..., an-1,每个  广义表抽象数据类型 数据集合: 广义表的数据集合可以表示为a0, a1, a2, ..., an-1,每个 数据元素或是原子元素,或是一个广义表。 操作集合: (1)创建广义表CreatGList(S) (2)求长度GListLength(L) (3)求原子元素个数GListAtomNum(L) (4)求深度GListDepth(L)

(5)判非空否GListNotEmpty(L) (6)取表头GetHead(L) (7)取表尾GetTail(L) (8)插入GListInsert(L, e) (9)删除GListDelete(L, e) (10)查找原子元素GListSearch(L, e) (11)撤消DestroyGList(L)

7.2 广义表的存储结构 头链和尾链存储结构 一个广义表可以由表头和表尾两部分组成,所以可以用一个头指针和一个尾指针表示一个广义表。这样,头链和尾链结构中一个结点的结构由一个标志域tag决定:当tag值为1时,该结点除标志域外还有一个头指针域和一个尾指针域;当tag值为0时,该结点除标志域外还有一个原子元素域。

原子和子表存储结构 观察上图中的结点可以发现,头链和尾链存储结构中当结点为原子元素时,需要由头指针所指的结点存储该原子元素。若此时在该结点中直接存储该原子元素,则构成了原子和子表结构。其中标志tag含义同上,即tag值为1时,该结点除标志域外还有一个头指针域和一个尾指针域;当tag值为0时,该结点除标志域外还有一个原子元素域

7.3 广义表的操作实现 本节分别讨论头链和尾链存储结构下和原子和子表存储结构下一些典型操作的算法实现。   本节分别讨论头链和尾链存储结构下和原子和子表存储结构下一些典型操作的算法实现。 头链和尾链存储结构下,结点的结构体定义 typedef struct GListNode { int tag; union { DataType atom; //原子元素域 struct { struct GListNode *head; //头链 struct GListNode *tail; //尾链 }subList; } val; }GLNode;

创建广义表 创建广义表就是按照所给的表示具体广义表的字符串str创建一个广义表h。 对一个广义表的任何操作都可以分解为对表头的操作和对表尾的操作。同样,创建广义表操作可以分解为创建表头广义表和创建表尾广义表。因此,创建广义表函数CreatGList(str)只要递归完成对表头广义表的创建和对表尾广义表的创建即可。 这样,还需要设计一个把表示广义表的字符串str分解成表头字符串hstr和表尾字符串str的函数DecomposeStr(str, hstr)。

void DecomposeStr(char str[], char hstr[]) { int i, j, tag, n = strlen(str); char ch; ch = str[0]; tag = 0; for(i = 0; i <= n-1; i++) { if(str[i] == ',' && tag == 1 ) break; ch = str[i]; if(ch == '(') tag++; if(ch == ')') tag--; } if(i <= n-1 && str[i] == ',') { for(j = 0; j < i-1; j++) hstr[j] = str[j+1]; hstr[j] = '\0'; if(str[i] == ',') i++; str[0] = '('; for(j = 1; i <= n-2; i++, j++) str[j] = str[i]; str[j] = ')'; str[++j] = '\0'; //

else { str++; strncpy(hstr,str, n-2); hstr[n-2] = '\0'; str--; strcpy(str, "()"); }

GLNode* CreatGList(char str[]) { GLNode *h; char hstr[200]; int len = strlen(str); if(strcmp(str, "()") == 0) h = NULL; else if(len == 1) { h = (GLNode *)malloc(sizeof(GLNode)); h->tag = 0; h->val.atom = str[0]; }

else { h = (GLNode *)malloc(sizeof(GLNode)); h->tag = 1; DecomposeStr(str, hstr); h->val.subList.head = CreatGList(hstr); if(strcmp(str, "()") != 0) h->val.subList.tail = CreatGList(str); h->val.subList.tail = NULL; } return h;

求广义表的深度 广义表的深度是广义表中所有原子数据元素到达根结点的最大值。 int GListDepth(GLNode *h) { int max, dep; GLNode *pre; if(h == NULL) return 1; if(h->tag == 0) return 0; pre = h; for(max = 0; pre != NULL; pre = pre->val.subList.tail) { dep = GListDepth(pre->val.subList.head); if(dep > max) max = dep; } return max + 1;

求广义表长度 在头链和尾链存储结构中,广义表的长度就是表尾指针构成的单链表的长度。 int GListLength(GLNode *h) { int number = 0; GLNode *p; for(p = h; p != NULL; p = p->val.subList.tail) number++; return number; }

求广义表中原子元素个数 int GListAtomNum(GLNode *h) { if(h == NULL) return 0; else if(h->tag == 0) return 1; else return GListAtomNum(h->val.subList.head) + GListAtomNum(h->val.subList.tail); }

原子和子表存储结构下的操作实现 原子和子表存储结构下,结点的结构体定义 typedef struct GListNode { int tag; struct GListNode *tail; union DataType atom; struct GListNode *head; } val; }GLNode2;

创建广义表 创建广义表就是按照所给的表示具体广义表的字符串str创建一个广义表h。 和头链和尾链存储结构广义表的创建算法类同,原子和子表存储结构的创建广义表操作同样可以分解为创建表头广义表和创建表尾广义表。 把表示广义表的字符串str分解成表头字符串hstr和表尾字符串str的函数DecomposeStr(str, hstr)设计和前面的方法完全相同。

创建函数如下: GLNode2* CreatGList(char str[]) { GLNode2 *h; char hstr[200]; int len = strlen(str); if(strcmp(str, "()") == 0) h = NULL; else h = (GLNode2 *)malloc(sizeof(GLNode2)); if(len == 1) { h->tag = 0; h->val.atom = str[0]; h->tail == NULL; }

else { DecomposeStr(str, hstr); if(strlen(hstr) == 1) { h->tag = 0; h->val.atom = hstr[0]; } { h->tag = 1; h->val.head = CreatGList(hstr); if(strcmp(str, "()") != 0) h->tail = CreatGList(str); h->tail = NULL; return h;

作业 1)习题7-1,7-2 ,7-3 ,7-4