线性表的顺序表示与实现 (C语言实现,使用Clion客户端编写)

项目结构

在这里插入图片描述

定义结构体

在SeqList.h头文件中定义结构体

/**         用数组来描述顺序表
 *          顺序表的结构体如下
 * */
typedef int DataType;
#define ListSize 100        //定义数组大小为100
typedef struct {
    DataType list[ListSize];    //用list存储数据表中的数据元素
    int length;                 //表示顺序表当前的数据元素个数
} SeqList;              //结构体名称SeqList

顺序表初始化

/** 顺序表的初始化 */
void InitList(SeqList *L) {
    L->length = 0;        //顺序表的长度置为0
}

判断顺序表是否为空

/** 判断顺序表是否为空  */
int ListEmpty(SeqList L) {
    if (L.length == 0)        //如果顺序表长度为0
        return 1;           //返回1
    else                    //否则
        return 0;           //返回0
}

查找顺序表中第i个元素

/** 按序号查找操作。查找操作分为两种:按序号查找和按内容查找。按序号查找就是查找顺序表L中的第i个元素,如果找到将该元素赋值给e  */
/** 查找顺序表中第i个元素 */
int GetElement(SeqList L, int i, DataType *e) {
    if (i < 1 || i > L.length)    //在查找第i个元素之前,判断该序号是否合法
        return -1;               //不合法返回-1
    *e = L.list[i - 1];         //合法 将第i个元素的值赋值给e
    return 1;                  //返回1
}

按内容查找操作

/** 按内容查找操作 */
int LocateElement(SeqList L, DataType e) {
    for (int i = 0; i < L.length; ++i)  //从第i个元素开始比较
    {
        if (L.list[i] == e)     //找到后将元素e赋值给list
            return i + 1;       //返回i+1
        return 0;
    }
}

以上是SeqList.h头文件中的定义

SeqList.h完整代码

//
// Created by Yuecaizheng on 2020/11/26.
//

#ifndef DEMO5_LINEARLIST_SEQLIST_H
#define DEMO5_LINEARLIST_SEQLIST_H

#endif //DEMO5_LINEARLIST_SEQLIST_H

/**         用数组来描述顺序表
 *          顺序表的结构体如下
 * */
typedef int DataType;
#define ListSize 100        //定义数组大小为100
typedef struct {
    DataType list[ListSize];    //用list存储数据表中的数据元素
    int length;                 //表示顺序表当前的数据元素个数
} SeqList;              //结构体名称SeqList

/** 顺序表的初始化 */
void InitList(SeqList *L) {
    L->length = 0;        //顺序表的长度置为0
}

/** 判断顺序表是否为空  */
int ListEmpty(SeqList L) {
    if (L.length == 0)        //如果顺序表长度为0
        return 1;           //返回1
    else                    //否则
        return 0;           //返回0
}

/** 按序号查找操作。查找操作分为两种:按序号查找和按内容查找。按序号查找就是查找顺序表L中的第i个元素,如果找到将该元素赋值给e  */
/** 查找顺序表中第i个元素 */
int GetElement(SeqList L, int i, DataType *e) {
    if (i < 1 || i > L.length)    //在查找第i个元素之前,判断该序号是否合法
        return -1;               //不合法返回-1
    *e = L.list[i - 1];         //合法 将第i个元素的值赋值给e
    return 1;                  //返回1
}

/** 按内容查找操作 */
int LocateElement(SeqList L, DataType e) {
    for (int i = 0; i < L.length; ++i)  //从第i个元素开始比较
    {
        if (L.list[i] == e)     //找到后将元素e赋值给list
            return i + 1;       //返回i+1
        return 0;
    }
}

Main.cpp部分

在顺序表的第i个位置插入元素

插入操作。插入操作就是在顺序表 L 中的第i个位置插入新的元素e,

  • 使顺序表 { A1,A2,A3,···,Ai-1,Ai,···,An }
  • 变成 { A1,A2,A3,···,Ai-1, e ,Ai,···,An }
  • 顺序表的长度也由 n变为 n+1

算法思想:要在顺序表中的第i个位置上插入元素 e,首先需将表中位置为 n,n-1,···,i上的元素一次往后移一个位置,将第i个位置空出然后将该位置插入新元素 e。当 i=n+1时,是指在顺序表的末尾插入元素,无需移动元素,直接将 e插入表的末尾即可

  • 例如,顺序表 { 3,15,49,20,23,44,18,36 } 的第 5个元素之前插入一个元素 22 需要为 36,18,44,23 依次往后移动一个位置,然后再在第 5号位置插入元素 22
  • 顺序表变成 { 3,15,49,20,22,23,44,18,36 }
