一. 题目的要求

写出三种链表的接口函数

它们的功能分别是

1 查找数的位置

2 在pos位置插入值

3 在pos位置删除值

二. 实现pos

这个其实很简单 找到一步步遍历 找到这个数字就返回 找不到就提示用户下 这

个数字不存在

int SeqListFind(SL* ps,int x)
{
	int i;
	for ( i = 0; i < ps->size; i++)
	{
		if (ps->a[i]==x)
		{
			return i;
		}
	}
	if (i==ps->size)
	{
		printf("不存在这个数");
	}
	return -1;
}

三. 实现在pos位置处插入数字

这个其实和我们的头插表示差不多

只要找到pos的位置

首先判断需不需要扩容

然后再将需要插入的数字依次向后面的排一位

之后再将这个数字插入就好

代码表示如下

void SeqListPushPos(SL* ps, int x, int y)
{
	if ((ps->size) == (ps->capacity))
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		ps->capacity = newcapacity;
		SLDateType* tmp = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));
		if (tmp == NULL)
		{
			perror("pushback realloc");
		}
		ps->a = tmp;
	}
	// 其实效果和头插差不多 
	// 只不过头插的起始位置有点变化了
	int i;
	for (i = ps->size - 1; i >= x; i--)
	{
		(ps->a[i + 1]) = (ps->a[i]);
	}

	ps->a[x] = y;
	ps->size++;
}

四. 在pos处删除数字

这个和头删也差不多

只需要也只不过是前面0的界限变成pos的界限

代码表示如下

void SeqListPopPos(SL* ps, int x)
{
	assert(ps->size != 0);
	int i;
	for ( i =x; i <ps->size-1 ; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

演示代码如下

int main()
{
	SL a1;
	SeqListInit(&a1);
	SeqListPushFront(&a1, 1);
	SeqListPushFront(&a1, 2);
	SeqListPushFront(&a1, 3);
	SeqListPushFront(&a1, 4);
	SeqListPushFront(&a1, 5);
	SeqListPrint(&a1);
	int pos=SeqListFind(&a1, 4);
	SeqListPushPos(&a1, pos, 6);
	SeqListPrint(&a1);
	pos = SeqListFind(&a1, 3);
	SeqListPopPos(&a1, pos);
	SeqListPrint(&a1);
	return 0;
}

演示效果如下

在这里插入图片描述

五 使用pos函数来模拟头增 头删 尾增 尾删

// 演示
SeqListPushPos(&a1, 0, 6);
SeqListPushPos(&a1, size-1, 6);

SeqListPopPos(&a1, 0, 6);
SeqListPopPos(&a1, size-1, 6);

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏

希望大佬们看到错误之后能够不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