以下实现均以下标从0开始
- 定义顺序表结构体
记录当前元素个数和定义顺序表的大小
#define maxSize 10
typedef struct
{
int length;
int data[maxSize];
}Sqlist;
2.初始化顺序表,判断表是否为空
void initList(Sqlist *L)
{
L->length = 0;
}
_Bool emptyList(Sqlist L) { return L.length == 0; }
3.清空表
_Bool clearList(Sqlist *L) //清空顺序表
{
L->length = 0;
return 1;
}
4.插入元素
_Bool insertListTail(Sqlist *L, int value) //在末尾插入值
{
if (L->length >= maxSize)
{
return 0;
}
if (L->length < maxSize)
{
L->data[L->length] = value;
L->length++;
return 1;
}
}
_Bool insertListPosition(Sqlist *L, int position, int value) //在指定位置插入值,下标从0开始
{
if (position<0 || position>L->length)
{
printf("在末尾插入元素失败\n");
return 0;
}
else if (L->length >= maxSize)
{
printf("在指定位置%d插入元素%d失败\n", position, value);
return 0;
}
else
{
for(int i = L->length - 1; i >= position;i--)
{
//length-1是最后一个元素所在的位置,将最后一个元素至position都后移一位
L->data[i + 1] = L->data[i];
}
L->data[position] = value;
L->length++;
printf("在指定位置%d插入元素%d成功\n", position, value);
return 1;
}
}
5.删除元素
_Bool removeList(Sqlist *L, int position, int *value) //value保存删除元素的值
{
//判断线性表是否有元素,以及删除位置是否合理
if (L->length == 0 || position < 0 || position >= L->length)
{
printf("删除元素失败\n");
return 0;
}
else
{
*value = L->data[position];
for (int i = position; i < L->length; i++)
{
L->data[i] = L->data[i + 1];
}
printf("删除元素成功\n");
L->length--;
return 1;
}
}
6.获取指定位置元素的值
_Bool getValue(Sqlist L, int position, int *value) //取得的值要传回value,因此要带*,引用传递
{
if (L.length <= 0 || position < 0 || position >= L.length)
{
printf("获取位置%d元素失败\n", position);
return 0;
}
else
{
*value = L.data[position];
printf("获取位置%d元素成功\n", position);
return 1;
}
}
7.定位元素在顺序表中的位置
int locateElem(Sqlist L, int *elem) //定位元素elem第一次出现的位置,下标由0开始
{
int position;
if (L.length == 0)
{
printf("定位元素位置失败\n");
return -1;
}
else
{
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == elem)
{
position = i;
printf("定位元素位置成功\n");
return position;
}
}
printf("无此元素\n");
return 0;
}
}
8.打印顺序表
void printList(Sqlist L)//不用改变线性表中元素的值,因此是值传递
{
int i = 0;
printf("当前线性表的长度为%d\n", L.length);
while (L.length > i)
{
printf("%d\t", L.data[i++]);
}
printf("\n-------------------------------------------------\n");
}
9.将第二个顺序表中存在且第一个顺序表中不存在的元素加到第一个顺序表
//将第二个顺序表中存在且第一个顺序表中不存在的元素加到第一个顺序表
void unionList(Sqlist *La, Sqlist Lb)
{
int lenLa = La->length;
int lenLb = Lb.length;
for (int i = 0; i < lenLb; i++)
{
int e = Lb.data[i];
if (!locateElem(*La, &e)) //定位失败说明La中无此元素
{
La->data[lenLa++] = e;
}
}
}
部分功能测试:
int main()
{
Sqlist L;
initList(&L); //函数中的参数是指针类型,因此是传地址
for (int i = 0; i < maxSize-5; i++)
{
insertListTail(&L, i * 2);
}
printList(L);
insertListPosition(&L, 3, 100);
printList(L);
for (int i = 0; i < L.length; i++)
{
/*
int *e=0;
getValue(L,i,e);
这样的作法是错误的,int *e是定义一个指针变量,指针变量保存的是地址,
如:int i=0;
int *e=&i; 这样指针变量e就指向整数i,e的值就是整数i所在的地址
*/
int e = 0;
getValue(L, i, &e);
printf("%d位置元素为%d\n", i, e);
}
int elem = 0;
removeList(&L, 0, &elem);
system("pause");
}
运行结果: