SeqList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define DEFAULT_SZ 10
#define DEFAULT_INC 10
typedef int DataType;
typedef struct SeqList
{
DataType *pData;//指向数据的存储位置
int sz;//有效个数
int capacity;//容量
}SeqList, *pSeqList;
void InitSeqList(pSeqList ps);//初始化
void CheckCapacity(pSeqList ps);//容量检测
void DestroySeqList(pSeqList ps);//销毁
void PushBack(pSeqList ps, DataType d);//尾部插入
void PopBack(pSeqList ps);//尾部删除
void PushFront(pSeqList ps, DataType d);//头部插入
void PopFront(pSeqList ps);//头部删除
void Insert(pSeqList ps, int pos, DataType d);//指定位置插入
int Find(pSeqList ps, DataType d);//查找
void Remove(pSeqList ps, DataType d);//删除最先出现的指定元素
void SortSeqList(pSeqList ps);//冒泡排序
void ReverseSeqList(pSeqList ps);//逆序
void BinarySearch(pSeqList ps, DataType d);//二分查找
void PrintSeqList(const pSeqList ps);//打印
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void InitSeqList(pSeqList ps)//初始化
{
ps->pData = (DataType *)calloc(DEFAULT_SZ, sizeof(DataType));
ps->sz = 0;
ps->capacity = DEFAULT_SZ;
}
void CheckCapacity(pSeqList ps)//容量检测
{
if(ps->sz == ps->capacity)
{
DataType *tmp = realloc(ps->pData, sizeof(DataType)+DEFAULT_INC);
if(tmp != NULL)
{
ps->pData = tmp;
ps->capacity += DEFAULT_INC;
printf("增容成功\n");
}
else
{
printf("%s\n", strerror(errno));
}
}
}
void DestroySeqList(pSeqList ps)//销毁
{
free(ps->pData);
ps->pData = NULL;
}
void PushBack(pSeqList ps, DataType d)//尾部插入
{
CheckCapacity(ps);
ps->pData[ps->sz] = d;
ps->sz++;
}
void PopBack(pSeqList ps)//尾部删除
{
if(ps->sz == 0)
{
printf("顺序表为空,无法删除\n");
return;
}
ps->sz--;
}
void PushFront(pSeqList ps, DataType d)//头部插入
{
int i = 0;
CheckCapacity(ps);
for(i=ps->sz; i>0; i--)
{
ps->pData[i] = ps->pData[i-1];
}
ps->pData[0] = d;
ps->sz++;
}
void PopFront(pSeqList ps)//头部删除
{
int i = 0;
for(i=0; i<ps->sz-1; i++)
{
ps->pData[i] = ps->pData[i+1];
}
ps->sz--;
}
void Insert(pSeqList ps, int pos, DataType d)//指定位置插入
{
int i = 0;
CheckCapacity(ps);
for(i=ps->sz; i>pos; i--)
{
ps->pData[i] = ps->pData[i-1];
}
ps->pData[pos] = d;
ps->sz++;
}
int Find(pSeqList ps, DataType d)//查找
{
int i = 0;
for(i=0; i<ps->sz; i++)
{
if(ps->pData[i] == d)
{
printf("pData[%d] = %d\n", i, d);
return i;
}
}
return -1;
}
void Remove(pSeqList ps, DataType d)//删除最先出现的指定元素
{
int ret = Find(ps, d);
if(ret != -1)
{
int i = 0;
for(i=ret; i<ps->sz-1; i++)
{
ps->pData[i] = ps->pData[i+1];
}
ps->sz--;
}
else
{
printf("无此元素\n");
}
}
void SortSeqList(pSeqList ps)//冒泡排序
{
int i = 0;
for(i=0; i<ps->sz; i++)
{
int j = 0;
DataType tmp = 0;
for(j=0; j<ps->sz-i-1; j++)
{
if(ps->pData[j] > ps->pData[j+1])
{
tmp = ps->pData[j];
ps->pData[j] = ps->pData[j+1];
ps->pData[j+1] = tmp;
}
}
}
}
void ReverseSeqList(pSeqList ps)//逆序
{
int left = 0;
int right = ps->sz-1;
DataType tmp = 0;
while(left<right)
{
tmp = ps->pData[left];
ps->pData[left] = ps->pData[right];
ps->pData[right] = tmp;
left++;
right--;
}
}
void BinarySearch(pSeqList ps, DataType d)//二分查找
{
int left = 0;
int right = ps->sz-1;
while(left <= right)
{
int mid = left + (right-left)/2;
if(d > ps->pData[mid])
{
left = mid + 1;
}
else if(d < ps->pData[mid])
{
right = mid -1;
}
else
{
printf("pData[%d] = %d\n", mid, d);
return;
}
}
if(left > right)
{
printf("没找到\n");
}
}
void PrintSeqList(const pSeqList ps)//打印
{
int i = 0;
assert(ps);
for(i=0; i<ps->sz; i++)
{
printf("%d ", ps->pData[i]);
}
printf("\n");
}
test.c
#include "SeqList.h"
void test()
{
SeqList seqlist;
InitSeqList(&seqlist);
PushBack(&seqlist, 1);
PushBack(&seqlist, 2);
PushBack(&seqlist, 3);
PopBack(&seqlist);
PrintSeqList(&seqlist);
PushFront(&seqlist, 0);
PushFront(&seqlist, -1);
PushFront(&seqlist, -2);
PopFront(&seqlist);
PrintSeqList(&seqlist);
Insert(&seqlist, 2, 10);
PrintSeqList(&seqlist);
Find(&seqlist, 2);
Remove(&seqlist, 10);
PrintSeqList(&seqlist);
ReverseSeqList(&seqlist);
PrintSeqList(&seqlist);
SortSeqList(&seqlist);
PrintSeqList(&seqlist);
BinarySearch(&seqlist, 2);
PrintSeqList(&seqlist);
DestroySeqList(&seqlist);//销毁
}
int main()
{
test();//测试代码
return 0;
}