/** 在顺序表的第i个位置插入元素 e*/
int InsertList(SeqList *L, int i, DataType e) {
    if (i < 1 || i > L->length + 1)         //再插入元素之前,判断插入位置是否合法
    {
        printf("插入位置i不合法\n");
        return -1;
    } else if (L->length >= ListSize)   //在插入元素前,判断元素表是否已满
    {
        printf("顺序表已经满了,不能在插入新的元素\n");
        return 0;
    } else {
        for (int j = L->length; j >= i; --j)    //将第i个位置以后的元素依次后移
        {
            L->list[j] = L->list[j - 1];    //数组中的值依次往后移动
            L->list[i - 1] = e;             //插入元素到第i个位置
            L->length = L->length + 1;      //顺序表长度增加1
            return 1;
        }
    }
}

在执行插入操作时,插入元素的位置i的合法范围是 1 ≤ i ≤ L->length+1i = 1 时,插入位置时在第一个元素之前,对应 C语言数组中的第 0个元素;当 i=L->length+1 时,最后一个元素之后,对应 C语言数组中最后一个元素之后的位置。当插入位置是 i=L->length+1
不需要移动元素;当插入位置是i=0时,则需要移动所有元素。
PS:插入时判断插入位置是否合法,还有存储空间是否已满,插入后要将表长增加 1

删除元素表的第 i个位置上的元素

删除操作:删除操作就是将顺序表 L 中第 i个位置的元素删除,

  • 使顺序表 { A1,A2,···,Ai-1,Ai,Ai+1,···,An }
  • 变成 { A1,A2,···,Ai-1,Ai+1,···,An }
  • 顺序表的长度也由 n 变成 n-1

算法思想:为了删除顺序表中的第 i个元素,需要将第 i+1个位置之后的元素一次向前移动一个位置,即先将第 i+1个元素移动到第 i个位置再将第 i+2个元素移动到第 i+1个位置,依次类推,直到最后一个元素移动到倒数第二个位置。最后将顺序表的长度 减 1

  • 例如:删除顺序表 { 3,15,49,20,22,23,44,18,36 }的第4个元素,需要将序号为 5,6,7,8,9的元素依次向前移动一个位置,这样就删除了第4个元素,最后将表长 减 1
/** 删除元素表的第 i个位置上的元素 */
int DeleteList(SeqList *L, int i, DataType *e) {
    if (L->length <= 0) {                           //判断顺序表是是否为空
        printf("顺序表已空不能进行删除\n");
        return 0;
    } else if (i < 1 || i > L->length) {        //判断删除位置是否合理
        printf("删除位置不合适\n");
        return -1;
    } else {
        *e = L->list[i - 1];        //将要删除的元素给 *e
        for (int j = i; j <= L->length - 1; ++j) {      //数组中的元素依次往前移动,直到覆盖掉需要删除指定位置的值
            L->list[j - 1] = L->list[j];            //将数组元素的值往前移动,数组下标的值相比于未删除的下标值 减1
            L->length = L->length - 1;          //数组长度减1
            return 1;
        }
    }
}

删除元素的位置 i的合法范围在 1 ≤ i ≤ L->length 。当 i=1时,表示删除第一个元素,(对应的数组下标为0的元素);
i=L->length 时,表示删除的时最后一个元素。
PS:删除元素要看表中是否还有元素,删除位置是否合法。删除后,顺序表的长度要 减 1

求顺序表的长度和清空顺序表

/** 求顺序表的长度 */
int ListLength(SeqList L) {
    return L.length;
}

/** 清空顺序表 */
void ClearList(SeqList *L) {
    L->length = 0;
}

Main部分完整代码:

#include <iostream>
#include "SeqList.h"

/**********************************************************************************************************/

/** 插入操作。插入操作就是在顺序表 L 中的第i个位置插入新的元素e,
 * 使顺序表 { A1,A2,A3,···,Ai-1,Ai,···,An }
 * 变成   { A1,A2,A3,···,Ai-1, e ,Ai,···,An }
 * 顺序表的长度也由 n变为 n+1
 * */

