线性表-链接存储的栈和队列
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.5.2 链接队列
环形链接队列的出队算法 int de_queue_l_c(p-y) int *p_y; { NODE *p; if (tail == NULL) return(1); p=tail->link; *p_y=p->data; tail->link=p->link; free(p); }
0 7 78
12 9
2
-9
4 11 93
3 ^
-61
1.6.1 线性表的压缩存储
3.
压缩存储的优缺点 优点:当相同取值的结点数量较多时, 可节省存储空间。 缺点:给定序号,要求查寻相应结点, 比较困难。对于顺序存储,可用两分查 找法;对于链接存储,就需扫描几乎全 部结点。
1.6.1 线性表的压缩存储
1.6.3 散列存储
1.
概念 散列存储(也称Hash存储),通过对结点的 键值作某种运算来确定具有此结点的存放位置。 设有线性表F=(k0, k1, …, kn-1)和数组T[m], 而结点ki的键值为keyi,若h(x)是键值集合到 整数0至m-1的一个一一对应函数。对于任意 结点ki在数组T[m]中的存放位置由h(keyi)决定, 这种存放结点的方法,称为散列(Hash)存储。 函数h(x)为散列函数,数组T[m]为散列表。
1.6.1 线性表的压缩存储 压缩存储的实现 (1)顺序压缩存储
2.
用顺序存储Baidu Nhomakorabea式(数组)来存储压缩后的新 表F’的结点xt。
0
i
1
0 2
2
4
3
7
4
9
5
11
ki
12 -9 3
78 -61 93
1.6.1 线性表的压缩存储
(2)链接压缩存储
用链接存储方式存储压缩后的新 表F’的结点xt。
head i ki
9
1.6.3 散列存储
2.
问题 (1)难于选取一个从键值集合到散列表地 址空间的一一对应的函数h(x),即对于 keyi≠keyj,有可能h(keyi)=h(keyj)。这种 情况称为冲突。 (2)一旦有冲突,应选取怎样的解决方法?
这些问题留待以后解决。
1.6.2 索引存储
1.
概念 若线性表F=(k0, k1, …, kn-1)划分成m个子 序列,即m个子线性表F0, F1, …, Fm-1。设 x0, x1, …, xm-1分别存储F0, F1, …, Fm-1的 首地址,则X=(x0, x1, …, xm-1)构成索引 线性表(简称索引表)。将X与m个子线 性表F0, F1, …, Fm-1一起存储,这样的结 构为F的索引存储。结点k属于某个子线性 表Fi,则称k的索引是i。
1.6.2 索引存储
其中每个结点的第一项为关键字key。设索 引函数为 index(key)=[key/100] //取整 则F可划分成 F0=(k0, k1, k2)=(18,book),(25,box),(92,pen) F1=(k3, k4)=(153,paper), (198, rubber) F2=(k5, k6)=(245, pencil), (278, rule) F3=(k7)=(300, bag)
讲解p.43的例子:求向量内积(也称点积) 书上例子中向量的分量被顺序压缩存储在数组中。 思考:若向量的分量采用链接压缩存储,即 typedef struct node { int i; int ki; struct node *link; } NODE; NODE *xp, *yp; 算法又将如何?
1.6.3 散列存储
例 设有线性表F=(k0, k1, …, k5)和数组T[10], 其中:k0=(9, e) k1=(12, b) k2=(20, c) k3=(26,a) k4=(34, d) k5=(48, f) 若取散列函数h(x)=x%10,则F的存储状况: 0 1 2 3 4 5 6 7 8 20 c 12 b 34 d 26 a 48 f 9 e
1.5.1 链接栈
空栈 ^
top
非空栈
top -2
3
-8
^
1.5.1 链接栈
进栈:把新结点插到第一个结点(栈顶)的 位置。 p. 40 push_l( ) 出栈:在表示为链接栈的链表中删去第一个 结点(栈顶结点)。 p. 40 pop_l( )
1.5.2 链接队列
队列:只能在一端插入,另一端删除的线性表。 链接队列:用链表表示的队列。 队首:能删除结点的一端。 队首结点:链表的第一个结点,由头指针head所 指。 队尾:能插入结点的一端。 队尾结点:链表的最后一个结点。由尾指针tail 所指。 空队列:head==NULL
1.6.2 索引存储
例 设线性表F=(k0, k1, …, k7)中各结点的值为: k0=(18, book) k1=(25, box) k2=(92, pen) k3=(153, paper) k4=(198, rubber) k5=(245, pencil) k6=(278, rule) k7=(300, bag)
线性表5
上海金融学院信息管理系
1.5 链接存储的栈和队列
本节介绍两个内容:
链接栈 链接队列
1.5.1 链接栈
栈:只能在一端进行插入和删除的线性表。 链表:采用链接存储方式存储的线性表。 链接栈:用链表表示的栈。 栈顶:可进行插入和删除操作的一端。 栈顶结点:由栈顶指针top指向的结点,也是 链表的第一个结点。 栈底结点:链表的最后一个结点。 空栈:top==NULL
1.6.2 索引存储
假如采用“顺序-索引-链接”方式,则可表示为: x[ ]
0 1 2 3 18 book 25 198 box
rubber ^
92
pen
^
153 paper 245 pencil 300 bag ^
278 rule
^
1.6.2 索引存储
数据描述: typedef struct node { int key; char words[20]; struct node *link; } NODE; NODE *x[30];
^
非空环形链接队列
…… tail
1.5.2 链接队列
环形链接队列的数据描述 typedef struct node { int data; struct node *link; } NODE; NODE *tail;
1.5.2 链接队列
环形链接队列的进队算法
void en_queue_l_c(x) int x; { NODE *p; p=(NODE *)malloc(sizeof(NODE)); p->data=x; if(tail==NULL) p->link=p; else { p->link=tail->link; tail->link=p; } tail=p; }
1.6 线性表的其他存储方式
顺序存储 链接存储 压缩存储(本节介绍) 索引存储(本节介绍) 散列存储(本节介绍)
1.6.1 线性表的压缩存储
1. 压缩存储的概念 在线性表 F=(k0, k1, k2, …, kn-1) 中有较大比重数量的结点取相同的值v,则在存 储时将这些取值相同的结点删除。但是,为了能 从存储的新线性表恢复原表,新表结点的数据项 除了结点取值外,还应有结点在原表中的序号, 即 xt = (i, ki) 新表为 F’ = (x0, x1, x2, …, xm-1)
1.6.2 索引存储
2.
划分子线性表F0, F1, …, Fm-1的方法 为了便于查寻和操作,我们把具有某 种相同性质p的结点全部归并到同一个子线 性表Fi中。 索引 i 可根据性质p通过索引函数求得。 必要时,可以在索引表的第i个结点xi中, 存放除了子线性表Fi首结点的地址之外的其 他信息。
1.6.2 索引存储
1.5.2 链接队列
空队列
^
head
非空队列
head … ^
tail
1.5.2 链接队列
进队:把新结点插到队尾。 p. 41 en_queue_l( )
出队:把队首结点删掉。 p.41 de_queue_l( )
1.5.2 链接队列
环形链接队列: 将队尾结点的链接指针指向队首结点的 链接队列。(头指针top可省去) 空环形链接队列 tail
1.6.2 索引存储
NODE *findout(k) // 查寻键值为k的结点,并打印这字 母 int k; { int t; NODE *p; t=k/100; p=x[t]; while(p!=NULL){ if(p->key==k) { printf(“%s”, p->words); return(p); } p=p->link; } return(NULL); }
3.
索引存储的优点
查寻某个结点k,无须遍查F中的所有结点。 只需根据结点k的性质p,计算索引函数求 得i,从索引表中找到结点xi,得到子线性 表Fi的首地址。然后在线性表Fi中查找这 个结点k。
1.6.2 索引存储
4. 存储方法 (1)顺序-索引-链接,即索引表为顺序存储, 子线性表为链接存储。(常用) (2)顺序-索引-顺序,即索引表与子线性表 均为顺序存储。 (3)链接-索引-链接,即索引表与子线性表 均为链接存储。 (4)链接-索引-顺序,即索引表为链接存储, 子线性表为顺序存储。