#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*
定义一个结构体,包含
保存指向动态数组指针的指针域base,
动态数组的有效长度cent,
动态数组的总长度length
*/
struct Student
{
int* base;
int cent;
int length;
};
//函数的声明
void init_list(struct Student* str,int len);
bool append_list(struct Student* str,int val);
bool insert_list(struct Student* str,int pos,int val);
bool delete_list(struct Student* str,int pos,int* val);
void show_list(struct Student* str);
int main() {
struct Student str; //定义结构体变量str
int val;
init_list(&str,6); //调用init_list函数,给str中的变量赋值
append_list(&str,10); //为动态数组添加元素
append_list(&str,20);
append_list(&str,30);
append_list(&str,40);
append_list(&str,50);
// append_list(&str,60);
// append_list(&str,70);
printf("线性表:");
show_list(&str); //遍历线性表
putchar(‘\n‘);
if(insert_list(&str,2,5)) //判断插入元素是否成功,插入成功则输出线性表,否则输出插入失败的原因
{
printf("插入元素后的线性表:");
show_list(&str);
}
putchar(‘\n‘);
if(delete_list(&str,2,&val)) //判断删除元素是否成功,删除成功则输出删除元素和线性表,否则输出删除失败的原因
{
printf("删除的元素:%d\n",val);
printf("删除元素后的线性表:");
show_list(&str);
}
putchar(‘\n‘);
return 0;
}
/*
传入结构体变量的地址和动态数组的长度,
初始化结构体变量str,
str的有效长度赋值为0,str的总长度赋值为len,
str的base指向malloc动态分配的数组
*/
void init_list(struct Student* str,int len)
{
str->base=(int*)malloc(sizeof(int)*len); //动态分配数组
if(str->base==NULL) //判断内存是否分配成功,失败则退出
{
printf("内存分配失败!\n");
exit(-1);
}
str->cent=0;
str->length=len;
}
/*
传入结构体变量的地址和追加的值,
将val赋值给数组中下标为cent的位置,
然后cent++
*/
bool append_list(struct Student* str,int val)
{
if(str->cent>=str->length) //判断动态数组中有效长度是否与总长度相等,如果相等,则返回false
{
printf("动态数组空间不足!\n");
return false;
}
str->base[str->cent]=val; //将val追加给数组
str->cent++; //结构体中cent+1
return true;
}
/*
传入结构体变量的地址,
用for循环遍历动态数组
*/
void show_list(struct Student* str)
{
if(str->cent<=0) //判断数组是否为空,如果为空,则不用执行for循环,直接return
{
printf("动态数组为空!\n");
return;
}
for(int i=0;i<str->cent;i++) //用for循环遍历动态数组
{
printf("%d\t",str->base[i]);
}
putchar(‘\n‘);
return;
}
/*
传入结构体变量的地址、插入的位置和插入的值,
先找到插入的位置pos,将pos后的元素都后退一次,
将val赋值给数组下标为pos-1的位置
然后cent++
*/
bool insert_list(struct Student* str,int pos,int val)
{
if(str->cent>=str->length) //判断数组是否已满,如果已满,则返回false
{
printf("动态数组已满!\n");
return false;
}
if(pos<1||pos>str->cent) //判断插入的位置是否合适,如果不合适,则返回false
{
printf("插入位置不合适!\n");
return false;
}
for(int i=str->cent-1;i>=pos-1;i--) //利用for循环,将下表为pos-1后的元素都后移一个位置
{
str->base[i+1]=str->base[i];
}
str->base[pos-1]=val; //将val的值赋值给下标为pos-1的位置
str->cent++;
return true;
}
/*
传入结构体变量的地址、需要删除的位置和val的地址,
先找到需要删除的位置pos,将下标为pos-1的值赋值给*val,
然后将pos后的元素都前进一次,
最后cent--
*/
bool delete_list(struct Student* str,int pos,int* val)
{
if(str->cent<=0) //判断数组是否为空,如果为空,则直接返回false
{
printf("动态数组为空!\n");
return false;
}
if(pos<1||pos>str->cent) //判断删除的位置是否合适,如果不合适,则返回false
{
printf("删除的元素的位置不存在!\n");
return false;
}
*val=str->base[pos-1]; //将下标为pos-1的值存放在*val中
for(int i=pos;i<str->cent;i++) //用for循环,将下标为pos-1后的元素都前进一次
{
str->base[i-1]=str->base[i];
}
str->cent--;
return true;
}