只需要在这里就能了解动态顺序表开辟,详解易懂!

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;
}

图三为代码测试区,相当于客户端

正文内容结束,看到这里的你真的很棒!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值