对顺序表的操作:增删查

1.顺序表的增加:

分为三种情况:尾插,头插,按位置插

>尾插:依次将数据插入到上一个数据的后面,有效元素个数应小于数组长度:

void SeqListPushBack(SeqList *pSL,DataType data)
{
	assert(pSL);
	assert(pSL->size < MAX_SIZE);
	pSL->array[pSL->size] = data;
	pSL->size++;
}

>头插:将数据插入到顺序表的头部,即数组第一个元素位置,分三种情况:

void SeqListPushFront(SeqList *pSL, DataType data)
{
	assert(pSL != NULL);
	assert(pSL->size < MAX_SIZE);

	//第一种:以要搬的数做循环指示
#if 1
	int pos;
	for (pos = pSL->size - 1; pos >= 0; pos--)
	{
		pSL->array[pos + 1] = pSL->array[pos];
	}
#endif

	//第二种:以要搬的位置做循环
#if 0
	int pos;
	for (pos = pSL->size ; pos >0; pos--)
	{
		pSL->array[pos] = pSL->array[pos-1];
	}
#endif

	//第三种:以循环次数做循环指示
#if 0
	int pos;
	for (pos = 0; pos<pSL->size ; pos++)
	{
		pSL->array[pSL->size -pos] = pSL->array[pSL->size -pos-1];
	}
#endif

	pSL->array[0] = data;
	pSL->size++;				 //插入之后有效长度+1
}

>按下表插入数据:找到给定下表位置,后面的元素依次往后移一位:

void SeqListInsert(SeqList *pSL, int pos, DataType data)
{
	assert(pSL != NULL);
	assert(pSL->size > 0);
	assert(pos >= 0 && pos < pSL->size);

	//将pos后面的位置往后挪一个
	int p;
	for (p = pSL->size - 1; p>pos; p--)
	{
		pSL->array[pos + 1] = pSL->array[pos];
	}
	pSL->array[pos] = data;
	pSL->size++;              //插入之后有效长度+1
}

2.删除:把删除分为五种:尾删,头删,按下标删,按值删遇到的第一个数据,按值删遇到的所有数据:

>尾删:只需要有效长度-1

void SeqListPopBack(SeqList *pSL)
{
	assert(pSL != NULL);
	assert(pSL->size > 0);
	pSL->size--;
}

>头删:从前往后依次覆盖前一个值,长度-1

void SeqListPopFront(SeqList *pSL)
{
	assert(pSL);
	assert(pSL->size > 0);
	int pos;
	for (pos = 1; pos < pSL->size; pos++)
	{
		pSL->array[pos - 1] = pSL->array[pos];
	}
	pSL->size--;
}

>按下标删除:

分两种情况:以要搬运的数值做循环指示和以要 搬运的位置做指示

void SeqListErase(SeqList *pSL, int pos)
{
	assert(pSL);
	assert(pSL->size > 0);
	assert(pos >= 0 && pos < pSL->size);
	//按下标删分两种情况

	//第一种:以要搬运的数值做循环指示
#if 0
	int p;
	for (p = pos + 1; p < pSL->size; p++)
	{
		pSL->array[p - 1] = pSL->array[p];
	}
#endif

	//第二种:以要 搬运的位置做指示
#if 1
	int p;
	for (p = pos; p < pSL->size-1; p++)
	{
		pSL->array[p] = pSL->array[p+1];
	}
#endif

	pSL->size--;
}

>按值删除,只删除遇到的第一个:

void SeqListRemove(SeqList *pSL, DataType data)
{
	assert(pSL != NULL);
	assert(pSL->size > 0);
	int pos = SeqListFind(pSL, data);   //调用查找元素函数
	if (pos != -1){
		SeqListErase(pSL, pos);      //调用按下标删
	}
}

>按值删除,删除所有:

用两个变量(i,j)来表示数组下标,i通过下标来判断是否是给定值,如果不是,则把i对应的下标元素放到下标j对应的位置。如果是则跳过,继续查找:如下图

void SeqListRemoveAll(SeqList *pSL, DataType data)
{
	assert(pSL != NULL);
	assert(pSL->size > 0);
	int i, j;
	for (i = 0, j = 0; i < pSL->size;i++)
	{
		if (pSL->array[i]!= data)
		{
			pSL->array[j] = pSL->array[i];
			j++;
		}
	}
	pSL->size = j;
}

3.查找::返回第一个找到的下标,若没有则返回-1

int SeqListFind(SeqList *pSL, DataType data)
{
	assert(pSL);
	int pos;
	for (pos = 0; pos < pSL->size - 1; pos++)
	{
		if (pSL->array[pos] == data)
			return pos;
	}
	return -1;
}






猜你喜欢

转载自blog.csdn.net/qq_41889292/article/details/80732656