4-第二章线性链表及其运算(2.3)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线性表链式存储结构
存储结点
假设数据结构中的每一个数据结点对应 一个存储单元,这种存储单元称为存 储节点,简称节点。 存储方式 两部分组成: 1.存储数据元素的部分,称为数据域 2.存放指针的地方,称为指针域
5
2. 3.1 线性链表及其运算
线性链表(单链表):每个结点只有一 个指针域,这个指针域只能找到后件结 点,但不能找到前件结点(带链的栈和 带链的队列) 循环链表:收尾相接的单链表。 双向链表:每个结点设置两个指针,一 个指向前件结点,一个指向后件结点。
从头指针开始 查找
如果结点值不为小, 或者没有到链表末 尾,则继续查找
找到,则返回该结点 指针
13
带链的栈 链栈---栈的链式存储结构(当顺序栈
的最大容量事先无法估计时,可采用链栈 结构)。
data TOP 链栈的定义: Typedef struct node{ int data; struct node *link;}JD . . link 栈顶
队尾
17
2.链队列结点及front和rear指针
链队列结点
typedef struct node { elemtype data; struct node *link; } NODE, *NODEPTR;
front和rear指针
typedef struct { NODEPTR front, rear; } LINKQUEUE;
return (0);
19
4. 链队列运算—入队
void AddQueue (LINKQUEUE *q, elemtype e) { NODEPTR p; p=(NODEPTR)malloc(sizeof(NODEPTR)); p->data=e; p->link=NULL; if (QueueIsEmpty (q) ) { q->front=p; q->rear=p; }else { q->rear->link=p; q->rear=p; } }
将存储空间分为若干小块,每一小块占若干字 节,改小块称为存储结点 每一存储结点包括数据域及指针域 各数据结点的存储序号不连续。 存储结点序号与逻辑关系不一致 存在一个HEAD指针指向第一个元素的结点 最后一个元素没有后件,常用NULL表示
9
3. 链表的基本操作—插入与删除
Head a b Head
struct Linear_chain_node *link; }; } NODE; typedef struct Linear_chain_node NODE;
11
5. 线性链表运算—建立
建立n个元素线性链表,结点数据由键盘输入
NODE *Create_linear_chain (int n) { NODE *head, *p, *q; int i; p=(NODE *)malloc(sizeof(NODE)); p->data=0; p->link=NULL; head=p; for (i=1; i<=n; i++) { q=(NODE *)malloc( sizeof( NODE)); scanf(“ %d ”, &q->data); q->link=NULL; p->link=q; p=q; } return (head); }
18
3 链队列运算—初始化
链队列的初始化
void InitQueue (LINKQUEUE *q)
链队列的判空:
int QueueIsEmpty (LINKQUEUE *q) { if (q->front==NULL)
{
q->front=NULL; q->rear=NULL; }
}
&& (q->front==NULL) return (1);
14
链栈
链栈进栈运算--JD *lzjz(JD *top,int x)
{/*将元素x进链栈 */
JD *p;
p=(JD *)malloc(sizeof(JD)); P->data=x; p->link=top; return(p); }
15
链栈
链栈退栈运算--JD *lztz(JD *top,int *p)
回 顾
队列的概念。
上节课
队列和栈的异同
队列的基本操作
入队运算、出队运算的基本流程
1
队列的应用
在计算机软件设计中,队列的应用是很普遍的, 典型应用为: 操作系统的作业排队,输入输出缓冲区采用队 列结构 给工人分配工作的模拟 汽车加油站的工作模拟
2
2. 3 线性链表及其运算
线性链表 循环链表 链队列
┄
Head
a x
b
Head a
插 入
b
┄
a x
b
┄
∧
删ຫໍສະໝຸດ Baidu除
Head a b c
┄
∧
10
4. 线性链表结点C语言描述
或者:
typedef struct Struct Linear_chain_node {
Linear_chain_node
{ int data;
int data;
struct Linear_chain_node *link;
6
1. 线性链表逻辑结构
线性链表的结点(NODE)
info next
信息域
指针域
线性链表结构:
HEAD A B C NULL
7
2. 线性链表的存储结构
HEAD 3 1 2 3 4 5 6 7 8 9 10 B A D 9 1 NULL
C
5
HEAD
3 A
1 B
9 C
5 D NULL
8
线性链表的特点:
20
5. 链队列运算—出队
int DelQueue (LINKQUEUE *q, elemtype *e) { NODEPTR p; if (QueueIsEmpty (q) ) return (0); // Empty *e=q->front->data; p=q->front; q->front=q->front->link; free(p); if (q->front==NULL) q->rear=NULL; return (1); }
{/*从链栈顶取出元素存至(*p) */
JD *q;
if(top!=NULL) {q=top; *p=top->data; top=top->link; free(p);} return (top); }
16
1. 链队列的使用
如果队列的容量无法预先估计时,可以采用 链表存储结构
Front
队头
Rear
动态分配内存空间
生成一个新Node
生成头结点指针
返回头结点指针
12
6. 线性链表运算—查找
在链表中查找值为x的结点
NODE *findnode(NODE *head, int x) { NODE *p; p=head; while ((p!=NULL)&&(p->data!=x)) p=p->link; if (p->data==x) return (p); return (NULL); }
3
线性表顺序结构使用的缺陷
当添加和删除数据元素时,其他表数据将产 生移位操作,工作量大; 当存储空间满时,继续添加数据元素将产生 上溢出; 当存储空间空时,继续删除数据元素将产生 下溢出; 静态存储数据,在一些应用中使用不便。 在实际应用中,往往是同时多线性表共享空 间,对空间分配存在难题
4
21