C语言实现顺序表的基本操作(增,删,差,改等等)

Seqlist.h 

#include<stdio.h>
#include<assert.h>
#include<string.h>
#define MAX 100

typedef int DataType;
typedef struct SeqList
{
	DataType data[MAX];//数据
	int sz;//记录数据的个数
}SeqList;

//初始化
void SeqListInit(SeqList* pSeq);


//尾部插入 
void PushBack(SeqList* pSeq, DataType d);
//尾部删除 
void PopBack(SeqList* pSeq);
//头部插入 
void PushFront(SeqList* pSeq, DataType d);
//头部删除 
void PopFront(SeqList* pSeq);
//查找指定元素 
int Find(SeqList* pSeq, DataType d);
//指定位置插入 
void Insert(SeqList* pSeq, int pos, DataType d);
//删除指定位置元素 
void Erase(SeqList* pSeq, int pos);
//删除指定元素 
void Remove(SeqList* pSeq, DataType d);
//删除所有的指定元素 
void RemoveAll(SeqList* pSeq, DataType d);
//返回顺序表的大小 
int Size(SeqList* pSeq);
//判断顺序表是否为空 
int Empty(SeqList* pSeq);
//冒泡排序 
void BubbleSort(SeqList* pSeq);
//选择排序 
void SelectSort(SeqList* pSeq);
//选择排序的优化 
void SelectSortOP(SeqList* pSeq);
//二分查找 
int BinarySearch(SeqList* pSeq, DataType d);
//二分查找递归写法 
int BinarySearch_R(SeqList* pSeq, int left, int right, DataType d);

//打印 
void PrintSeqList(SeqList* pSeq);

Seqlist.c

#include"Seqlist.h"

void SeqListInit(SeqList* pSeq)
{
	assert(pSeq);
	pSeq->sz = 0;
	memset(pSeq->data, 0, sizeof(pSeq->data));
}

void PushBack(SeqList* pSeq, DataType d)
{
	assert(pSeq);
	if (pSeq->sz == MAX)
	{
		printf("顺序表已满\n");
		return;
	}
	pSeq->data[pSeq->sz] = d;
	pSeq->sz++;
}

void PopBack(SeqList* pSeq)
{
	assert(pSeq);
	if (pSeq->sz == 0)
	{
		printf("顺序表为空,不能删除\n");
		return;
	}
	pSeq->sz--;
}

void PushFront(SeqList* pSeq, DataType d)
{
	int i = 0;
	assert(pSeq);
	if (pSeq->sz == MAX)
	{
		printf("顺序表已满,不能插入");
		return;
	}
	for (i = pSeq->sz - 1; i >= 0; i--)
	{
		pSeq->data[i+1] = pSeq->data[i];
	}
	pSeq->data[0] = d;
	pSeq->sz++;
}

void PopFront(SeqList* pSeq)
{
	int i = 0;
	assert(pSeq);
	if (pSeq->sz == 0)
	{
		printf("顺序表为空,不能删除");
		return;
	}
	for (i = 0; i < pSeq->sz - 1; i++)
	{
		pSeq->data[i] = pSeq->data[i + 1];
	}
	pSeq->sz--;
}

int Find(SeqList* pSeq, DataType d)
{
	int i = 0;
	assert(pSeq);
	for (i = 0; i < pSeq->sz; i++)
	{
		if (pSeq->data[i] == d)
		{
			return i;
		}
	}
	return -1;
}

void Insert(SeqList* pSeq, int pos, DataType d)
{
	int i = 0;
	assert(pSeq);
	assert(pos >= 0 && pos <= pSeq->sz);
	if (pSeq->sz == MAX)
	{
		printf("顺序表已满,无法插入");
		return;
	}
	for (i = pSeq->sz - 1; i >=pos ; i--)
	{
		pSeq->data[i + 1] = pSeq->data[i];
	}
	pSeq->data[pos] = d;
	pSeq->sz++;
}

void Erase(SeqList* pSeq, int pos)
{
	int i = 0;
	assert(pSeq);
	assert(pos >= 0 && pos <= pSeq->sz);
	if (pSeq->sz == 0)
	{
		printf("顺序表为空,不能删除");
		return;
	}
	for (i = pos; i < pSeq->sz - 1; i++)
	{
		pSeq->data[i] = pSeq->data[i + 1];
	}
	pSeq->sz--;
}

void Remove(SeqList* pSeq, DataType d)
{
	int i = 0;
	assert(pSeq);
	if (pSeq->sz == 0)
	{
		printf("顺序表为空,不能删除");
		return;
	}
	for (i = 0; i < pSeq->sz; i++)
	{
		if (pSeq->data[i] == d)
		{
			break;
		}
	}
	if (i == pSeq->sz)
	{	
		return;
	}
	for (; i < pSeq->sz - 1; i++)
	{
		pSeq->data[i] = pSeq->data[i+1];
	}
	pSeq->sz--;
}

