// 准备头文件
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10 // 动态顺序表的初始默认长度
// 定义C语言的bool变量
#define bool char
#define true 1
#define false 0
/* 定义数据元素的数据类型 */
typedef int ElemType; // 方便更改
// 动态顺序表的结构体定义
typedef struct Sqlist_d
{
ElemType *data;
int length;
int maxsize;
}Sqlist_d;
// 生成顺序表
Sqlist_d L2;
// 动态顺序表的初始化
bool InitSqList_d(Sqlist_d *L)
{
L->length = 0;
L->maxsize = InitSize;
// 为数据开辟空间
L->data = (ElemType *)malloc(sizeof(ElemType) * InitSize);
return true;
}
// 动态顺序表的插入
bool SqList_dInsert(Sqlist_d *L,int i,ElemType e)
{
// 判断操作是否合法
if(i < 1 || i > L->length + 1)
{
printf("插入位置不合法!\n");
return false;
}
if(L->length >= L->maxsize)
{
printf("这个表已经满了。\n");
return false;
}
// 将第i位元素及其后面的元素向后移一位
int j; // length的长度刚好是当前最大下标加一
for(j = L->length;j >= i;j--)
{
L->data[j] = L->data[j-1];
}
// 将新元素放到插入的位置
L->data[i-1] = e;
// 表长加1
L->length++;
// 插入成功返回true
return true;
}
// 将顺序表中第i位元素删除并把它返回给e
// 动态顺序表的元素删除
bool SqList_dElemDelete(Sqlist_d *L, int i, ElemType *e)
{
// 判断合法性
if(i < 1 || i > L->length)
{
printf("删除位置不合法!\n");
return false;
}
// 判空
if(L->length == 0)
{
printf("这个表是空的!\n");
return false;
}
// 将删除元素赋值给e
*e = L->data[i-1];
// 将第i位元素之后的元素向前移动一位
int j; // 此时i若作为下标就是删除元素后一位的下标
for(j = i; j < L->length; j++)
{
L->data[j-1] = L->data[j];
}
// 表长减一
L->length--;
return true;
}
// 动态顺序表的按值查找并返回其位序
int SqList_dLocElem(Sqlist_d L, ElemType e)
{
int i;
for(i = 0; i < L.length; i++)
{
if(L.data[i] == e)
{
return i + 1;
}
}
return 0;
}
// 动态顺序表的扩容
bool IncreaseSize(Sqlist_d *L, int len)
{
// 生成一个新指针指向原来数据的空间
ElemType *p = L->data;
// 开辟更大的空间
L->data = (ElemType *)malloc(sizeof(ElemType) * (L->length + len));
// 转移数据
int i;
for(i = 0; i < L->length; i++)
{
L->data[i] = p[i]; // p[i] === *p + i
}
// 修改最大长度
L->maxsize += len;
// 释放原来的空间
free(p);
return true;
}
// 动态顺序表的输出
bool Sqlist_dprint(Sqlist_d L)
{
// 判空
if(L.length == 0)
{
printf("这个顺序表为空!\n");
return false;
}
// 输出
printf("Sqlist_d;");
int i;
for(i = 0; i < L.length; i++)
{
printf("%d-->", L.data[i]);
}
printf("end\n");
return true;
}
// 按位取值
bool SqList_dLoc(Sqlist_d *L, int i)
{
if (i >= 1 && i <= L -> length)
{
printf("查找成功\n");
printf("第%d位元素的信息是:%d\n", i, L -> data[i-1]);
return true;
}
printf("查找失败!\n");
return false;
}
void Begin(){
printf("1.建立\n");
printf("2.输入\n");
printf("3.取值\n");
printf("4.查找\n");
printf("5.插入\n");
printf("6.删除\n");
printf("7.输出\n");
printf("8.退出\n");
int n;
int flag = 1;
while (flag)
{
printf("请选择:");
scanf("%d", &n);
int m,m1;
int d,d1,d2,d3;
char s,j;
switch (n){
case 1:
InitSqList_d(&L2);
printf("成功建立顺序表!\n");
break;
case 2:
printf("您希望输入几个元素:\n");
scanf("%d", &m);
printf("输入您的%d个元素,以创建顺序表。\n", m);
int i;
int s1;
for(i = 0; i < m; i++)
{
printf("请输入第%d个元素:", i+1);
scanf("%d", &s1);
SqList_dInsert(&L2, i+1, s1);
}
break;
case 3:
printf("请输入一个位置来取值:");
scanf("%d", &d);
SqList_dLoc(&L2, d);
break;
case 4:
printf("请输入一个值来查找它的位置:");
scanf("%d", &d1);
printf("%d的位置是:%d\n",d1,SqList_dLocElem(L2, d1));
break;
case 5:
printf("请输入要插入的位置:");
scanf("%d", &d2);
printf("请输入要插入的值:");
scanf("%d", &m1);
j = SqList_dInsert(&L2, d2, m1);
if (j)
{
printf("插入成功!\n");
}
break;
case 6:
printf("请输入你要删除的位置:");
scanf("%d", &d3);
ElemType c;
s = SqList_dElemDelete(&L2, d3, &c);
if (s)
{
printf("删除成功!\n");
}
break;
case 7:
Sqlist_dprint(L2);
break;
case 8:
flag = 0;
}
}
}
int main()
{
Begin();
return 0;
}
效果:
代码供参考,若有错误希望指出