顺序表的C语言实现

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
以下用C语言实现顺序表的一些操作:
void SeqInit(SeqList* pSeq);//初始化顺序表
void SeqPrint(SeqList* pSeq);//打印顺序表


void SeqPushBack(SeqList* pSeq, DataType x);//尾插
void SeqPopBack(SeqList* pSeq);//尾删
void SeqPushFront(SeqList* pSeq, DataType x);//头插
void SeqPopFront(SeqList* pSeq);//头删

void SeqInsert(SeqList* pSeq, size_t pos, DataType x);//pos点插入
void SeqErase(SeqList* pSeq, size_t pos); //删除pos

int SeqFind(SeqList* pSeq, DataType x);//在顺序表中查找
void SeqAt(SeqList* pSeq, size_t pos, DataType x);//替换pos位置为x

void BubbleSort(SeqList* pSeq); //冒泡排序
void SelectSort(SeqList* pSeq);//选择排序
int BinarySearch(SeqList* pSeq);//二分查找

void SeqDestory(SeqList* pSeq);//销毁顺序表

初始化顺序表

void SeqInit(SeqList* pSeq)//初始化顺序表
{
	pSeq->_size = 0;
	pSeq->_capacity = 7;
	pSeq->_a = (DataType *)malloc(pSeq->_capacity * sizeof(DataType));
	if (pSeq->_a = NULL)
	{
		printf("顺序表初始化失败");

	}
}

打印顺序表

void SeqPrint(SeqList* pSeq)//打印顺序表
{
	size_t i = 0;
	assert(pSeq);
	for (; i < pSeq->_size; i++)
	{
		printf("%d ", pSeq->_a[i]);
	}
	printf("\n");
}

尾插

void SeqPushBack(SeqList* pSeq, DataType x)//尾插
{
	size_t i = 0;
	assert(pSeq);
	for (; i < pSeq->_size; i++)
	{
		pSeq->_a[pSeq->_size] = x;
	}
    pSeq->_size++;
}

尾删

void SeqPopBack(SeqList* pSeq)//尾删
{
	assert(pSeq);
	if (pSeq->_size = 0)
		printf("顺序表里没有数据\n");
	return;
	pSeq->_size--;
}

头插

void SeqPushFront(SeqList* pSeq, DataType x)//头插
{
	size_t i = pSeq->_size;
	if (pSeq->_size >= pSeq->_capacity)
	{
		pSeq->_a = (DataType *)realloc(pSeq->_capacity ,2* sizeof(DataType));
		for (; i > 0; i--)
		{
			pSeq->_a[i] = pSeq->_a[i-1];
		}
		pSeq->_a[0] = x;
		pSeq->_size++;
	}
}

头删

void SeqPopFront(SeqList* pSeq)//头删
{
	assert(pSeq);
	size_t i = 1;
	for (; i < pSeq->_size; i++)
	{
		pSeq->_a[i - 1] = pSeq->_a[i];
	}
	pSeq->_size--;
}

在pos插入

void SeqInsert(SeqList* pSeq, size_t pos, DataType x)//pos点插入
{
	assert(pSeq);
	size_t i = 1;
	for (; i < pos; i--)
	{
		pSeq->_a[i] = pSeq->_a[i - 1];
	}
	pSeq->_a[pos - 1] = x;
	pSeq->_size++;
}

删除pos点

void SeqErase(SeqList* pSeq, size_t pos)//删除pos
{
	assert(pSeq);
	size_t i = pos;
	for (; i < pSeq->_size; i++)
	{
		pSeq->_a[i - 1] = pSeq->_a[i];
	}
	pSeq->_size--;
}

在顺序表里查找

int SeqFind(SeqList* pSeq, DataType x)//在顺序表中查找
{
	assert(pSeq);
	size_t i = 0;
	for (; i < pSeq->_size; i++)
	{
		if (pSeq->_a[i] = x)
		{
			return i + 1;
		}
	}
	return 0;
}

替换

void SeqAt(SeqList* pSeq, size_t pos, DataType x)//替换pos位置为x
{
	assert(pSeq);
	assert(pSeq->_a[pos] < pSeq->_size);
	pSeq->_a[pos - 1] = x;      //直接赋值即可替换
}

冒泡排序

void BubbleSort(SeqList* pSeq)//冒泡排序
{
	assert(pSeq);
	size_t i, j;
	for (i = 0; i < pSeq->_size; i++)
	{
		int tmp = 0;
		for (j = 0; j < pSeq->_size - i - 1; j++)
		{
			if (pSeq->_a[j] > pSeq->_a[j + 1])
			{
				tmp = pSeq->_a[j];
				pSeq->_a[j] = pSeq->_a[j + 1];
				pSeq->_a[j + 1] = tmp;
			}
		}
	}
    
}

选择排序

void SelectSort(SeqList* pSeq)//选择排序
{
	assert(pSeq);
	size_t min = 0;
	size_t max = 0;
	size_t left = 0;
	size_t right = pSeq->_size - 1;
	while (left<right)
	{
		for (size_t i = left; i <= right; i++)
		{
			if (pSeq->_a[min]>pSeq->_a[i])
			{
				min = i;
			}
			if (pSeq->_a[max] < pSeq->_a[i])
			{
				max = i;
			}
		}
		DataType x = pSeq->_a[min];
		pSeq->_a[min] = pSeq->_a[left];
		pSeq->_a[left] = x;
		if (max == left)
		{
			max = min;
		}
		x = pSeq->_a[max];
		pSeq->_a[max] = pSeq->_a[right];
		pSeq->_a[right] = x;
		left++;
		right--;
	}

}

二分查找

int BinarySearch(SeqList* pSeq,DataType x)//二分查找
{
	assert(pSeq);
	size_t left = 0; 
	size_t right = pSeq->_size - 1;
	while (left < right)
	{
		int mid = ((right - left) / 2) - left;
		if (pSeq->_a[mid] > x)
		{
			right = mid - 1;
		}
		if (pSeq->_a[mid] < x)
		{
			left = mid + 1;
		}
		else
		{
			return mid + 1;
		}
	}
	return 0;
}

销毁顺序表

void SeqDestory(SeqList* pSeq)//销毁顺序表
{
	assert(pSeq);
	pSeq->_size = 0;
	pSeq->_capacity = 0;
	free(pSeq->_a);//释放空间
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值