【C语言】顺序表

SeqList.h

#ifndef SEQ_LIST
#define SEQ_LIST

#include <stdio.h>

typedef int DataType;
#define MAX_SIZE 10

typedef struct  SeqList
{
	DataType arry[MAX_SIZE];
	size_t Size;
}SeqList, *pSeqList;

//初始化顺序表
void InitSeqList(SeqList* pSeqList);
// 在顺序表的ipos位置上插入元素data
void Insert(SeqList* pSeqList, size_t pos, DataType data);
//在顺序表的尾部插入元素data
void PushBack(SeqList *pSeqList, DataType data);
// 将顺序表尾部的元素抛出
void PopBack(SeqList* seqList);
// 顺序表的头部插入元素data
void PushFront(SeqList* pSeqList, DataType data);
// 顺序表的头部的元素删除
void PopFront(SeqList* pSeqList);
// 顺序表中查找数据data,返回该元素在顺序表中的位置
int Find(SeqList* pSeqList, DataType data);
// 在顺序表的ipos位置上插入元素data
void Insert(SeqList* pSeqList, size_t pos, DataType data);
// 删除顺序表pos位置上的元素
void Erase(SeqList* pSeqList, size_t pos);
// 移除顺序表中的元素data
void Remove(SeqList* pSeqList, DataType data);
// 移除顺序表中的所有值为data的元素
void RemoveAll(SeqList* pSeqList, DataType data);
// 选择排序
void SelectSort(SeqList* pSeqList);
// 冒泡排序
void BubbleSort(SeqList* pSeqList);
// 查找已序顺序表中的元素data
int BinarySearch(SeqList* pSeqList, DataType data);
// 打印顺序表
void PrintSeqList(SeqList* pSeqList);
#endif

SeqList.c

#include "SeqList.h"
#include <assert.h>
#include <string.h>

void InitSeqList(SeqList *pSeqList)
{
	if(NULL == pSeqList)
	{
		return;
	}
	pSeqList->Size = 0;
	memset(pSeqList, 0, sizeof(DataType)*MAX_SIZE);
}
void Erase(SeqList* pSeqList, size_t pos)
{
	size_t iBegin = pos;
	if((pSeqList == NULL)||(pSeqList->Size <= 0))
	{
		return;
	}
	for(;iBegin < pSeqList->Size-1;++iBegin)
	{
		pSeqList->arry[iBegin] = pSeqList->arry[iBegin+1];
	}
	pSeqList->Size--;
}
void Insert(SeqList* pSeqList, size_t pos, DataType data)
{
	size_t iBegin = pSeqList->Size;
	if((NULL == pSeqList)||(pos > pSeqList->Size)||(pSeqList->Size >= MAX_SIZE))
	{
		return;
	}
	for(;iBegin > pos;--iBegin)
	{
		pSeqList->arry[iBegin] = pSeqList->arry[iBegin-1];
	}
	pSeqList->arry[pos] = data;
	pSeqList->Size++;
}
void PushBack(SeqList *pSeqList, DataType data)
{
	assert(pSeqList);
	Insert(pSeqList, pSeqList->Size, data);
}
void PopBack(SeqList* pSeqList)
{
	if((NULL == pSeqList)||(pSeqList->Size == 0))
	{
		return;
	}
	pSeqList->Size--;
}
void PrintSeqList(SeqList *pSeqList)
{
	size_t iBegin = 0;
	if(NULL == pSeqList)
	{
		return;
	}
	for(; iBegin < pSeqList->Size; ++iBegin)
	{
		printf("%d ",pSeqList->arry[iBegin]);
	}
	printf("\n");
}
void PushFront(SeqList* pSeqList, DataType data)
{
	Insert(pSeqList, 0, data);
}
void PopFront(SeqList* pSeqList)
{
	Erase(pSeqList, 0);
}
int Find(SeqList* pSeqList, DataType data)
{
	size_t iBegin = 0;
	if(pSeqList == NULL)
	{
		return -1;
	}
	for(;iBegin < pSeqList->Size;++iBegin)
	{
		if(pSeqList->arry[iBegin] == data)
		{
			return iBegin;
		}
	}
	return -1;
}
void Remove(SeqList* pSeqList, DataType data)
{
	Erase(pSeqList, Find(pSeqList, data));
}
void RemoveAll(SeqList* pSeqList, DataType data)
{
	while(Find(pSeqList, data) != -1)
	{
		Remove(pSeqList, data);
	}
}
void SelectSort(SeqList* pSeqList)
{
	size_t i = 0;
	size_t j = 0;
	size_t iMinPos = 0;
	if(NULL == pSeqList)
	{
		return;
	}
	for(i=0;i < pSeqList->Size-1;++i)
	{
		iMinPos = i;
		for(j=i+1;j < pSeqList->Size;++j)
		{
			if(pSeqList->arry[iMinPos] > pSeqList->arry[j])
			{
				iMinPos = j;
			}
		}
		if(iMinPos != i)
		{
			DataType temp = pSeqList->arry[i];
			pSeqList->arry[i] = pSeqList->arry[iMinPos];
			pSeqList->arry[iMinPos] = temp;
		}
	}
}
void BubbleSort(SeqList* pSeqList)
{
	size_t iCount = 0;
	size_t iBegin = 0;
	int iFlag = 0;
	if (NULL == pSeqList)
	{
		return;
	}
	for(iCount=0;iCount < pSeqList->Size-1;++iCount)
	{
		iFlag = 1;
		for(iBegin=0;iBegin < pSeqList->Size-iCount-1;++iBegin)
		{
			if(pSeqList->arry[iBegin] < pSeqList->arry[iBegin+1])
			{
				DataType temp = pSeqList->arry[iBegin];
				pSeqList->arry[iBegin] = pSeqList->arry[iBegin+1];
				pSeqList->arry[iBegin+1] = temp;
				iFlag = 0;
			}
		}
		if(iFlag)
		{
			return;
		}
	}
}
int BinarySearch(SeqList* pSeqList, DataType data)
{
	size_t iLeft = 0;
	size_t iRight = pSeqList->Size - 1;
	size_t iMid = 0;
	if(NULL == pSeqList)
	{
		return -1;
	}
	while(iLeft <= iRight)
	{
		iMid = iLeft + (iRight-iLeft)/2;//使用iMid = (iLeft+iRight)/2会有整数溢出的问题
		if(pSeqList->arry[iMid] == data)
		{
			return iMid;
		}
		else if(pSeqList->arry[iMid] < data)
		{
			iLeft = iMid + 1;
		}
		else if(pSeqList->arry[iMid] > data)
		{
			iRight = iMid - 1;
		}
	}
	return -1;
}


你可能感兴趣的:(C语言,顺序表)