void RemoveAll(SeqList* pSeq, DataType d)
{
	assert(pSeq);
	int i = 0;
	for (i = 0; i < pSeq->sz; i++)
	{
		if (pSeq->data[i] == d)
		{
			int j = 0;
			for (j = i; j < pSeq->sz - 1; j++)
			{
				pSeq->data[j] = pSeq->data[j + 1];
			}
			pSeq->sz--;
			--i;
		}
	}

}

int Size(SeqList* pSeq)
{
	assert(pSeq);
	return pSeq->sz;
}
int Empty(SeqList* pSeq)
{
	assert(pSeq);
	return pSeq->sz == 0;
}
void swap(DataType* p1, DataType* p2)
{
	DataType* tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
void BubbleSort(SeqList* pSeq)
{
	int i = 0;
	int j = 0;
	assert(pSeq);
	for (i = 0; i < pSeq->sz - 1;i++)
	{
		for (j = 0; j < pSeq->sz - i;j++)
		{
			if (pSeq->data[j] > pSeq->data[j + 1])
			{
				swap(pSeq->data+j, pSeq->data+j+1);
			}
		}
	}
}
void SelectSort(SeqList* pSeq)
{
	assert(pSeq);
	int i = 0;
	int j = 0;
	for (i = 0; i < pSeq->sz - 1; i++)
	{
		int max = 0;
		for (j = 1; j < pSeq->sz-i; j++)
		{
			if (pSeq->data[max] < pSeq->data[j])
			{
				max = j;
			}
		}
		//max为最大元素的下标
		if (max != pSeq->sz - 1 - i)
		{
			swap(pSeq->data + max, pSeq->data + pSeq->sz - 1 - i);
		}
	}
}

void SelectSortOP(SeqList* pSeq)
{
	int start = 0;
	int end = pSeq->sz - 1;
	while (start < end)
	{
		int max = start;
		int min = start;
		int i = 0;
		for (i = start; i <= end; i++)
		{
			if (pSeq->data[i] > pSeq->data[max])
			{
				max = i;
			}
			if (pSeq->data[i] < pSeq->data[max])
			{
				min = i;
			}
		}
		if (min != start)
		{
			swap(pSeq->data + start, pSeq->data + min);
		}
		if (max = start)
		{
			max = min;
		}
		if (max != end)
		{
			swap(pSeq->data + end, pSeq->data + max);
		}
		start++;
		end--;
	}
}

int BinarySearch(SeqList* pSeq, DataType d)
{
	int left = 0;
	int right = pSeq->sz - 1;

	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (pSeq->data[mid] > d)
		{
			right = mid - 1;
		}
		else if (pSeq->data[mid] < d)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
}
int BinarySearch_R(SeqList* pSeq, int left, int right, DataType d)
{
	int mid = 0;
	if (left > right)
	{
		return -1;
	}
	mid = left + (right - left) / 2;
	if (pSeq->data[mid] > d)
	{
		return BinarySearch_R(pSeq, left, mid - 1, d);
	}
	else if (pSeq->data[mid] < d)
	{
		return BinarySearch_R(pSeq, mid+1, right, d);
	}
	else
	{
		return mid;
	}
}


void PrintSeqList(SeqList* pSeq)
{
	assert(pSeq);
	int i = 0;
	if (pSeq->sz == 0)
	{
		printf("顺序表为空\n");
	}
	for (i = 0; i < pSeq->sz; i++)
	{
		printf("%d ", pSeq->data[i]);
	}
	printf("\n");
}

test.c

#include"Seqlist.h"
void TestPushBack()
{
	SeqList seq;
	SeqListInit(&seq);
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PrintSeqList(&seq);

	PopBack(&seq);
	PrintSeqList(&seq);

	PushFront(&seq, 1);
	PushFront(&seq, 2);
	PushFront(&seq, 3);
	PushFront(&seq, 4);
	PrintSeqList(&seq);

	PopFront(&seq);
	PrintSeqList(&seq);

	int pos=Find(&seq, 2);
	if (pos == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n",pos);
	}

	Insert(&seq, 1, 2);
	PrintSeqList(&seq);

	Erase(&seq, 1);
	PrintSeqList(&seq);

	Remove(&seq, 2);
	PrintSeqList(&seq);

	RemoveAll(&seq, 2);
	PrintSeqList(&seq);

	BubbleSort(&seq);
	PrintSeqList(&seq);

	SelectSort(&seq);
	PrintSeqList(&seq);
}

int main()
{
	TestPushBack();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Damn_Yang/article/details/83584568