数据结构 顺序表(静态分配内存)

数据结构 顺序表(静态分配内存)


前言

数据结构要考试,写写代码复习复习

一、顺序表

顺序表有两种。一种为静态分配内存,另一种为动态分配内存。本文提供了一种静态分配内存的顺序表的简单实现。参考了数据结构(严蔚敏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位置之后的元素都往后移动一个位置。表长+1
int 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位置之后的元素都往前移动一个位置。表长-1
int 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;
}

总结

数据结构还是得多写代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值