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;
}