void seqlistInit(SL* ps);//顺序表的初始化(功能上) 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
//声明决定不了
void seqlistprint(SL* ps);
void seqlistcheckcapacity(SL* ps);
void seqlistdestory(SL* ps);
//先实现一个尾插
void seqlistpushback(SL* ps, SLdatatype x);
//实现尾删
void seqlistpopback(SL* ps);
//实现一个头插
void seqlistpushpront(SL* ps, SLdatatype x);
//头删
void seqlistpoppront(SL* ps);
//找到返回x的下标,找不到返回-1
int seqlistfindlw(SL* ps, int pos);//本人的方法
//指定pos位置下标插入
void seqlistinsertlw(SL* ps, int pos, SLdatatype x);//因为你要添加一个数字在顺序表(数组)里面
//删除pos位置的数据
void seqlisterase(SL* ps, int pos);
这是函数接口
#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h.h"
void seqlistInit(SL* ps)//
{
ps->a = NULL;
ps->capacity = ps->size = 0;
}
void seqlistcheckcapacity(SL* ps)
{
if (ps->capacity == ps->size)//要么都为零要么空间已满要补齐空间,while不可连等
{
int newcapacity =ps->capacity == 0 ? 4:ps->capacity*2;//三目操作符,是否为0是的话给4个整型空间,如果不是则将空间扩大两倍
//printf("%u ", sizeof(ps->capacity * 2));//指针指向的变量大小为4
SLdatatype* tmp = (SLdatatype*)realloc(ps->a, newcapacity * sizeof(SLdatatype));
if (tmp == NULL)
{
printf("%s\n", strerror(errno));
exit(-1);//退出整个程序
}
ps->a = tmp;//新的容量空间大小
ps->capacity = newcapacity;
}
}
void seqlistpushback(SL* ps, SLdatatype x)//开始进行尾插
{
seqlistcheckcapacity(ps);//函数入口
ps->a[ps->size] =x;//每次调用时就赋值一次
++(ps->size);//赋值一次加加一次
//printf("%d\n", ps->a[ps->size]);
}
void seqlistpopback(SL* ps)
{
assert(ps->size > 0);//防止删多了非法访问造成系统崩溃
int j = ps->size - 1;
for (int i = 0; i <= j; ++i)
{
ps->a[j] = ps->a[j - 1];
}
(ps->size)--;
}
void seqlistpushpront(SL* ps, SLdatatype x)//函数的定义,实现头插
{
seqlistcheckcapacity(ps);
assert(ps->size > 0);//防止删多了非法访问造成系统崩溃
//思路:头插就是将数字插在数字前面,即是将数字一个个往后移动,
int end = ps->size - 1;
while (end >= 0)
{
ps->a[end + 1] = ps->a[end];//数组下表可以是负数,但是所指的地址是不确定的值,是个未知数
--end;
}
ps->a[0] = x;
ps->size++;
/*free(ps->a[-1]);
ps->a[-1] = NULL;*/
}
void seqlistpoppront(SL* ps)
{
assert(ps->size>0);
int begin = 1;
while(begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];//所谓头删就是将数组里的数字一个个往前挪覆盖
++begin;
}
ps->size--;
}
void seqlistprint(SL* ps)
{
assert(ps->size > 0);//防止非法访问造成系统崩溃
for (int i = 0; i < ps->size; ++i)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void seqlistdestory(SL* ps)
{
free(ps->a);
ps->a = NULL;
}
int seqlistfindlw(SL* ps, int pos)
{
assert(ps->size > 0);
for(int j = 0; j <= ps->size - 1; j++)
{
if (ps->a[j] == pos)
{
printf("找到了下标为 %d\n", j);
return j;//return直接跳出当前语句处,使用break只能跳出单层循环,contiune跳出本循环未执行的语句
}
}
return -1;
}
void seqlistinsertlw(SL* ps, int pos, SLdatatype x)指定pos位置下标插入,思路使用尾插思维,将数据从尾部依次挪动
{
seqlistcheckcapacity(ps);//这个函数的功能就是调用该功能,ps就是个指向动态顺序表的指针变量!
assert(pos>=0&&pos<=ps->size);
int end = ps->size - 1;
while (pos<=end)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[pos] = x;
ps->size++;
}
void seqlisterase(SL* ps, int pos)
{
int j = pos;
while (j<= ps->size - 1)
{
ps->a[j] = ps->a[j + 1];
j++;
}
ps->size--;
}
图二为顺序表主要功能的实现
void testmenu3(void)
{
SL s1;//不要忘记了有一个数据接口哦
//testmenu(&s1);
seqlistInit(&s1);
int input = 0;
int x = 0;
int pos = 0;
while(input!=-1)
{
printf("点击以下选项开始程序\n");
//scanf("%d", &input);
testmenu();
scanf("%d", &input);
// scanf("%d", &x);
switch (input)//总要有个判定条件,所以此方法有所缺陷
{
case 1://switch会直接执行case1里面的程序而会跳过两者间的语句程序
{
printf("请输入不为-1你要进行尾插的数: ");
scanf("%d", &x);
while(x!=-1)
{
//请插入0意外的任何数字
seqlistpushback(&s1, x);
scanf("%d", &x);
}
//seqlistprint(&s1);
break;
}
case 2:
{
printf("请输入除去-1以外你要进行头插的数: ");
scanf("%d ", &x);
while (x != -1)
{
seqlistpushpront(&s1, x);
scanf("%d", &x);
}
break;
}
case 3:
seqlistpoppront(&s1);
break;
case 4:
seqlistpopback(&s1);
break;
case 5:
printf("请输入要插入的对应下标以及插入-1以外的元素\n");
scanf("%d %d",&pos,&x );
while(x!=-1)
{
seqlistinsertlw(&s1, pos, x);
scanf("%d %d", &pos, &x);
}
case 6:
seqlistprint(&s1);
case-1:
break;
}//while和switch判定结果都为1时程序直接退出!
}
//seqlistprint(&s1);
seqlistdestory(&s1);
}
int main()
{
//testseqlist1();//创建第一个列表,函数的声明
//testseqlist2();
testmenu3();
return 0;
}
图三为代码测试区,相当于客户端
正文内容结束,看到这里的你真的很棒!