数据结构 | 顺序线性表

一、数据结构定义

typedef int SqlTableType;

typedef struct seqTable{
    int MAXNUM;     // 最大元素个数   
    int curNum;     // 元素的个数
    SqlTableType* element;  // 连续空间的起始地址  
}*SqlTable;

二、方法概览

SqlTable CreateSqlTable(int max);   // 创建空顺序表
int IsSqlListFull(SqlTable L);      // 判断顺序线性表是否已满
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x);     // 在下标p插入元素x
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x);   // 在下标p的前面插入元素x
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x);  // 在下标p的后面插入元素x
int FindElement(SqlTable L, SqlTableType x);        // 查找元素x首次出现的位置
SqlTableType FindPostion(SqlTable L, int pos);      // 查找位置pos处的元素
int DeletePostion(SqlTable L, int pos);             // 删除下标pos处的元素
int DeleteElement(SqlTable L, SqlTableType x);      // 删除x值相同的数据元素
int DestroySqlTable(SqlTable L);                    // 销毁线性表
void PrintSqlTable(SqlTable L);     // 打印线性表

三、方法详解

// 创建空顺序表,能存放的最大元素个数为max
SqlTable CreateSqlTable(int max){
    SqlTable L = (SqlTable)malloc(sizeof(struct seqTable));
    if (L != NULL) {
        L->element = (SqlTableType*)malloc(sizeof(SqlTableType) * max);
        if (L->element) {
            L->MAXNUM = max;
            L->curNum = 0;
            return L;
        }
        else free(L);
    }
    return NULL;
}

// 判断顺序线性表是否已满
// 若已满,返回值为1,否则返回值为0
int IsSqlListFull(SqlTable L){
    return (L->curNum == L->MAXNUM);
}

// 在下标p插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0) {
        printf("插入位置非法");
        return 0;
    }
    L->element[p] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的前面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p <= 0 || p > L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p - 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p - 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的后面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x) {
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0 || p >= L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p + 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p + 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 打印线性表
void PrintSqlTable(SqlTable L) {
    for (int i = 0; i < L->curNum; i++)
        printf("%d ", L->element[i]);
    printf("\n");
}

// 查找元素x首次出现的位置
// 若待销毁的线性表不存在,则返回0
int FindElement(SqlTable L, SqlTableType x){
    for (int i = 0; i < L->curNum; i++) {
        if (L->element[i] == x) return i;
    }
    return -1;
}

// 查找位置pos处的元素
// 若不存在给定值,则返回-1
SqlTableType FindPostion(SqlTable L, int pos){
    if (pos<0 || pos>L->curNum) return L->element[0];
    else return L->element[pos];
}

// 删除下标pos处的元素
// 若pos非法,则返回-1;否则返回1
int DeletePostion(SqlTable L, int pos) {
    if (pos<0 || pos > L->curNum - 1) return -1;
    for (int i = pos; i < L->curNum - 1; i++)
        L->element[i] = L->element[i + 1];
    L->curNum = L->curNum - 1;
    return 1;
}

// 删除x值相同的数据元素
// 返回删除数据元素的个数
int DeleteElement(SqlTable L, SqlTableType x){
    int num = 0;
    for (int i = 0; i < L->curNum; i++){
        if (L->element[i] == x){
            DeletePostion(L, i);
            num++;
        }
    }
    return num;
}

// 销毁线性表
// 返回销毁线性表元素的个数
int DestroySqlTable(SqlTable L) {
    int num = L->curNum;
    free(L->element);
    free(L);
    return num;
}

四、运行结果

        main方法代码如下:

int main() {
    int max = 10;
    SqlTable table = CreateSqlTable(max);
    for (int i = 0; i < max; i++) {
        InsertSqlTable_P(table, i, i + 1);
    }
    PrintSqlTable(table);

    DeleteElement(table, 3);
    PrintSqlTable(table);

    DeletePostion(table, 3);
    PrintSqlTable(table);

    DestroySqlTable(table);
}

       运行结果如下:

  五、源代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef int SqlTableType;

typedef struct seqTable{
    int MAXNUM;     // 最大元素个数   
    int curNum;     // 元素的个数
    SqlTableType* element;  // 连续空间的起始地址  
}*SqlTable;

SqlTable CreateSqlTable(int max);   // 创建空顺序表
int IsSqlListFull(SqlTable L);      // 判断顺序线性表是否已满
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x);     // 在下标p插入元素x
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x);   // 在下标p的前面插入元素x
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x);  // 在下标p的后面插入元素x
int FindElement(SqlTable L, SqlTableType x);        // 查找元素x首次出现的位置
SqlTableType FindPostion(SqlTable L, int pos);      // 查找位置pos处的元素
int DeletePostion(SqlTable L, int pos);             // 删除下标pos处的元素
int DeleteElement(SqlTable L, SqlTableType x);      // 删除x值相同的数据元素
int DestroySqlTable(SqlTable L);                    // 销毁线性表
void PrintSqlTable(SqlTable L);     // 打印线性表


