顺序表的定义和实现-王道书复现
#include<stdio.h>
#define Maxsize 50//顺序表最大长度
//typedef是将类型进行别名
typedef int ElemType;//将int进行别名为ElementType便于修改
//定义一个结构体并利用typedef函数将结构体别名为Sqlist;
//静态分配
typedef struct {
ElemType data[Maxsize];//顺序表的元素
int length;//当前顺序表的长度
}Sqlist;//类型定义
//动态分配
#define InitSize 100
typedef struct {
ElemType* data; //指示动态分配数组的指针
int maxsize; //最大长度
int length; //当前长度
}SqList;
//运用动态分配大小超出最大范围会自动更换存储区域(如果当前连续空间不够)
//输出顺序表
void Listshow(Sqlist L) {//只需传入顺序表,不需要传入引用
for (int i = 0; i < L.length; i++)//依次后移输出
{
printf("%3d ", L.data[i]);//格式输出
}
printf("\n");//换行保证格式
}
//插入操作
bool ListInsert(Sqlist& L, int i, ElemType e) { //传入顺序表,由于会更改需要传入引用,插入位置,插入元素
if (i<0 || i>L.length+1) {//判断插入位置是否合法
return false;
}
if (L.length >= Maxsize) {//判断存储空间是否已满
return false;
}for (int j = L.length; j >= i; j--)//将第i个元素及之后的元素后移
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;//在位置i放入e
L.length++;//线性表长度+1
return true;
}
//删除操作
bool ListDelete(Sqlist& L, int i, ElemType& e) {//因为删除元素要传出,所以采用引用
if (i<1 || i>L.length) {
return false; //判断插入位置是否合法
}
e = L.data[i - 1]; //复制删除数据
for (int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];//元素依次前移
}
L.length--;
return true;
}
//按值查找
int LocateElem(Sqlist L, ElemType e) {
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == e) {//判断是否为所查元素
return i + 1;//返回下标+1为序号
}
}
return 0;//查找失败
}
int main() {
Sqlist L;
L.data[0] = 0;
L.data[1] = 1;
L.data[2] = 2;
L.data[3] = 3;
L.data[4] = 4;
L.data[5] = 5;
L.length = 6;
Listshow(L);
if (ListInsert(L, 3, 100)) {
Listshow(L);
}
else {
printf("插入失败");
}
ElemType b;
int c = LocateElem(L, 100);
printf("%d\n", c);
if (ListDelete(L, 3, b)) {
printf("%d\n", b);
Listshow(L);
}
else {
printf("删除失败");
}
}