// 定义顺序表中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;
// 构造记录顺序表SeqList各项参数(顺序表的首地址 + 顺序表的容量 + 顺序表中最后有效元素的下标)的结构体
typedef struct SeqList
{
DataType_t *Addr;
unsigned int Size;
int Last;
} SeqList_t;
// 创建顺序表并对顺序表进行初始化
SeqList_t *SeqList_Create(unsigned int size)
{
// 1.利用calloc为顺序表的管理结构体申请一块堆内存
SeqList_t *Manager = (SeqList_t *)calloc(1, sizeof(Manager));
if (NULL == Manager)
{
perror("calloc memory for manager is failed");
exit(-1); // 程序异常终止
}
// 2.利用calloc为所有元素申请堆内存
Manager->Addr = (DataType_t *)calloc(size, sizeof(DataType_t));
if (NULL == Manager->Addr)
{
perror("calloc memory for element is failed");
free(Manager);
exit(-1); // 程序异常终止
}
// 3.对管理顺序表的结构体进行初始化(元素容量 + 最后元素下标)
Manager->Size = size; // 对顺序表中的容量进行初始化
Manager->Last = -1; // 由于顺序表为空,则最后元素下标初值为-1
return Manager;
}
// 判断顺序表是否已满
bool SeqList_IsFull(SeqList_t *Manager)
{
return (Manager->Last + 1 == Manager->Size) ? true : false;
}
// 已知一个顺序表工,其中的元素递增有序排列,设计一个算法,插入一个元素x(x为int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。
SeqList_t * SeqList_Add(SeqList_t *Manager, int Data) //传参包含管理顺序表结构体的地址,需要插入的数据
{
if ( SeqList_IsFull(Manager) ) //判断顺序表是否已满
{
printf("SequenceList is Full!\n");
return false;
}
for (int i = 0; i < Manager->Last; i++) //遍历元素,递增排列,当数据大于当前下标元素,则插入到该元素前
{
if (Data > Manager[i])
{
for (int j = Manager->Last; j >= i; j--) //把下标i到下标Last的所有元素顺序后移一位
{
Manager[j+1]=Manager[j];
}
Manager[i]=Data; //将Data赋值给第i项
Manager->Last++; //将表示最后一项的下标加一
}
}
return Manager;
}
//对顺序表元素进行删除操作
typedef int SeqList_Data_t
SeqList_t * SeqList_Del(SeqList_t *Manager, int Data)
{
if(Data>Manager->Last){ //判断需要删除的元素的下标是否小于表示最后一个有效元素的下标
printf("The element does not exist in the sequence table!");
return false;
}
SeqList_Data_t c=Manager[Data] //将Data下标的值赋给c
for(int i=Data;i<=Manager->Last;i++){ //遍历将下标Data后的值
Manager[i]=Manager[i+1];
}
Manager[Last]=0;
Manager->Last--;
return Manager;
}
在主函数中测试
int main()
{
//1.创建顺序表
SeqList_t * Manager = SeqList_Create(10);
//2.向顺序表中的尾部插入新元素
SeqList_TailAdd(Manager,5);
SeqList_TailAdd(Manager,2);
SeqList_TailAdd(Manager,1);
SeqList_TailAdd(Manager,4);
SeqList_TailAdd(Manager,6);
//3.遍历顺序表
SeqList_Print(Manager); // -- 5 2 1 4 6
printf("\n");
//4.向顺序表中的头部插入新元素
SeqList_HeadAdd(Manager,9);
SeqList_HeadAdd(Manager,7);
SeqList_HeadAdd(Manager,8);
SeqList_HeadAdd(Manager,0);
SeqList_HeadAdd(Manager,10);
//5.遍历顺序表
SeqList_Print(Manager); // --10 0 8 7 9 5 2 1 4 6
printf("\n");
//6.删除顺序表的元素
SeqList_Del(Manager,20);
SeqList_Del(Manager,5);
SeqList_Del(Manager,10);
SeqList_Del(Manager,0);
SeqList_Del(Manager,30);
//7.遍历顺序表
SeqList_Print(Manager); // --8 7 9 2 1 4 6
printf("\n");
return 0;
}
总结:
构造顺序表时通常需要定义结构体对顺序要进行管理,通过管理结构体得到顺序表基本信息;
管理结构体中包含顺序表的地址,用户可以通过地址[下标]的方式访问或修改;
向顺序表中插入元素时需要考虑其他元素是否受影响,需将插入位置后的所有元素向后移动;