数据结构 顺序表(静态分配内存)
文章目录
前言
数据结构要考试,写写代码复习复习一、顺序表
顺序表有两种。一种为静态分配内存,另一种为动态分配内存。本文提供了一种静态分配内存的顺序表的简单实现。参考了数据结构(严蔚敏C语言版)教材。代码仅供参考,学习,
运行环境是Visual Studio 2019
有些判断输入是否合法的说明就跳过了
二、代码部分
1.头文件
建立是cpp文件,用c文件也可以,只是需要改变一下读写数据的操作。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
using namespace std;
2.预定义
预先定义一些内容,方便后续操作
这里追求方便,定义了ElemType为int类型,读者可以自己更改为其他类型
#define MAXSIZE 10
#define OK 1 //返回OK,代表操作成功
#define ERROR 0 //返回ERROR,代表操作失败
typedef int ElemType; //之后出现的ElemType为int类型,本代码默认数据类型是int
3.定义存储结构
使用结构体定义了存储结构。使用了数组来存储数据
struct SqList
{
ElemType data[MAXSIZE]; //用数组来存取元素
int length; //定义顺序表当前长度
};
4.顺序表初始化
初始化很简单,只需要将数组的元素全部设置为0,并将表长也设置为0就可以
int InitList(SqList& L)
{
for (int i = 0; i < MAXSIZE; i++)
{
L.data[i] = 0; //数组元素初始化为0
}
L.length = 0; //顺序表长度初始化为0
cout << "已成功初始化顺序表" << endl;
return OK;
}
5.顺序表重置为空表
顺序表的重置操作和初始化类似,不做多解释
int ClearList(SqList& L)
{
for (int i = 0; i < MAXSIZE; i++)
{
L.data[i] = 0; //数组元素初始化为0
}
L.length = 0; //顺序表长度初始化为0
cout << "已成功重置顺序表" << endl;
return OK;
}
6.判断是否是空表
也很简单,只需要判断表长是否为0即可
bool ListEmpty(SqList L)
{
if (L.length == 0)
{
cout << "顺序表是空表" << endl;
return true;
}
else
{
cout << "顺序表不是空表" << endl;
return false;
}
}
7.按位查找顺序表的元素,并返回第i个元素,传入e的引用来存储
输入参数为顺序表L,需要查找的位置,一个元素e的引用,用于保存数据元素e。 返回值为是否查找到,1为找到,0为没找到。 如果不需要用到这个元素,可以重载一下这个函数。int GetElem(SqList L, int i,ElemType &e)
{
if (i<1 || i>L.length)
{
cout << "请输入正确的元素位序" << endl;
return ERROR;
}
else
{
e = L.data[i - 1];
return OK;
}
}
8.按值查找顺序表的元素,并传入i的引用存储该元素的位置,若无则返回0
输入参数为线性表L,需要查找的数据元素e,引用i用来记录该数据元素的位置 返回值为返回值为是否查找到,1为找到,0为没找到。 也可以重载函数为其他形式,方便操作。 这里按值查找本质上也是遍历了一遍这个顺序表,找到第一个等于e的元素就返回int LocateElem(SqList L, ElemType e,int &i)
{
for (int j = 0; j < L.length; j++)
{
if (L.data[j] == e)
{
i = j + 1;
return OK;
}
}
return ERROR;
}
9.顺序表插入数据元素
输入参数线性表L,插入的位置i,插入的元素e。 若在i位置插入,对应数组的下表为i-1,需要让i位置之后的元素都往后移动一个位置。表长+1int ListInsert(SqList& L, int i, ElemType e)
{
if (i<1 || i>L.length)
{
cout << "请输入正确的元素位序" << endl;
return ERROR;
}
if (L.length + 1 > MAXSIZE)
{
cout << "存储空间不足" << endl;
return ERROR;
}
for (int j = L.length; j >= i; j--)
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return OK;
}
10.顺序表删除数据元素
输入参数线性表L,删除的位置i,引用e用来记录删除的元素 若删除i位置元素,需要让i位置之后的元素都往前移动一个位置。表长-1int ListDelete(SqList& L, int i, ElemType &e)
{
if (i<1 || i>L.length)
{
cout << "请输入正确的元素位序" << endl;
return ERROR;
}
e = L.data[i - 1];
for (int j = i; j < L.length; j++)
{
L.data[j - 1] = L.data[j];
}
L.length--;
return OK;
}
11.顺序表遍历
很简单,不过多解释int TraverseList(SqList L)
{
if (L.length == 0)
{
cout << "顺序表是空表" << endl;
return ERROR;
}
else
{
cout << "该顺序表中的数据元素如下" << endl;
for (int i = 0; i < L.length; i++)
{
if (i == 0)
{
cout << L.data[i];
}
else
{
cout << " " << L.data[i];
}
}
cout << endl;
return OK;
}
}
12.创建一个顺序表
方便创建顺序表的一个函数。int CreateList(SqList &L)
{
cout << "请输入顺序表中元素的个数" << endl;
cin >> L.length;
cout << "请输入顺序表中的数据元素,以空格分隔" << endl;
for (int i = 0; i < L.length; i++)
{
cin >> L.data[i];
}
return OK;
}
13.主函数
主函数就可以看读者需求来测试了int main()
{
SqList L;
return 0;
}
总结
数据结构还是得多写代码。