静态顺序表实现增删改查的所有代码~
#pragma once
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
typedef int DataType;
#define MAX_SIZE (100)
typedef struct SeqList {
DataType array[MAX_SIZE]; // 存数据的空间
int size; // 1) 有效数据有多少个 2) 当前可用的数组下标
} SeqList;
// 初始化
void SeqListInit(SeqList *pSL)
{
// 内容初始化(不必要)
// size = 0
assert(pSL != NULL);
//memset(pSL->array, 0, MAX_SIZE * sizeof(DataType));
pSL->size = 0;
}
// 销毁
void SeqListDestroy(SeqList *pSL)
{
assert(pSL != NULL);
pSL->size = 0;
}
// 尾插
void SeqListPushBack(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
assert(pSL->size < MAX_SIZE);
pSL->array[pSL->size] = data;
pSL->size++;
}
// 头插
void SeqListPushFront(SeqList *pSL, DataType data)
{
assert(pSL != NULL);
assert(pSL->size < MAX_SIZE);
//将已有数据往后搬移一格
// 1. 以条件写循环
#if 0
// 1.1 以要搬移的数做循环的指示
int pos;
for (pos = pSL->size - 1; pos >= 0; pos--) {
pSL->array[pos + 1] = pSL->array[pos];
}
#endif
#if 0
// 1.2 以要搬到的位置做循环的指示
int space;
for (space = pSL->size; space > 0; space--) {
pSL->array[space] = pSL->array[space - 1];
}
#endif
#if 3
// 2. 以循环次数做指示
int i;
for (i = 0; i < pSL->size; i++) {
// 关键把计数的 i 转成 数 和 位置的下标
pSL->array[pSL->size - i] = pSL->array[pSL->size - 1 - i];
}
#endif
pSL->array[0] = data;
pSL->size++;
}
// 根据下标插入
void SeqListInsert(SeqList *pSL, int pos, DataType data)
{
assert(pSL != NULL);
assert(pSL->size < MAX_SIZE);
assert(pos >= 0 && pos <= pSL->size);
// 把 [pos, size) 数据往后搬一格
int space;
for (space = pSL->size; space > pos; space--) {
pSL->array[space] = pSL->array[space - 1];
}
pSL->array[pos] = data;
pSL->size++;
}
// 尾删
void SeqListPopBack(SeqList *pSL)
{
assert(pSL != NULL);
assert(pSL->size > 0);
pSL->size--;
}
// 头删
void SeqListPopFront(SeqList *pSL)
{
assert(pSL != NULL);
assert(pSL->size > 0);
// 把 [1, pSL->size) 的数据往前搬移一格
int pos;
for (pos = 1; pos < pSL->size; pos++) {
pSL->array[pos - 1] = pSL->array[pos];
}
pSL->size--;
}
// 根据下标删除
void SeqListErase(SeqList *pSL, int pos)
{
assert(pSL != NULL);
assert(pSL->size > 0);
assert(pos >= 0 && pos < pSL->size);
#if 0
// 以 要搬运到的位置下标作为循环指示
int space; // 要搬运到的位置下标
for (space = pos; space < pSL->size - 1; space++) {
pSL->array[space] = pSL->array[space + 1];
}
#endif
#if 1
// 以 要搬运的数据下标作为循#环指示
int p; // 要搬运的数据下标
for (p = pos + 1; p < pSL->size; p++) {
pSL->array[p - 1] = pSL->array[p];
}
#endif
pSL->size--;
}
// 根据数据删除,只删除遇到的第一个
void SeqListRemove(SeqList *pSL, DataType data)
{
int pos = SeqListFind(pSL, data);
if (pos != -1) {
// 如果找到了
SeqListErase(pSL, pos);
}
}
// 根据数据删除,删除所有遇到的
void SeqListRemoveAll(SeqList *pSL, DataType data)
{
#if 0 // 为啥不好,时间复杂度 #
int pos;
#if 0
while (1) {
pos = SeqListFind(pSL, data);
if (pos == -1) {
break;
}
SeqListErase(pSL, pos);
}
#endif
while ((pos = SeqListFind(pSL, data)) != -1) {
SeqListErase(pSL, pos);
}
/*
while (size) {
while (size) {
}
}
*/
#endif
#if 0
DataType *newArray = (DataType *)malloc(sizeof(DataType)* pSL->size);
assert(newArray);
int i, j, k;
for (i = 0, j = 0; i < pSL->size; i++) {
if (pSL->array[i] != data) {
newArray[j] = pSL->array[i];
j++;
}
}
pSL->size = j;
// 把数据从 newArray 放回到 array
for (k = 0; k < pSL->size; k++) {
pSL->array[k] = newArray[k];
}
free(newArray);
#endif
int i, j;
for (i = 0, j = 0; i < pSL->size; i++) {
if (pSL->array[i] != data) {
pSL->array[j] = pSL->array[i];
j++;
}
}
pSL->size = j;
}
// 根据下标更新
void SeqListUpdate(SeqList *pSL, int pos, DataType data)
{
assert(pSL != 0);
assert(pos >= 0 && pos < pSL->size);
pSL->array[pos] = data;
}
// 查询
// 返回遇到的第一个下标,如果没有遇到,返回 -1
int SeqListFind(SeqList *pSL, DataType data)
{
assert(pSL != 0);
int i;
for (i = 0; i < pSL->size; i++) {
if (pSL->array[i] == data) {
return i;
}
}
// 没找到
return -1;
}
void Swap(DataType *a, DataType *b)
{
DataType t = *a;
*a = *b;
*b = t;
}
void SelectOP(SeqList *pSL)
{
/*
minSpace 用来放找到的最小的数的下标
maxSpace 用来放找到的最大的数的下标
minIndex 整个数列中([minSpace,maxSpace])找到的最小数的下标
maxIndex 整个数列中([minSpace,maxSpace])找到的最大数的下标
*/
int minSpace = 0;
int maxSpace = pSL->size - 1;
int i;
int minIndex, maxIndex;
while (minSpace < maxSpace) {
minIndex = minSpace;
maxIndex = minSpace;
for (i = minSpace; i <= maxSpace; i++) {
// 遍历 [minSpace, maxSpace],找到最小数的下标,找到最大数的下标
if (pSL->array[i] < pSL->array[minIndex]) {
minIndex = i;
}
if (pSL->array[i] > pSL->array[maxIndex]) {
maxIndex = i;
}
}
// 到这里后,minIndex 就是找到的最小数的下标
// 到这里后,maxIndex 就是找到的最大数的下标
Swap(pSL->array + minIndex, pSL->array + minSpace);
if (minSpace == maxIndex) {
// 特殊情况处理,例如 9 1 7 3 2
maxIndex = minIndex;
}
Swap(pSL->array + maxIndex, pSL->array + maxSpace);
minSpace++;
maxSpace--;
}
}
void SeqListPrint(SeqList *pSL)
{
int i;
for (i = 0; i < pSL->size; i++) {
printf("%d ", pSL->array[i]);
}
printf("\n");
}
void TestSeqList()
{
SeqList sl;
SeqListInit(&sl);
SeqListPushBack(&sl, 1);
SeqListPushBack(&sl, 2);
SeqListPushBack(&sl, 3);
SeqListPushBack(&sl, 3);
SeqListPushBack(&sl, 3);
SeqListPushBack(&sl, 4);
SeqListPushBack(&sl, 3);
SeqListRemoveAll(&sl, 3);
SeqListPrint(&sl);
/*SeqListPrint(&sl);
SeqListDestroy(&sl);*/
}
动态顺序增删改查的所有代码~
#pragma once
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#define CAPACITY (2)
typedef int DataType;
typedef struct SeqListDynamic {
DataType *array;
int capacity;
int size;
}SeqListD;
//初始化
void SeqListDInit(SeqListD *pSLD)
{
assert(pSLD != NULL);
pSLD->capacity = CAPACITY;
pSLD->size = 0;
pSLD->array = (DataType *)malloc(pSLD->capacity * sizeof(DataType));//堆上
assert(pSLD->array != NULL);
}
//销毁
void SeqListDDestroy(SeqListD * pSLD)
{
assert(pSLD != NULL);
pSLD->size = 0;
//关键步骤
free(pSLD->array);
pSLD->capacity = 0;
}
void ExpandifRequired(SeqListD *pSLD)
{
if (pSLD->size < pSLD->capacity)
{
return;
}
//肯定空间不够
//1.容量变大
//2.开辟空间
//3.将老数据写进新空间
//4.释放老空间
//5.将新空间挂起
//realloc
//伙伴算法
pSLD->capacity *= 2;
DataType *NewArray = (DataType *)malloc(sizeof(DataType)*pSLD->capacity);
int i;
for (i = 0; i < pSLD->size; i++)
{
NewArray[i] = pSLD->array[i];
}
free(pSLD->array);
pSLD->array = NewArray;
}
void SeqListDPushBack(SeqListD *pSLD, DataType data)
{
assert(pSLD != NULL);
//这是静态的处理过程
//assert(pSLD->size<pSLD->capacity)
//函数自己去判断,有必要就扩容
ExpandifRequired(pSLD);
//到这里就是容量肯定够了
pSLD->array[pSLD->size++] = data;
}
//头插
void SeqListDPushFront(SeqListD *pSLD, DataType data)
{
assert(pSLD != NULL);
ExpandifRequired(pSLD);
int space;
for (space = pSLD->size; space > 0; space--)
{
pSLD->array[space]=pSLD->array[space - 1];
}
pSLD->array[space]= data;
pSLD->size++;
}
void charu(SeqListD *pSLD, int pos, DataType data)
{
int space;
for (space = pSLD->size; space > pos; space--)
{
pSLD->array[space] = pSLD->array[space - 1];
}
pSLD->array[pos] = data;
pSLD->size++;
}
//按下标插
void SeqListDInsert(SeqListD *pSLD,int pos, DataType data)
{
assert(pSLD != NULL);
assert(pos >= 0 && pos <= pSLD->size);
ExpandifRequired(pSLD);
charu(pSLD,pos,data);
/*int space;
for (space = pSLD->size; space > pos; space--)
{
pSLD->array[space] = pSLD->array[space - 1];
}
pSLD->array[pos]=data;
pSLD->size++;*/
}
//打印
void SeqListDPrint(SeqListD *pSLD)
{
int i;
for (i = 0; i < pSLD->size; i++)
{
printf("%d ", pSLD->array[i]);
}
}
void TestSeqListD()
{
SeqListD sld;
SeqListDInit(&sld);//初始化
SeqListDPushBack(&sld,2);//尾插
SeqListDPushBack(&sld, 3);
SeqListDPushBack(&sld, 4);
SeqListDPushFront(&sld, 12);//头插
SeqListDInsert(&sld, 13, 2);//下标插
SeqListDPrint(&sld);
SeqListDDestroy(&sld);//销毁
}