前言

提示:本篇文章收录严蔚敏编写的数据结构C语言版本
简单介绍一下顺序表,顺序栈,循环队列,的顺序存储结构之间的区别
代码参考严蔚敏编写的《数据结构》,二维码动态演示可扫码可观看。

在这里插入图片描述

提示:结合教材更容易理解

一、代码的宏定义、重定义、名称解释。

代码如下(示例):

#include<iostream>
#define OK 1         //算法成功实现返回1
#define ERROR -1     //算法错误返回-1
#define OVERFLOW -2  //错误返回值
#define MAXSIZE 100  //数组最大容量

using namespace std;    // c++
typedef int Status;     //重命名 int为Status
typedef char Elemtype;  //重命名 cahr为Elemtype(元素类型)

SqList代表顺序表,SqStack代表顺序栈,SqQueue代表顺序队列

二、三种线性表

顺序表、顺序栈、循环链表五个算法

1.顺序存储结构

代码如下(示例):

typedef struct {      //顺序表存储结构
	Elemtype * elem;  //数组基地址  a[0]中a的地址
	int length;       //顺序表表长
}SqList;              //顺序表的结构类型为SqList

typedef struct {     //顺序栈存储结构
	Elemtype *base;  // 栈底指针,指向栈底不变化
	Elemtype *top;   //栈顶指针 只移动栈顶指针,top++  top--
	int Stacksize;   //栈的最大容量
}SqStack;

typedef struct {     //循环队列顺序存储结构
	Elemtype *base;  //基地址 a[10]的a
	int front;       //头指针 处理出队操作
	int rear;        //尾指针 处理入队操作
}SqQueue;            

2.初始化

代码如下(示例):

Status Initlist(SqList &l ){        //顺序表初始化
	l.elem=new Elemtype [MAXSIZE];  //申请elem[100]
	if(!l.elem)  return ERROR;      // 申请失败退出
	l.length=0;                     // 表长值为0
	return OK; 
}

Status Initstack(SqStack &s){		 //顺序栈初始化
	s.base =new Elemtype [MAXSIZE];  //申请char base[100]
	if(!s.base)   return ERROR;		 //申请失败退出
	s.base=s.top;					 //空栈
	s.Stacksize=MAXSIZE;			//把最大容量赋值给Stacksize
	return OK;          
}

Status Initqueue(SqQueue &Q){       //循环队顺序存储列初始化
	Q.base=new Elemtype [MAXSIZE];	//申请char base[100]
	if(!Q.base)	return ERROR;		//申请失败退出
	Q.front=Q.rear=0;				//空队列
	return OK;		
}

顺序表初始化(教材25页)
顺序表存储结构
顺序栈初始化(教材58页)

顺序栈
循环队列(教材71页)
队列

3.插入,入栈,入队

代码如下(示例):

Status Inserlist(SqList &l,int i,Elemtype e){ //顺序表插入元素
	if((i<1)||(i>l.length+1))  return ERROR;  // 判断插入位置是否合理
	if(l.length==MAXSIZE)      return ERROR;  //判断表是否已满
	for(int j=l.length-1;j>=i-1;j--)		  //依次从length-1后移覆盖元素
		l.elem[j+1]=l.elem[j];			      //覆盖
	l.elem[i-1]=e;							  //存放插入元素给e
	l.length++;								 //表长加一
	return OK; 								
}

Status Push(SqStack &s,Elemtype e){     //顺序栈入栈,不需要int i,只能在top操作
	if(s.top-s.base==s.Stacksize)  
		return ERROR;					//判断是否栈满
	*s.top=e;							//保存元素a[top]=e
	s.top++;							//头指针加一top++
	return OK;                          //
}

Status Enqueue(SqQueue &Q,Elemtype e){//循环队列入队,没有int i,rear队尾入队
	if((Q.rear+1)%MAXSIZE==Q.front)	  //判断
	  return ERROR;
	Q.base[Q.rear]=e;				// a[rear]=e
	Q.rear=(Q.rear+1)%MAXSIZE;		//指向下一个元素
	return OK;
}

一般顺序表插入(教材27页)
顺序表插入
动态演示:插入、入栈、入队(59/72页)
请添加图片描述

4.删除,出栈,出队

代码如下(示例):

Status ListDelete(SqList &L,int i){  //顺序表的删除,传入删除位置i
	if((i<1)||(i>L.length))          //删除位置是否合理
	  return ERROR;  				
	for(int j=i;j<=L.length-1;j++)	//未删除元素依次先前覆盖元素
		L.elem[j-1]=L.elem[j];		//elem[i+1]覆盖elem[i]达到删除目的
	L.length--;						//表长减一
	return OK;
}

Status Pop (SqStack &S,Elemtype &e){	//顺序栈的出栈
	if(S.top==S.base)   return ERROR;	//判空
	e=*S.top;							//用e返回删除元素的值
	--S.top;							//栈顶指针减一
	return OK;
}

Status DeQueue(SqQueue &Q,Elemtype &e){	//循环队列的出队
	if(Q.rear==Q.front)   return ERROR;	//判空
	e=Q.base [Q.front];					//用e返回删除元素的值
	Q.front=(Q.front+1)%MAXSIZE;		//栈顶指针指向上一个
	return OK;
} 

动态演示:删除、出栈、出队(29/59/72页)
请添加图片描述

5.取值

代码如下(示例):

Elemtype Getelem(SqList L,int i,Elemtype &e){	//顺序表的取值,i的位置
	if(i<1||i>L.length)  return ERROR;			//判断位置是否合理
	if(L.length!=0)  							//判断是否为空
	return e=L.elem[i-1];						//用e返回第i个元素的值elem[i-1]
}

Elemtype GetTop(SqStack S){	//顺序栈取值栈顶元素
	if(S.base!=S.top)		//栈非空
	return *(S.top-1);		//返回栈顶元素的值,栈顶指针不变,top--
	
}

Elemtype GetTop(SqQueue Q){	//循环队列的取值
	if(Q.front!=Q.rear)		//判空
	return Q.base[Q.front];	//返回队列顶部元素
}

动画演示:取值(26、59、73页)
请添加图片描述

三、电子教材

网盘链接:https://pan.baidu.com/s/1IO3oDVsXxrhWLkndDwGcvw?pwd=8888
提取码:8888

四、总结

对三种顺序存储结构的总结归纳横向对比
本篇文章归纳了《数据结构》严蔚敏编写的C语言第二版中一、二、三章节的顺序存储结构的线性表,如:顺序表,顺序栈,顺序队列的结构定义、初始化、元素插入、元素删除、元素取值的基本操作。
想要实现脱离教材,实现代码,少不了自己动手编写代码,首先要领会教材的算法的每一个步骤,多画图理解,观看动画演示。
今天的分享就到这里啦,喜欢的小伙伴可以点赞收藏。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