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