数据结构 | 顺序线性表

news/2024/11/9 2:45:19/

一、数据结构定义

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);
}

http://www.ppmy.cn/news/657634.html

相关文章

顺爷传 1-12

写在前面&#xff1a; 本博客是秋博早些年根据兴趣瞎写的小说&#xff0c;小说里面有名字的角色全是以我认识的人为原型&#xff0c;在某些方面是与现实契合的。属于非技术类博客&#xff0c;请勿沉迷&#xff01; 第一章 来到异世界 自从大魔头贤子叶被打败之后&#xff0c;…

老子道德经原文加讲解

第四十一章 大器晚成 上士闻之&#xff0c;勤而行之&#xff1b;中士闻道&#xff0c;若存若忘&#xff1b;下士闻道&#xff0c;大笑之——不笑不足以为道。故建言有之&#xff1a;“明道若昧&#xff0c;进道若退&#xff0c;夷道若颣&#xff0c;上德若谷&#xff0c;大白…

侍魂

侍魂传全文阅读 作者&#xff1a;泽安 天草之复活卷 契子 第一章 出场 第二章 突变 第三章 暗流 第四章 比武 第五章 高潮 &#xff08;修&#xff09; 第六章 爱情 第七章 快刀 第八章 正重 第九章 真相 第十章 王重 第十一章 四郎 第十二章 岛原 第十三章 前奏…

走不出的城

走不出的城    真正的爱情&#xff0c;是能筑造一座滴水不露的婚城的。    然而&#xff0c;世间没有绝对的事情&#xff0c;普天之下&#xff0c;爱情还是人类永恒的主题。爱情发展到一定的程度&#xff0c;内心便产生了终生终世相伴的渴求&#xff0c;于是&#xff0…

莫 言------------- 我们的荆轲

莫 言&#xff1a;我们的荆轲&#xff08;剧本&#xff09;&#xff08;一&#xff09; 钟山文学双月刊&#xff0f;2004年第2期&#xff0f;总第149期 编辑推荐&#xff1a; "荆轲刺秦"是个流传了上千年的古老故事&#xff0c;当代人却不断地赋予它新意&#xff0c;…

话剧《我们的荆轲》

莫 言&#xff1a;我们的荆轲&#xff08;剧本&#xff09;&#xff08;一&#xff09; 钟山文学双月刊&#xff0f;2004年第2期&#xff0f;总第149期 编辑推荐&#xff1a; "荆轲刺秦"是个流传了上千年的古老故事&#xff0c;当代人却不断地赋予它新意&#xf…

vCenter崩了之后重新搭建处理办法

一、需要重新搭的情况下&#xff0c;vCenter虚拟机是无法使用分布式端口组的&#xff0c;而此时所有的物理网卡都在分布式交换机上&#xff0c;这样vCenter虚拟机的网络是无法访问的&#xff0c;所以需要先找到需要一台esxi。 二、此时可以看到两个分布式交换机 正常情况下分布…

年底无心工作?给个摸鱼好去处。中国超级英雄【一方净土】,进来看看嘛

一方净土 第一章第二章第三章 注&#xff1a;本文为鄙程序员业余所著&#xff0c;文笔 不咋地 &#xff0c;但故事还是挺有趣的。可以给些意见&#xff0c;但不要喷哈。 第一章 鸿蒙宇宙、茫茫乾坤、千亿星辰展现无尽星空&#xff0c;我们不过是浩瀚宇宙中的微尘。宇宙中充满了…