学习不易,需要坚持。
#pragma once
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDataType ;
typedef struct SeqList
{
SLDataType* array ;
int capacity ;
int size ;
}SeqList ;
//初始化&销毁
void SeqListInit(SeqList* sl, size_t capacity) ;
void SeqListDestroy(SeqList* sl) ;
//增删查改
//尾插
void SeqListPushBack(SeqList* sl, SLDataType data) ;
//头插
void SeqListPushFront(SeqList* sl, SLDataType data) ;
//尾删
void SeqListPopBack(SeqList* sl) ;
//头删
void SeqListPopFront(SeqList* sl) ;
//打印
void SeqListPrint(SeqList* sl) ;
//内部接口
void CheckCapacity(SeqList* sl) ;
//获取元素
void GetElem(SeqList* sl, int i, SLDataType* e) ;
//表中间插入操作
void SeqListInsert(SeqList* sl, size_t pos, SLDataType data) ;
//表中间删除操作
void SeqListDelete(SeqList* sl, size_t pos) ;
//在顺序表中查询元素
int SeqListFind(SeqList* sl, SLDataType data) ;
//删除遇到的指定的第一个元素
void SeqListRemove(SeqList* sl, SLDataType data) ;
//修改pos所在下标对应的元素
void SeqListModify(SeqList* sl, size_t pos, SLDataType data) ;
//删除遇到所有的指定元素
void SeqListRemoveAll(SeqList* sl, SLDataType data) ;
//冒泡排序
void SeqListBubbleSort(SeqList* sl) ;
//折半查找(二分查找)
int SeqListBinarySearch(SeqList* sl, SLDataType data) ;
//SeqList.c
#include "SeqList.h"
//初始化
void SeqListInit(SeqList* sl, size_t capacity)
{
sl->capacity = capacity ;
sl->size = 0 ;
sl->array = (SLDataType *) malloc (capacity * sizeof(SLDataType)) ;
assert(sl->array != NULL) ;
printf("初始化成功!元素个数为%d\n",sl->size) ;
}
//销毁
void SeqListDestroy(SeqList* sl)
{
assert(sl != NULL) ;
free(sl->array) ;
sl->array = NULL ; //防御性代码
sl->capacity = sl->size = 0 ;
printf("销毁成功!元素个数为%d\n",sl->size) ;
}
//尾插
void SeqListPushBack(SeqList* sl, SLDataType data)
{
assert(sl != NULL) ;
CheckCapacity(sl) ;
sl->array[sl->size] = data ;
sl->size++ ;
//printf("尾插成功!元素个数为%d\n",sl->size) ;
}
//尾删
void SeqListPopBack(SeqList* sl)
{
assert(sl != NULL) ;
if(sl->size == 0)
{
printf("此表本为空,无法删除!\n") ;
}
else
{
sl->size-- ;
printf("尾删成功!元素个数为%d\n",sl->size) ;
}
}
//头插
void SeqListPushFront(SeqList* sl, SLDataType data)
{
int i = 0 ;
assert(sl != NULL) ;
CheckCapacity(sl) ;
for(i=sl->size-1; i>=0; i--)
{
sl->array[i+1] = sl->array[i] ; /****************************/
}
sl->array[0] = data ;
sl->size++ ;
printf("头插成功!元素个数为%d\n",sl->size) ;
}
//打印
void SeqListPrint(SeqList* sl)
{
int i = 0 ;
for(i=0; i<sl->size; i++)
{
printf(" %d ", sl->array[i]) ;
}
printf("\n打印成功!元素个数为: %d\n",sl->size) ;
}
//内部接口
void CheckCapacity(SeqList* sl)
{
int i = 0 ;
//申请空间
int newCapacity = sl->capacity * 2 ;
SLDataType * newArray = (SLDataType*) malloc (newCapacity * sizeof(SLDataType)) ;
assert(newArray) ;
//搬运
//int i = 0 ;
for(i=0; i<sl->size; i++)
{
newArray[i] = sl->array[i] ;
}
//释放旧的空间
free(sl->array) ;
//再保存新的
sl->array = newArray ;
sl->capacity = newCapacity ;
}
//获得某位置的元素
void GetElem(SeqList* sl, int i, SLDataType* e)
{
//若表长为0,或者i不在正确的范围内,则提示操作错误
if(sl->size == 0 || i<1 || i>sl->size)
{
printf("获取操作失败!\n") ;
}
//若i的位置合法,则打印
else
{
*e = sl->array[i-1] ;
printf("获取成功,array[%d]为: %d\n", i-1,*e) ;
}
}
//表中间插入操作
void SeqListInsert(SeqList* sl, size_t pos, SLDataType data)
{
//i为数据下标
int i = 0 ;
assert(sl) ;
CheckCapacity(sl) ;
assert((int)pos >= 0 && (int)pos <= sl->size) ;
for(i=sl->size-1; i>=pos; i--)
{
sl->array[i+1] = sl->array[i] ;
}
sl->array[pos] = data ;
sl->size++ ;
}
//表中间删除操作
void SeqListDelete(SeqList* sl, size_t pos)
{
//i 为数据下标
int i = 0 ;
assert(sl) ;
assert((int)pos>=0 && (int)pos<=sl->size-1) ;
for(i=pos+1; i<sl->size; i++)
{
sl->array[i-1] = sl->array[i] ;
}
sl->size-- ;
}
//在顺序表中查询元素
int SeqListFind(SeqList* sl, SLDataType data)
{
//若在顺序表中找到该元素,则返回其下标,否则返回-1
int i = 0 ;
assert(sl != NULL) ;
for(i=0; i<sl->size; i++)
{
if(sl->array[i] == data)
{
return i ;
}
}
return -1 ;
}
//删除遇到的指定的第一个元素
void SeqListRemove(SeqList* sl, SLDataType data)
{
int pos = SeqListFind(sl, data) ;
if(pos != -1)
{
SeqListDelete(sl, pos) ;
}
}
//修改pos所在下标对应的元素
void SeqListModify(SeqList* sl, size_t pos, SLDataType data)
{
assert(sl != NULL) ;
assert((int)pos>=0 && (int)pos<=sl->size-1) ;
sl->array[pos] = data ;
}
//删除遇到所有的指定元素
void SeqListRemoveAll(SeqList* sl, SLDataType data)
{
int j = 0 ;
int i = 0 ;
for(i=0; i<sl->size; i++)
{
if(sl->array[i] != data)
{
sl->array[j++] = sl->array [i] ;
}
}
sl->size = j ;
}
//比较大小
static void Swap(int* a, int* b)
{
int tmp = *a ;
*a = *b ;
*b = tmp ;
}
//冒泡排序
void SeqListBubbleSort(SeqList* sl)
{
int i = 0 ;
int j = 0 ;
assert(sl != NULL) ;
for(i=0; i<sl->size-1; i++)
{
for(j=0; j<sl->size-1-i; j++)
{
if(sl->array[j] > sl->array[j+1])
{
Swap(sl->array+j, sl->array+j+1) ;//与 Swap(&sl->array[j],&sl->array[j+1])等价
}
}
}
}
//折半查找(二分查找)
int SeqListBinarySearch(SeqList* sl, SLDataType data)
{
//left和right均为下标,范围是[left, right] ,左闭右闭区间
int left = 0 ;
int right = sl->size-1 ;
int mid = 0 ;
while(left <= right)
{
mid = (right-left)/2 + left ;
if(data == sl->array[mid])
{
return mid ;
}
else if(data < sl->array[mid])
{
right = mid - 1 ;
}
else
{
left = mid+ 1 ;
}
}
return -1 ;
}
//main.c
#include "SeqList.h"
int main()
{
SeqList sl ;
SLDataType e ;
int BinarySearchRet = 0 ;
printf("----------顺序表的基本操作----------\n") ;
printf("\n初始化:\n") ;
SeqListInit(&sl, 10) ;
printf("\n尾插: \n") ;
SeqListPushBack(&sl, 1) ;
SeqListPushBack(&sl, 2) ;
SeqListPushBack(&sl, 3) ;
SeqListPushBack(&sl, 4) ;
SeqListPushBack(&sl, 5) ;
SeqListPushBack(&sl, 9) ;
SeqListPushBack(&sl, 5) ;
SeqListPushBack(&sl, 8) ;
SeqListPushBack(&sl, 5) ;
SeqListPushBack(&sl, 5) ;
SeqListPushBack(&sl, 5) ;
SeqListPrint(&sl) ;
printf("\n尾删: \n") ;
SeqListPopBack(&sl) ;
SeqListPrint(&sl) ;
printf("\n头插: \n") ;
SeqListPushFront(&sl, 10) ;
SeqListPrint(&sl) ;
printf("\n获取元素: \n") ;
GetElem(&sl, 1,&e) ;
printf("\n插入元素:\n") ;
SeqListInsert( &sl, 3, 99) ;
SeqListPrint(&sl) ;
printf("\n删除元素:\n") ;
SeqListDelete(&sl, 2) ;
SeqListPrint(&sl) ;
printf("\n删除遇到的第一个元素:\n") ;
SeqListRemove(&sl, 5) ;
SeqListPrint(&sl) ;
printf("\n修改指定位置的元素: \n") ;
SeqListModify(&sl, 3, 333) ;
SeqListPrint(&sl) ;
printf("\n删除遇到的指定的所有元素:\n") ;
SeqListRemoveAll(&sl, 5) ;
SeqListPrint(&sl) ;
printf("\n排序\n") ;
SeqListBubbleSort(&sl) ;
SeqListPrint(&sl) ;
printf("\n二分查找:\n") ;
BinarySearchRet = SeqListBinarySearch(&sl, 333) ;
printf("\n二分查找到的下标是:[%d]\n", BinarySearchRet) ;
printf("\n销毁:\n") ;
SeqListDestroy(&sl) ;
printf("\n") ;
return 0 ;
}
运行结果: