链式存储结构小结

本文详细介绍了链式存储结构,包括链栈的操作如入栈、出栈,链队列的入队、出队,以及线性表的链式表示,如单链表、双向链表、循环链表和双向循环链表的特性与操作。还对比了线性表的顺序存储和链式存储结构的优缺点。
摘要由CSDN通过智能技术生成

索引

点击跳到链栈
点击跳到链队列
点击跳到单链表
点击跳到双向链表
点击跳到单循环链表
点击跳到双向循环链表
点击跳到线性表两种存储结构的比较


2.1、链栈

采用链式存储结构的栈称为链栈。设栈S=(a1,a2,a3,…,an),其中a1为栈底元素,an为栈顶元素,栈顶指针指向an。如图所示,当栈为空时,栈顶指针为NULL。在这里插入图片描述
由图可见,链栈是由栈顶指针唯一确定的,其类型定义如下:

typedef struct LSNode{
   
	ElemType data;//数据域
	struct LSNode *next;//指针域
}LSNode,*LStack;//结点和链栈类型

链栈的接口定义如下:

(一)入栈操作:
该操作为入栈元素e生成一个新结点,并插入在栈顶。

Status Push_LS(LStack &S,ElemType e){
   //元素e压入栈S
	LSNode *t;
	t=(LSNode *)malloc(sizeof(LSNode));//为元素e分配结点空间
	if(NULL==t)//分配失败返回
		return OVERFLOW;
	t->data=e;//在栈顶位置插入新结点
	t->next=S;
	S=t;
	return OK;
}

(二)出栈操作:
若栈S为空,则报错返回;否则,删除栈顶结点,并用参数e返回其元素值。

Status Pop_LS(LStack &s,ElemType &e){
   //栈S的栈顶元素出栈,并用e返回
	LSNode * t;
	if(S==NULL)//判断是否为空栈
		return ERROR;
	t=S;//t指向栈顶元素结点
	e=S->data;//用e返回栈顶元素值
	S=S->next;//删除栈顶元素结点
	free(t);//释放结点
	return OK;
}

2.2、链队列

采用链式存储结构的队列称为链队列,如图所示。由于队列的操作是在队头和队尾两端进行的,故需设置头尾指针指示链表的头尾结点。 链队列的类型定义如下:
typedef struct LQNode{
   
	ElemType data;
	struct LQNode *next;
}LQNode,*QueuePtr;//结点及其指针类型
typedef struct{
   
	QueuePtr front;//队头指针
	QueuePtr rear;//队尾指针
}LQueue;//链队列

链队列的接口定义如下:

在这里插入图片描述

(一)入队操作:
该操作在链队列Q的队尾插入一个新结点e,并令队尾指针指向该结点。若Q为空,则队头指针也指向该结点。

Status EnQueue_LQ(LQueue &Q,ElemType e){
   //在队列Q的队尾插入元素e
	LNode *p;
	p=(LNode *)malloc(sizeof(LNode));
	if(NULL==p)
		return OVERFLOW;
	p->data=e;
	p->next=NULL;
	if(Q.front==NULL)//e插入空队列
		Q.front=p;
	else//e插入非空队列
		Q.rear->next=p;
	Q.rear=p;//队尾指针指向新结点
	return OK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值