C++基础语法梳理:数据结构丨顺序结构

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基础语法梳理:数据结构丨顺序结构相关的知识,希望对你有一定的参考价值。

顺序栈(Sequence Stack)

SqStack.cpp:

/**
* @author huihut
* @E-mail:huihut@outlook.com
* @version 创建时间:2016年9月9日
* 说明:本程序实现了一个顺序栈。
* 功能:有初始化、销毁、判断空、清空、入栈、出栈、取元素的操作。
*/

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

//5个常量定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1

//测试程序长度定义
#define LONGTH 5

//类型定义
typedef int Status;
typedef int ElemType;

//顺序栈的类型
typedef struct {
	ElemType *elem;
	int top;
	int size;
	int increment;
} SqSrack;

//初始化顺序栈
Status InitStack_Sq(SqSrack &S, int size, int inc) {
	S.elem = (ElemType *)malloc(size * sizeof(ElemType));
	if (NULL == S.elem) return OVERFLOW;
	S.top = 0;
	S.size = size;
	S.increment = inc;
	return OK;
}

//销毁顺序栈
Status DestroyStack_Sq(SqSrack &S) {
	free(S.elem);
	S.elem = NULL;
	return OK;
}

//判断S是否空,若空则返回TRUE,否则返回FALSE
Status StackEmpty_Sq(SqSrack S) {
	if (0 == S.top) return TRUE;
	return FALSE;
}

//清空栈S
void ClearStack_Sq(SqSrack &S) {
	if (0 == S.top) return;
	S.size = 0;
	S.top = 0;
}

//元素e压入栈S
Status Push_Sq(SqSrack &S, ElemType e) {
	ElemType *newbase;
	if (S.top >= S.size) {
		newbase = (ElemType *)realloc(S.elem, (S.size + S.increment) * sizeof(ElemType));
		if (NULL == newbase) return OVERFLOW;
		S.elem = newbase;
		S.size += S.increment;
	}
	S.elem[S.top++] = e;
	return OK;
}

//取栈S的栈顶元素,并用e返回
Status GetTop_Sq(SqSrack S, ElemType &e) {
	if (0 == S.top) return ERROR;
	e = S.elem[S.top - 1];
	return e;
}

//栈S的栈顶元素出栈,并用e返回
Status Pop_Sq(SqSrack &S, ElemType &e) {
	if (0 == S.top) return ERROR;
	e = S.elem[S.top - 1];
	S.top--;
	return e;
}

int main() {
	//定义栈S
	SqSrack S;

	//定义测量值
	int size, increment, i;

	//初始化测试值
	size = LONGTH;
	increment = LONGTH;
	ElemType e, eArray[LONGTH] = { 1, 2, 3, 4, 5 };

	//显示测试值
	printf("---【顺序栈】---\\n");
	printf("栈S的size为:%d\\n栈S的increment为:%d\\n", size, increment);
	printf("待测试元素为:\\n");
	for (i = 0; i < LONGTH; i++) {
		printf("%d\\t", eArray[i]);
	}
	printf("\\n");

	//初始化顺序栈
	if (!InitStack_Sq(S, size, increment)) {
		printf("初始化顺序栈失败\\n");
		exit(0);
	}
	printf("已初始化顺序栈\\n");

	//入栈
	for (i = 0; i < S.size; i++) {
		if (!Push_Sq(S, eArray[i])) {
			printf("%d入栈失败\\n", eArray[i]);
			exit(0);
		}
	}
	printf("已入栈\\n");

	//判断非空
	if (StackEmpty_Sq(S)) printf("S栈为空\\n");
	else printf("S栈非空\\n");

	//取栈S的栈顶元素    
	printf("栈S的栈顶元素为:\\n");
	printf("%d\\n", GetTop_Sq(S, e));

	//栈S元素出栈
	printf("栈S元素出栈为:\\n");
	for (i = 0, e = 0; i < S.size; i++) {
		printf("%d\\t", Pop_Sq(S, e));
	}
	printf("\\n");

	//清空栈S
	ClearStack_Sq(S);
	printf("已清空栈S\\n");

	getchar();
	return 0;
}

顺序栈数据结构和图片

typedef struct {
	ElemType *elem;
	int top;
	int size;
	int increment;
} SqStack;

队列(Sequence Queue)

队列数据结构

typedef struct {
	ElemType * elem;
	int front;
	int rear;
	int maxSize;
}SqQueue;

非循环队列

非循环队列图片

SqQueue.rear++

循环队列

循环队列图片

SqQueue.rear = (SqQueue.rear + 1) % SqQueue.maxSize

顺序表(Sequence List)

SqList.cpp

/**
* @author huihut
* @E-mail:huihut@outlook.com
* @version 创建时间:2016年9月9日
* 说明:本程序实现了一个顺序表。
*/

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

//5个常量定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1

//测试程序长度定义
#define LONGTH 5

//类型定义
typedef int Status;
typedef int ElemType;

