目录

  • 联系
  • 数组
  • 广义表

联系

数组和广义表可看作一种扩展的线性数据结构,其特殊性在于数据元素的构成上。从组成线性表的元素角度看,数组是由具有某种结构的数据元素构成,广义表则是由单个元素或子表构成的。数组和广义表是线性表的推广。

数组

1.数组的定义
从逻辑结构上,数组可以看成是对一般线性表的扩充。一维数组即为线性表,而二维数组可以定义为其数据元素为一维数组(线性表)的线性表。以此类推,N维数组是数据元素为N-1维数组的线性表。
2.数组的顺序存储
原因: 一旦给定数组的维数n及各维长度bi(1≤i≤n),则该数组中元素的个数就是确定的,数组的基本操作不涉及数组结构的变化。因此对于数组而言,采用顺序存储表示比较适合。
方法: 内存储器的结构是一维的,对于一维数组可直接采用顺序存储,用一维的内存存储表示多维数组,就必须按照某种次序将数组中元素排成一个线性序列,然后将这个线性序列存放在一维的内存储器中,这就是数组的顺序存储结构。
分类: 按行序存储和按列序存储
二维数组Am✖n 以行为主的存储序列为:
a11,a12,…,a1n,a21,a22,…,a2n,…,am1,am2,…,amm
以列为主的存储序列为:
a11,a21,…,am1,a12,a22,…,am2,…,a1n,a2n,…,amn
计算:
(1)一维数组的地址计算
Loc(A[i])=Loc(A[1])+(i-1)✖size
(2)二维数组的地址计算
如果每个元素占size个存储单元:
Loc(A[i][j])=Loc(A[1][1])+((i-1)✖n+(j-1))✖size
如果每个元素占一个存储单元:
Loc(A[i][j])=Loc(A[1][1])+(i-1)✖n+(j-1)
(3)三维数组的地址计算
Loc(A[i][j][k])=Loc(A[1][1][1])+((i-1)✖m✖n+(j-1)✖n+(k-1))✖size
当 j1,j2,j3的下限分别为c1,c2,c3,上限分别为d1,d2,d3
Loc(A[j1][j2][j3])=Loc(A[c1][c2][c3])+(j1-c1)✖((d2-c2+1)✖(d3-c3+1)+(j2-c2)✖(d3-c3+1)+(j3-c3))✖size
(4)n维数组的地址计算
Loc(A[j1][j2]…[jn])=Loc(A[c1][c2]…[cn])+Σ(i=1到n)ai✖(ji-ci)
其中,ai=size✖Π(k=i+1到n)(dk-ck+1),1≤i≤n
3.特殊矩阵的压缩存储
(1)规律分布的特殊矩阵
这类矩阵中元素分布的规律可以用数学公式来反映,通常利用这些规律将其压缩存储于一维数组中。
三角矩阵:

下三角矩阵中元素aij(i≥j),在一维数组中的存储单元的下标为:
Loc(A[i][j])=Loc(A[1][1])+(i✖(i-1)/2+j-1)
注意:对于对称矩阵,因其元素满足aij=aji,我们可以为每一对相等的元素分配一个存储空间,即只存下三角(或上三角)矩阵,从而将n²个元素压缩到n(n+1)/2个空间中
带状矩阵:

Loc(A[i][j])=Loc(A[1][1])+(3(i-1)-1+j-i+1)✖size
=Loc(A[1][1])+(2(i-1)+j-1)✖size
(2)稀疏矩阵

稀疏矩阵指的是大多数元素为0的矩阵。从直观上讲,当非零元素个数低于总元素的30%时,这样的矩阵为稀疏矩阵。
稀疏矩阵的三元组表表示法:
稀疏矩阵的三元组表类型定义

#define MAXSIZE 1000         /*非零元素的最大个数*/
typedef struct
{int row,col;               /*非零元素的行下标和列下标*/ElementType e;              /*非零元素的值*/
}Triple;
typedef struct
{Triple data[MAXSIZE+1];       /*非零元素的三元组表,data[0]未用*/int m,n,len;              /*矩阵的行数,列数和非零元素的个数*/
}TSMatrix;

对于稀疏矩阵的压缩存储,采取只存储非零元素的方法。由于稀疏矩阵中非零元素aij的分布没有规律,因此,在存储非零元素值的同时,还必须存储非零元素在矩阵中所处的行号和列号,这就是稀疏矩阵的三元组表表示法。

