顺序表的12个基本操作及其检验
2016-10-21 01:58
1301 查看
顺序表是指线性表的顺序表示,指的是用一组地址连续的存储单元依次存储线性表的数据元素。只要确定了顺序表的起始位置,顺序表的任一数据元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构。在这点上与高级程序设计语言中的数组十分相似,因此通常用数组来描述数据结构中的顺序存储结构。接下来是顺序表的12个基本操作和这12个操作在主函数中的检验。 声明:本程序是在VS2015中实现的,在其他编译器中如果有些许差错还请自行手动更改。
一. 头文件和宏定义
//--保存为constant.h-- #include<iostream> #include<stdlib.h> #include<string.h> #include<malloc.h> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType;
二.接下来是12个基本操作
//—顺序表的动态分配存储结构—
//保存成header.h
#include"constant.h" #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { ElemType *elem; int length; int listsize; }SqList;
//1.构造顺序表 Status InitList(SqList &L) { L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (!L.elem) return ERROR; L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; }
//2.销毁顺序表 Status DestroyList(SqList &L) { if (L.elem) free(L.elem); if (L.elem == NULL) return OK; else return ERROR; }
//3.清空顺序表 void ClearList(SqList &L) { L.length = 0; }
//4.判断顺序表是否空表 Status ListEmpty(SqList L) { if (L.length == 0) return ERROR; else return OK; }
//5.顺序表求表长 Status ListLength(SqList L) { return L.length; }
//6.顺序表的取元素 Status GetElem(SqList L) { int i, e; //取出顺序表中第i个元素e cout << "请输入要取的元素的位序:" << endl; cin >> i; if (i<1 || i>L.length) return ERROR; else e = L.elem[i - 1]; cout << "要取出的第" << i << "个元素是" << e << endl; return OK; }
//辅助函数 Status compare(int e1, int e2) { if (e1 == e2) return OK; else return ERROR; } //7.顺序表的定位 Status LocateElem(SqList L) { int e, i = 1; cout << "请输入要定位的元素e" << endl; cin >> e; while (i <= L.length&&L.elem[i - 1] != e) { i++; } if (i > L.length) return ERROR; else cout << "要定位的元素的位序为" << i << endl; return i; }
//8.返回前驱 Status PriorElem(SqList L) { int cur_e, pre_e, i = 1; int *p; p = L.elem + 1;//将第二个元素的地址赋值给p cout << "请输入顺序表中第二到表尾的任何一个数:" << endl; cin >> cur_e; while(i < L.length && compare(cur_e, L.elem[i - 1])) { p++; i++; } if (i > L.length) return ERROR; else { pre_e = L.elem[i]; //注意i cout << "它的前驱元素是" << pre_e << 4000 endl; return pre_e;//将此元素返回给要调用的函数 } }
//9.返回后继 Status NextElem(SqList L) { int cur_e, next_e, i = 0;//i的初值是第一个元素的位序 cout << "请输入第一到倒数第二个任意一个元素:" << endl; cin >> cur_e; int *p = L.elem;//第一个元素的地址赋值给p while (i < L.length && !compare(cur_e, L.elem[i])) { p++; i++; } if (i == L.length) { return ERROR; } else { next_e = *(++p); cout << "它的后继元素是" << next_e << endl; return next_e;//将此元素返回给主函数 } }
//10.插入元素 Status ListInsert(SqList &L) { ElemType *p, *q, *newbase; int i, e;//在位置i插入元素e cout << "请输入要插入的元素的位置i:" << endl; cin >> i; cout << "请输入要插入的元素的数值e:" << endl; cin >> e; if (i<1 || i>L.length) return ERROR; if(L.length>=L.listsize) { if (!(newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)))) exit(0);//分配存储空间失败 L.elem = newbase;//新基址 L.listsize += LISTINCREMENT;//增加存储容量 } q = L.elem + i - 1;//q为插入位置 for (p = L.elem + L.length - 1; p >= q; --p) { *(p + 1) = *p;//给插入位置之后的元素赋值达到之后元素后移一位的效果 } *q = e;//插入e ++L.length; return OK; }
//11.删除元素 Status ListDelete(SqList &L) { int i,e; cout << "请输入要删除的元素的位置i:" << endl; cin >> i; if (i<1 || i>L.length)//i值不合法 return ERROR; ElemType *p, *q; p = L.elem + i - 1;//p为被删除元素的位置 e = *p; //被删除元素的值赋给e cout << "被删除的元素是" << e << endl; q = L.elem + L.length - 1;//q是表尾元素的位置 p = p + 1; for ( ; p <= q; p++) *(p - 1) = *p; L.length--; //表长减一 return OK; }
//12.遍历 Status ListTraverse(SqList L) { ElemType *p = L.elem; int i; for (i = 1; i <= L.length; i++) cout<<*p++<<" "; cout << endl; return OK; }
三.主函数中检验
#include "stdafx.h" #include "header.h" int main() { int m,n; SqList L; InitList(L); cout << "……顺序表初始化……" << endl; cout << "请输入顺序表的长度n:"<<endl; cin >> n; for (m = 1; m <= n; m++) { cout << "请输入第"<<m<<"个元素的值:"<<endl; cin >> L.elem[m - 1]; L.length++; } cout << "顺序表的长度为" << L.length << endl; cout << "顺序表中的元素为:"<<endl; ListTraverse(L); cout << "…………判断顺序表是否空表…………" << endl; if (ListEmpty(L) == 1) cout << "顺序表非空" << endl; else cout << "顺序表为空" << endl; cout << "…………顺序表中取元素操作…………" << endl; GetElem(L); cout << "…………顺序表中元素的定位…………" << endl; LocateElem(L); cout << "…………顺序表中元素的前驱…………" << endl; PriorElem(L); cout << "…………顺序表中元素的后继…………" << endl; NextElem(L); cout << "…………顺序表元素插入测试…………" << endl; ListInsert(L); cout << "此时顺序表中的元素为:"<<endl; ListTraverse(L); cout << "…………顺序表元素删除测试…………" << endl; ListDelete(L); cout << "此时顺序表中的元素为:" << endl; ListTraverse(L); cout << "恭喜您成功完成顺序表的所有功能!!!!" << endl; return 0; }
相关文章推荐
- 队列的顺序存储及其基本操作
- 顺序表及其基本操作
- 队列的顺序存储及其基本操作
- 实验三 顺序栈的基本操作实现及其应用
- 顺序栈和链式栈的结构及其基本操作(置空,获取栈顶元素,入栈,出栈)
- 编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 线性表的顺序表示及其基本操作
- 栈的顺序存储及其基本操作
- SqListFunc顺序链表的12个基本操作的C语言代码(数据结构)
- 顺序表的基本操作实现及其应用(实验1)
- 实验三:栈和队列的基本操作实现及其应用——顺序栈
- 数据结构——顺序表及其基本操作
- 线性表的基本操作实现及其应用之顺序表的建立与操作实现
- 顺序表----12个基本操作实现
- 栈定义及其基本操作,顺序栈和链栈
- 栈的顺序存储及其基本操作
- 实验3:栈和队列的基本操作实现及其应用——顺序队列和链队列
- bo2-1.cpp 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个)
- 链表,顺序表的基本操作及其实现的栈与队列