//顺序栈的类型
typedef struct {
	ElemType *elem;
	int length;
	int size;
	int increment;
} SqList;

//初始化顺序表L
Status InitList_Sq(SqList &L, int size, int inc) {
	L.elem = (ElemType *)malloc(size * sizeof(ElemType));
	if (NULL == L.elem) return OVERFLOW;
	L.length = 0;
	L.size = size;
	L.increment = inc;
	return OK;
}

//销毁顺序表L
Status DestroyList_Sq(SqList &L) {
	free(L.elem);
	L.elem = NULL;
	return OK;
}

//将顺序表L清空
Status ClearList_Sq(SqList &L) {
	if (0 != L.length) L.length = 0;
	return OK;
}

//若顺序表L为空表,则返回TRUE,否则FALSE
Status ListEmpty_Sq(SqList L) {
	if (0 == L.length) return TRUE;
	return FALSE;
}

//返回顺序表L中元素个数
int ListLength_Sq(SqList L) {
	return L.length;
}

// 用e返回顺序表L中第i个元素的值
Status GetElem_Sq(SqList L, int i, ElemType &e) {
	e = L.elem[--i];
	return OK;
}


// 在顺序表L顺序查找元素e,成功时返回该元素在表中第一次出现的位置,否则返回 - 1
int Search_Sq(SqList L, ElemType e) {
	int i = 0;
	while (i < L.length && L.elem[i] != e) i++;
	if (i < L.length) return i;
	else return -1;
}

//遍历调用
Status visit(ElemType e) {
	printf("%d\\t", e);
	return OK;
}

//遍历顺序表L,依次对每个元素调用函数visit()
Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType e)) {
	if (0 == L.length) return ERROR;
	for (int i = 0; i < L.length; i++) {
		visit(L.elem[i]);
	}
	return OK;
}

//将顺序表L中第i个元素赋值为e
Status PutElem_Sq(SqList &L, int i, ElemType e) {
	if (i > L.length) return ERROR;
	e = L.elem[--i];
	return OK;

}

//在顺序表L表尾添加元素e
Status Append_Sq(SqList &L, ElemType e) {
	if (L.length >= L.size) return ERROR;
	L.elem[L.length] = e;
	L.length++;
	return OK;
}

//删除顺序表L的表尾元素,并用参数e返回其值
Status DeleteLast_Sq(SqList &L, ElemType &e) {
	if (0 == L.length) return ERROR;
	e = L.elem[L.length - 1];
	L.length--;
	return OK;
}

int main() {
	//定义表L
	SqList L;

	//定义测量值
	int size, increment, i;

	//初始化测试值
	size = LONGTH;
	increment = LONGTH;
	ElemType e, eArray[LONGTH] = { 1, 2, 3, 4, 5 };

	//显示测试值
	printf("---【顺序栈】---\\n");
	printf("表L的size为:%d\\n表L的increment为:%d\\n", size, increment);
	printf("待测试元素为:\\n");
	for (i = 0; i < LONGTH; i++) {
		printf("%d\\t", eArray[i]);
	}
	printf("\\n");

	//初始化顺序表
	if (!InitList_Sq(L, size, increment)) {
		printf("初始化顺序表失败\\n");
		exit(0);
	}
	printf("已初始化顺序表\\n");

	//判空
	if (TRUE == ListEmpty_Sq(L)) printf("此表为空表\\n");
	else printf("此表不是空表\\n");

	//入表
	printf("将待测元素入表:\\n");
	for (i = 0; i < LONGTH; i++) {
		if (ERROR == Append_Sq(L, eArray[i])) printf("入表失败\\n");;
	}
	printf("入表成功\\n");

	//遍历顺序表L
	printf("此时表内元素为:\\n");
	ListTraverse_Sq(L, visit);

	//出表
	printf("\\n将表尾元素入表到e:\\n");
	if (ERROR == DeleteLast_Sq(L, e)) printf("出表失败\\n");
	printf("出表成功\\n出表元素为%d\\n", e);

	//遍历顺序表L
	printf("此时表内元素为:\\n");
	ListTraverse_Sq(L, visit);

	//销毁顺序表
	printf("\\n销毁顺序表\\n");
	if (OK == DestroyList_Sq(L)) printf("销毁成功\\n");
	else printf("销毁失败\\n");

	getchar();
	return 0;
}

顺序表数据结构和图片

typedef struct {
	ElemType *elem;
	int length;
	int size;
	int increment;
} SqList;

今天的分享就到这里了,大家要好好学C++哟~

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:904329806点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

 

 

以上是关于C++基础语法梳理:数据结构丨顺序结构的主要内容,如果未能解决你的问题,请参考以下文章

C++基础语法梳理:数据结构丨递归

C++基础语法梳理:数据结构丨哈希表

C++基础语法梳理:数据结构丨树(二叉树和红黑树)

C++基础语法梳理:数据库丨索引使用和优化

C++基础语法梳理:算法丨查找算法(全)

C++基础语法梳理:计算机网络丨物理层 & 数据链路层