/**   算法思想:要在顺序表中的第i个位置上插入元素 e,首先需将表中位置为 n,n-1,···,i上的元素一次往后移一个位置,将第i个位置空出
 *    然后将该位置插入新元素 e。当 i=n+1时,是指在顺序表的末尾插入元素,无需移动元素,直接将 e插入表的末尾即可
 *
 *        例如,顺序表   { 3,15,49,20,23,44,18,36 } 的第 5个元素之前插入一个元素 22
 *    需要为 36,18,44,23 依次往后移动一个位置,然后再在第 5号位置插入元素 22
 *    顺序表变成     { 3,15,49,20,22,23,44,18,36 }
 * */

/** 在顺序表的第i个位置插入元素 e*/
int InsertList(SeqList *L, int i, DataType e) {
    if (i < 1 || i > L->length + 1)         //再插入元素之前,判断插入位置是否合法
    {
        printf("插入位置i不合法\n");
        return -1;
    } else if (L->length >= ListSize)   //在插入元素前,判断元素表是否已满
    {
        printf("顺序表已经满了,不能在插入新的元素\n");
        return 0;
    } else {
        for (int j = L->length; j >= i; --j)    //将第i个位置以后的元素依次后移
        {
            L->list[j] = L->list[j - 1];    //数组中的值依次往后移动
            L->list[i - 1] = e;             //插入元素到第i个位置
            L->length = L->length + 1;      //顺序表长度增加1
            return 1;
        }
    }
}

/** 在执行插入操作时,插入元素的位置i的合法范围是 1 ≤ i ≤ L-> length+1 当 i = 1 时,插入位置时在第一个元素之前,对应 C语言数组
 * 中的第 0个元素;当 i=L->length+1 时,最后一个元素之后,对应 C语言数组中最后一个元素之后的位置。当插入位置是 i=L->length+1 时
 * 不需要移动元素;当插入位置是i=0时,则需要移动所有元素。
 *
 *  PS:插入时判断插入位置是否合法,还有存储空间是否已满,插入后要将表长增加 1
 * */


/*********************************************************************************************/

/** 删除操作:删除操作就是将顺序表 L 中第 i个位置的元素删除,
 * 使顺序表 { A1,A2,···,Ai-1,Ai,Ai+1,···,An }
 * 变成 { A1,A2,···,Ai-1,Ai+1,···,An }
 * 顺序表的长度也由 n 变成 n-1
 * */

/** 算法思想:为了删除顺序表中的第 i个元素,需要将第 i+1个位置之后的元素一次向前移动一个位置,即先将第 i+1个元素移动到第 i个位置
 * 再将第 i+2个元素移动到第 i+1个位置,依次类推,直到最后一个元素移动到倒数第二个位置。最后将顺序表的长度 减 1
 *
 *      例如:删除顺序表 { 3,15,49,20,22,23,44,18,36 }的第4个元素,需要将序号为 5,6,7,8,9的元素依次向前移动一个位置,这样
 *      就删除了第4个元素,最后将表长 减 1
 * */

/** 删除元素表的第 i个位置上的元素 */
int DeleteList(SeqList *L, int i, DataType *e) {
    if (L->length <= 0) {                           //判断顺序表是是否为空
        printf("顺序表已空不能进行删除\n");
        return 0;
    } else if (i < 1 || i > L->length) {        //判断删除位置是否合理
        printf("删除位置不合适\n");
        return -1;
    } else {
        *e = L->list[i - 1];        //将要删除的元素给 *e
        for (int j = i; j <= L->length - 1; ++j) {      //数组中的元素依次往前移动,直到覆盖掉需要删除指定位置的值
            L->list[j - 1] = L->list[j];            //将数组元素的值往前移动,数组下标的值相比于未删除的下标值 减1
            L->length = L->length - 1;          //数组长度减1
            return 1;
        }
    }
}

/** 删除元素的位置 i的合法范围在 1 ≤ i ≤ L->length 。当 i=1时,表示删除第一个元素,(对应的数组下标为0的元素);
 * 当 i=L->length 时,表示删除的时最后一个元素。
 *
 * PS:删除元素要看表中是否还有元素,删除位置是否合法。删除后,顺序表的长度要 减 1
 * */

/** 求顺序表的长度 */
int ListLength(SeqList L) {
    return L.length;
}

/** 清空顺序表 */
void ClearList(SeqList *L) {
    L->length = 0;
}

以上就是顺序表的基本运算思想和部分代码实现

例子演示

代码程序示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值