// 创建空顺序表,能存放的最大元素个数为max
SqlTable CreateSqlTable(int max){
    SqlTable L = (SqlTable)malloc(sizeof(struct seqTable));
    if (L != NULL) {
        L->element = (SqlTableType*)malloc(sizeof(SqlTableType) * max);
        if (L->element) {
            L->MAXNUM = max;
            L->curNum = 0;
            return L;
        }
        else free(L);
    }
    return NULL;
}

// 判断顺序线性表是否已满
// 若已满,返回值为1,否则返回值为0
int IsSqlListFull(SqlTable L){
    return (L->curNum == L->MAXNUM);
}

// 在下标p插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0) {
        printf("插入位置非法");
        return 0;
    }
    L->element[p] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的前面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p <= 0 || p > L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p - 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p - 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的后面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x) {
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0 || p >= L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p + 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p + 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 打印线性表
void PrintSqlTable(SqlTable L) {
    for (int i = 0; i < L->curNum; i++)
        printf("%d ", L->element[i]);
    printf("\n");
}

// 查找元素x首次出现的位置
// 若待销毁的线性表不存在,则返回0
int FindElement(SqlTable L, SqlTableType x){
    for (int i = 0; i < L->curNum; i++) {
        if (L->element[i] == x) return i;
    }
    return -1;
}

// 查找位置pos处的元素
// 若不存在给定值,则返回-1
SqlTableType FindPostion(SqlTable L, int pos){
    if (pos<0 || pos>L->curNum) return L->element[0];
    else return L->element[pos];
}

// 删除下标pos处的元素
// 若pos非法,则返回-1;否则返回1
int DeletePostion(SqlTable L, int pos) {
    if (pos<0 || pos > L->curNum - 1) return -1;
    for (int i = pos; i < L->curNum - 1; i++)
        L->element[i] = L->element[i + 1];
    L->curNum = L->curNum - 1;
    return 1;
}

// 删除x值相同的数据元素
// 返回删除数据元素的个数
int DeleteElement(SqlTable L, SqlTableType x){
    int num = 0;
    for (int i = 0; i < L->curNum; i++){
        if (L->element[i] == x){
            DeletePostion(L, i);
            num++;
        }
    }
    return num;
}

// 销毁线性表
// 返回销毁线性表元素的个数
int DestroySqlTable(SqlTable L) {
    int num = L->curNum;
    free(L->element);
    free(L);
    return num;
}


int main() {
    int max = 10;
    SqlTable table = CreateSqlTable(max);
    for (int i = 0; i < max; i++) {
        InsertSqlTable_P(table, i, i + 1);
    }
    PrintSqlTable(table);

    DeleteElement(table, 3);
    PrintSqlTable(table);

    DeletePostion(table, 3);
    PrintSqlTable(table);

    DestroySqlTable(table);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值