头文件Seqlist.h 包含了顺序表的增删查改以及冒泡排序和二分法及一些简单功能实现
#pragma once
#include <stdlib.h>
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* array; // 指向动态开辟的数组
size_t size; // 有效数据个数
size_t capicity; // 容量空间的大小
}SeqList;
// 基本增删查改接口
//初始化
void SeqListInit(SeqList* psl, size_t capacity);
//销毁
void SeqListDestory(SeqList* psl);
//扩容
void CheckCapacity(SeqList* psl);
//尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
//尾删
void SeqListPopBack(SeqList* psl);
//头插
void SeqListPushFront(SeqList* psl, SLDataType x);
//头删
void SeqListPopFront(SeqList* psl);
//查找
//没有找到返回-1
int SeqListFind(SeqList* psl, SLDataType x);
//在pos所在的下标做数据插入
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
//删除pos对应数据
void SeqListErase(SeqList* psl, size_t pos);
//删除第一个x
void SeqListRemove(SeqList* psl, SLDataType x);
//修改pos下标的数据为x
void SeqListModify(SeqList* psl, size_t pos, SLDataType x);
void SeqListPrint(SeqList* psl);
//冒泡排序
void SeqListBubbleSort(SeqList* psl);
//二分查找(数据有序)
int SeqListBinaryFind(SeqList* psl, SLDataType x);
//删除所有遇到的x
void SeqListRemoveAll(SeqList* psl, SLDataType x);
Seqlist.c 这是对头文件Seqlist.h中函数声明的定义
#include "Seqlist.h"
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
void SeqListInit(SeqList* psl, size_t capacity)
{
assert(psl != NULL);
psl->array = (SLDataType *)malloc(capacity* sizeof(SLDataType));
psl->size = 0;
psl->capicity = capacity;
}
void SeqListDestory(SeqList* psl)
{
assert(psl != NULL);
free(psl->array);
psl->array = NULL;
psl->capicity = 0;
psl->size = 0;
}
void CheckCapacity(SeqList* psl)
{
assert(psl);
if (psl->size<psl->capicity)
{
return;
}
int newcapicity = 2 * psl->capicity;
SLDataType * newarray = (SLDataType*)malloc(newcapicity*sizeof(SeqList));
assert(newarray);
for (size_t i = 0; i < psl->size; i++)
{
newarray[i] = psl->array[i];
}
free(psl->array);
assert(psl->array == NULL);
psl->array = newarray;
psl->capicity = newcapicity;
}
void SeqListPushBack(SeqList* psl, SLDataType x)
{
assert(psl);
CheckCapacity(psl);
psl->array[psl->size]=x;
psl->size++;
}
void SeqListPopBack(SeqList* psl)
{
assert(psl);
if (psl->size<1)
{
return;
}
psl->size--;
}
void SeqListPushFront(SeqList* psl, SLDataType x)
{
assert(psl);
for (size_t i = psl->size; i >0; i++)
{
psl->array[psl->size] = psl->array[psl->size - 1];
}
psl->size++;
psl->array[0] = x;
}
void SeqListPopFront(SeqList* psl)
{
assert(psl);
assert(psl->size > 0);
for (size_t i = 0; i <psl->size-1; i++)
{
psl->array[i] = psl->array[i + 1];
}
psl->size--;
}
int SeqListFind(SeqList* psl, SLDataType x)
{
assert(psl);
for (size_t i = 0; i < psl->size; i++)
{
if (psl->array[i] == x)
{
return i;
}
}
return -1;
}
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
assert(psl);
CheckCapacity(psl);
assert(pos >= 0 && pos <= psl->size);
for (int i = psl->size; i>(int)pos ; i--)
{
psl->array[i] = psl->array[i - 1];
}
psl->size++;
psl->array[pos] = x;
}
void SeqListErase(SeqList* psl, size_t pos)
{
assert(psl);
assert(psl->size > 0);
assert(pos >= 0 && pos <= psl->size);
for (size_t i = pos; i < psl->size-1; i++)
{
psl->array[i] = psl->array[i + 1];
}
psl->size--;
}
void SeqListRemove(SeqList* psl, SLDataType x)
{
assert(psl);
for (size_t i = 0; i < psl->size; i++)
{
if (x == psl->array[i])
{
SeqListErase(psl, i);
break;
}
}
}
1
void SeqListModify(SeqList* psl, size_t pos, SLDataType x)
{
assert(psl);
assert(pos >= 0 && pos < psl->size);
psl->array[pos] = x;
}
void SeqListPrint(SeqList* psl)
{
for (size_t i = 0; i < psl->size; i++)
{
printf("%d ", psl->array[i]);
}
printf("\n");
}
void SeqListBubbleSort(SeqList* psl)
{
assert(psl);
for (size_t i = 0; i < psl->size -1; i++)
{
int flag =0;
for (size_t j = 0; j < psl->size - 1 - i; j++)
{
if (psl->array[j] >= psl->array[j + 1])
{
int temp = psl->array[j];
psl->array[j] = psl->array[j + 1];
psl->array[j + 1] = temp;
flag = 1;
}
}
if (flag==0)
{
return;
}
}
}
int SeqListBinaryFind(SeqList* psl, SLDataType x)
{
SeqListBubbleSort(psl);
int left = 0;
int right = psl->size ;
while (left>right)
{
int mid = left+(right-left) / 2;
if (x == psl->array[mid] )
{
return mid ;
}
else if (x < psl->array[mid])
{
right = mid;
}
else
{
left = mid+1;
}
}
return -1;
}
void SeqListRemoveAll(SeqList* psl, SLDataType x)
{
assert(psl);
int j = 0;
for (size_t i = 0; i < psl->size; i++)
{
if (x != psl->array[i])
{
//psl->array[j++] = psl->array[i];
psl->array[j] = psl->array[i];
j++;
}
}
psl->size = j;
}
简单的不全的测试代码
#include "SeqList.h"
#include <stdlib.h>
void TestSeqList()
{
SeqList seqlist;
SeqListInit(&seqlist,5);
SeqListPushBack(&seqlist, 1);
SeqListPushBack(&seqlist, 2);
SeqListPushBack(&seqlist, 2);
SeqListPushBack(&seqlist, 3);
SeqListPushBack(&seqlist, 2);
SeqListPrint(&seqlist);
SeqListRemoveAll(&seqlist, 2);
SeqListPrint(&seqlist);
SeqListDestory(&seqlist);
}
int main()
{
TestSeqList();
system("pause");
return 0;
}