您的位置:首页 > 理论基础 > 数据结构算法

顺序表的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;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息