c++ 实现
#include <iostream>
#include <algorithm>
#define Initsize 10
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;
// 初始化
void InitList(SeqList &L)
{
L.data = (int *)malloc(Initsize * sizeof(int));
L.length = 0;
L.MaxSize = Initsize;
}
// 动态增加数组的长度
void IncreaseSize(SeqList &L, int len)
{
int *p = L.data; // 将原数组保存到一个其他的数组上
L.data = (int *)malloc((L.MaxSize + len) * sizeof(int));
for (int i = 0; i < L.length; i++)
L.data[i] = p[i]; // 将原先的值存进新增的数组
L.MaxSize = L.MaxSize + len;
delete p;
}
// 插入操作
bool ListInsert(SeqList &L, int i, int e) // 在第位序为i(下标为i- 1)的位置上插入e
{
if (i < 1 || i >L.MaxSize) return false; // 增强健壮性
if (L.length > L.MaxSize + 1) return false;
for (int j = L.length; j >= i; j--) // 将位序为i及其后面的数字往后移动
L.data[j] = L.data[j - 1]; // 后面的值等于前面的值
L.data[i - 1] = e;
L.length ++; // 多插入了一个值 长度++
return true;
}
// 删除操作
bool ListDelete(SeqList &L, int i, int &e) // 在第位序为i(下标为i- 1)的删除元素
{
if (i < 1 || i > L.MaxSize) return false;
e = L.data[i - 1]; //删除的元素先保存下来
for (int j = i; i < L.length; i++)
L.data[j] = L.data[j - 1];
L.length --;
return true;
}
// 按位查找 (假设存入的元素值没有-1)
int GetElem(SeqList &L, int i)
{
if (i < 1 || i > L.MaxSize) return -1;
return L.data[i - 1]; // 返回位序位i的元素的值
}
// 按值查找(返回下标 返回位序号的时候 下标+1)
int LocateElem(SeqList &L, int e)
{
for (int i = 0; i < L.MaxSize; i++)
if (L.data[i] == e)
return i; // 查找成功返回下标
return -1; // 查找失败返回-1
}
int main()
{
SeqList L;
// 初始化
InitList(L);
printf("初始化后线性表的最大长度为:%d\n", L.MaxSize);
// 动态增加数组长度演示
IncreaseSize(L, 5);
printf("动态增加后线性表的最大长度为:%d\n", L.MaxSize);
// 插入演示
if (ListInsert(L, 3, 10)) printf("成功在第位序为%d的位置上插入了一个值为%d\n", 3, L.data[2]);
else printf("插入失败\n");
// 删除演示
int d = -1;
if (ListDelete(L, 3, d)) printf("成功在第位序为%d的位置上删除了一个值为%d\n", 3, d);
else printf("删除失败\n");
// 按位查找演示
if (ListInsert(L, 10, 100)) printf("成功在第位序为%d的位置上插入了一个值为%d\n", 10, L.data[2]);
else printf("插入失败\n");
if (GetElem(L, 10) != -1) printf("查找到位序为%d的元素的值为%d\n", 10, GetElem(L, 10));
else printf("查找失败");
// 按值查找演示
if (ListInsert(L, 5, 1000)) printf("成功在第位序为%d的位置上插入了一个值为%d\n", 5, L.data[5]);
else printf("插入失败\n");
if (LocateElem(L, 1000) != -1) printf("查找到值为%d的元素的下标为%d\n", 1000, LocateElem(L, 1000));
else printf("查找失败");
return 0;
}
C实现
#include <stdio.h>
#include <stdlib.h>
#define Initsize 10
typedef struct{
int *data; // 指示动态分配数组的指针
int MaxSize; // 顺序表的最大容量
int length; // 顺序表的当前长度
}SeqList;
// 初始化顺序表
void InitList(SeqList *L)
{
// 申请一片连续空间
L->data = (int *)malloc(Initsize * sizeof(int));
L->length = 0;
L->MaxSize = Initsize;
}
// 动态增加顺序表的长度
void IncreaseSize(SeqList *L, int len)
{
int *p = L->data;
L->data = (int *)malloc((L->MaxSize + len) * sizeof(int));
for (int i = 0; i < L->length; i++)
{
L->data[i] = p[i];
}
L->MaxSize = L->MaxSize + len;
free(p);
}
// 插入操作
int ListInsert(SeqList *L, int i, int e)
{
if (i < 1 || i > L->MaxSize+1) return 0;
if (L->length >= L->MaxSize) return 0;
for (int j = L->length; j >= i; j--) // 将第i个元素及其后面的元素往后移动
L->data[j] = L->data[j - 1];
L->data[i - 1] = e;
L->length++;
return 1;
}
// 删除操作
int ListDelet(SeqList *L, int i, int *e)
{
if (i < 1 || i > L->MaxSize) return 0;
*e = L->data[i];
for (int j = i; j < L->length; j++) // 将第i个元素及其后的元素向前移动
L->data[j - 1] = L->data[j];
L->length--;
return 1;
}
// 按位查找
int GetElem(SeqList *L, int i)
{
return L->data[i - 1]; // 返回表中第i个位置的元素
}
// 按值查找
int LocateElem(SeqList *L, int e)
{
for (int i = 0; i < L->MaxSize; i++)
if (L->data[i] == e)
return i; // 查找成功返回下标
return -1; // 查找失败返回-1
}
int main()
{
SeqList L; // 声明一个顺序表
InitList(&L); // 初始化顺序表
printf("%d\n", L.MaxSize);
// 向表中插入5个元素
IncreaseSize(&L, 5);
printf("%d\n", L.MaxSize);
// 在位序为3(下标为2)的位置处 插入一个数为10
int s = ListInsert(&L, 3, 3);
if (s) printf("%d\n", L.data[2]); // 查看插入的数据
else
{
printf("插入失败\n");
}
// 删除元素
int *e = -1;
if (ListDelet(&L, 2, &e))
printf("已经删除第3个元素,删除元素值为=%d\n", e);
else
printf("位序i不合法, 删除失败\n");
// 按位查找
int a = ListInsert(&L, 10, 10);
printf("第%d个位置的元素为%d\n",10, GetElem(&L, 10));
// 按值查找
int b = ListInsert(&L, 11, 20);
printf("值为%d的元素下标为%d\n", 20, LocateElem(&L, 20));
return 0;
}