一、数据结构定义
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);
}