稀疏矩阵的转置运算
第一步:将三元组表中的行列对换
第二步:若转置后的三元组表以行序为主序存放,则对转置后的三元组表按行标递增排列,反之亦然。
稀疏矩阵的链式存储结构:十字链表
十字链表的类型定义:

typedef struct OLNode
{int row,col;               /*非零元素的行下标和列下标*/ElementType value;struct OLNode *right,*down;   /*非零元素所在行表,列表的后继链域*/
}OLNode;*OLink;
typedef struct
{OLink *row_head,*col_head; /*行、列表的头指针向量*/int m,n,len;              /*稀疏矩阵的行数、列数、非零元素的个数*/
}CrossList;

为了避免大量移动元素,使用十字链表,能够灵活插入因运算而产生的新的非零元素,删除因运算而产生的新的非零元素,实现矩阵的各种运算。

除了(row,col,value)以外,还要添加两个链域:right用于链接同一行中的下一个非零元素,down用于链接同一列中的下一个非零元素。表示如下:

广义表

1.广义表的概念
广义表是n个数据元素(d1,d2,…dn)的有限序列,di既可以是单个元素,还可以是一个广义表,通常记作GL=(d1,d2,…dn)。其中d1是广义表表头,GL其余部分组成的表(d2,d3,…dn)称为广义表表尾。
2.广义表的存储结构
由于广义表中的数据元素既可以是单个元素,也可以是子表,因此对于广义表来说,难以用顺序存储结构来表示它,通常用链式存储结构来表示。
(1)广义表的头尾链表存储结构
任何一个非空的广义表都可以将其分解成表头和表尾两部分,繁殖,一对确定的表头和表尾可以唯一的确定一个广义表。因此:
表结点:由三个域构成,标志域、指向表头的指针域和指向表尾的指针域
元素结点:只需两个域,标志域和值域
广义表头尾链表存储结构类型定义

typedef enum {ATOM,LIST} ElemTag;/*ATOM=0,表示原子;LIST=1,表示子表*/
typedef struct GLNode
{ElemTag tag;               /*标志位tag用来区分原子结点和表结点*/union{AtomType atom;          /*原子结点的值域atom*/struct {struct GLNode *hp,*tp;} htp;/*表结点的指针域htp,包括表头指针域hp和表尾指针域tp*/}atom_htp;                    /*atom_htp是原子结点的值域atom和表结点的指针域htp的联合体域*/
}GLNode,*GList;

(2)广义表的同层结点链存储结构
这种结构中,表结点和元素结点都由三个域构成
表结点:标志域、指向表头的指针域和指向表尾的指针域
元素结点:标志域、值域和指向表尾的指针域
广义表的同层结点链存储结构类型定义如下

typedef enum {ATOM,LIST} ElemTag;/*ATOM=0,表示原子;LIST=1表示子表*/
typedef struct GLNode
{ElemTag tag;union{AtomType atom;struct GLNode *hp;     /*表头指针域*/}atom_hp;                  /*atom_hp是原子结点的值域atom和表结点的表头指针域hp的联合体域*/struct GLNode *tp;          /*同层下一个结点的指针域*/
}GLNode,*GList;

3.广义表的操作
以头尾链表为例
(1)求广义表L的表头

GList Head(GList L)
{if(L==NULL)                  /*空表无表头*/return 0;if(L->tag==ATOM)         /*原子不是表*/exit(0);elsereturn(L->atom_htp.htp.hp);
}

(2)求广义表L的表尾

GList Tail(GList L)
{if(L==NULL)                  /*空表无表尾*/return(0);if(L->tag==ATOM)            /*原子不是表*/exit(0);elsereturn(L->atom_htp.htp.tp);
}

(3)求广义表L的长度

int Length(GList L)
{int k=0;GLNode *s;if(L==NULL)return(0);if(L->tag==ATOM)exit(0);s=L;while(s!=NULL){k++;s=s->atom_htp.htp.hp;}return(k);
}

(4)求广义表L的深度

int Depth(GList L)
{int d,max;GLNode *s;if(L==NULL)return(1);if(L->tag==ATOM)return(0);s=L;while(s!=NULL){d=Depth(s->atom_htp.htp.hp);if(d>max)max=d;s=s->atom_htp.htp.hp;}return(max+1);                /*表的深度等于最深子表的深度加一*/
}

(5)求广义表L中原子数目

int CountAtom(GList L)
{int n1,n2;if(L==NULL)return(0);if(L->tag==ATOM)return(1);n1=CountAtom(L->atom_htp.htp.hp);  /*求表头中的原子数目*/n2=CountAtom(L->atom_htp.htp.tp);  /*求表尾中的原子数目*/return(n1+n2);
}

