数据结构----增删改查(静态顺序表、动态顺序表)

静态顺序表实现增删改查的所有代码~

#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);//销毁
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值