顺序表的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
    评论
静态顺序表是一种使用数组实现的线性表,它的大小在编译时确定,不可动态改变。下面是静态顺序表C语言实现: ```c #define MAX_SIZE 100 // 定义静态顺序表的最大容量 typedef struct { int data[MAX_SIZE]; // 用数组存储数据元素 int length; // 当前顺序表的长度 } SeqList; // 初始化顺序表 void init(SeqList *list) { list->length = 0; } // 插入元素 int insert(SeqList *list, int index, int value) { if (index < 0 || index > list->length || list->length == MAX_SIZE) { return 0; // 插入位置不合法或顺序表已满,插入失败 } for (int i = list->length - 1; i >= index; i--) { list->data[i + 1] = list->data[i]; // 将插入位置后的元素后移一位 } list->data[index] = value; // 在插入位置插入新元素 list->length++; // 长度加1 return 1; // 插入成功 } // 删除元素 int remove(SeqList *list, int index) { if (index < 0 || index >= list->length) { return 0; // 删除位置不合法,删除失败 } for (int i = index + 1; i < list->length; i++) { list->data[i - 1] = list->data[i]; // 将删除位置后的元素前移一位 } list->length--; // 长度减1 return 1; // 删除成功 } // 获取元素 int get(SeqList *list, int index) { if (index < 0 || index >= list->length) { return -1; // 获取位置不合法,返回-1表示失败 } return list->data[index]; } // 修改元素 int modify(SeqList *list, int index, int value) { if (index < 0 || index >= list->length) { return 0; // 修改位置不合法,修改失败 } list->data[index] = value; return 1; // 修改成功 } ``` 以上是静态顺序表的简单实现,包括初始化、插入、删除、获取和修改等基本操作。你可以根据需要进行调用和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值