(6)复制广义表L
复制S表至T表

int CopyGList(GList S,GList *T)
{       if(S==NULL)                           /*复制空表*/{*T=NULL;return(1);}*T=(GLNode*)malloc(sizeof(GLNode));if(*T==NULL)return(0);(*T)->tag=S->tag;if(S->tag==ATOM)(*T)->atom=S->atom;                /*复制单个原子*/else{CopyGList(S->atom_htp.htp.hp,&((*T)->atom_htp.htp.hp));/*复制表头*/CopyGList(S->atom_htp.htp.tp,&((*T)->atom_htp.htp.tp));/*复制表尾*/}return(1);
}

数据结构之数组与广义表相关推荐

  1. 数据结构05数组和广义表

    第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展:表中的数据元素本身也是一个数据结构. 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束,每个元素都有一个直接后继元素 ...

  2. 数据结构:数组和广义表

    数组 数组这部分内容在写<线性表>的的时候介绍过,所以这里就略过一部分内容(略过的内容在这里),写一写前边没写过的. 由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和 ...

  3. C语言数据结构学习——数组和广义表

    数组和广义表 数组 数组定义 特点 常见运算及声明方式 数组的顺序表示和实现 矩阵的压缩存储 概念 稀疏矩阵 对称矩阵 三角矩阵 广义表 数组 数组定义 数组(Array)是有序的元素序列.若将有限个 ...

  4. 六、考研数据结构笔记——数组与广义表

    一.数组的定义 一维数组:就是线性表,前面有 二维数组:准备考研的应该都知道,就是一个矩阵. 数组一旦被定义其,维数(行)和维界(列)就不能改变.只会读取加修改元素. 二.二维数组的按行(列)优先 事 ...

  5. 【数据结构】数组和广义表

    感觉数组这一段没讲什么太多的东西. 先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外.操作只有初始化 销毁 取元素 修改元素.然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 ...

  6. Java数据结构和算法:字符串、数组和广义表

    数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...

  7. 【数据结构总结】第四章:串、数组和广义表(线性结构)

    第四章:串.数组和广义表(线性结构) 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅 ...

  8. 数据结构数组计算机中的应用,2018考研计算机:数据结构数组和广义表复习重点...

    2018考研计算机:数据结构数组和广义表复习重点 2017-08-17 16:00 | 考研集训营 <数据结构(C语言版)>复习重点在二.三.六.七.九.十章,考试内容两大类:概念,算法, ...

  9. 数组和广义表 - [数据结构]

    2005-09-07 数组和广义表 - [数据结构] 第五章 数组和广义表 --非线性数据结构 5.1 数组的定义和运算 ☆二维数组的逻辑结构形式定义为: 2_Array=( D, R ) 其中 D= ...

最新文章

  1. win7 php mysql扩展名_Win7 iis php mysql 开发环境配置(详细)
  2. sicily 1150. 简单魔板
  3. 几篇JVM实战的东西
  4. 算法导论之图的基本算法
  5. mybatis入门(四)之动态SQL
  6. 编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match
  7. Vue项目中遇到了大文件分片上传的问题
  8. dropload.js无限刷新解决方案
  9. 使用container的嵌套_ElementUI 技术揭秘(4)— Container 布局容器组件的设计与实现。...
  10. Object-C---gt;Swift之(一)元组(tuple)类型
  11. realme GT2 Pro抢先开启盲售:史上屏幕最好高端旗舰
  12. 11 绑定方法与非绑定方法
  13. jms与ActivityMQ中的简单使用
  14. 宁夏诗词学会红寺堡采风专辑
  15. php 点击刷新验证码,thinkphp3.2点击刷新生成验证码
  16. word文档的尺寸和字号对照表
  17. HTTPClient模拟登陆开心网001
  18. English improvement of IT Test(2014)
  19. vb6.0 清除IE浏览器缓存
  20. Opencv-Python提取掌纹图片ROI

热门文章

  1. linux字体操作,安装字体
  2. JavaScript高级特效
  3. ubuntu16.04 无法上网安装网卡驱动 e1000e
  4. 彻底解决快播不可点播方法
  5. 程序员这样使用电脑,想卡都超级难!
  6. uploadify java 下载_uploadify java实现多文件上传和预览
  7. (python+cv2)做一个简单的摄像头人脸识别
  8. MSN空间日志发布项灰色解决方法
  9. Html 作业:静态页面
  10. JSP中文乱码问题终极解决方案(上)