C语言 顺序表的增删查改基本功能的实现

顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储。
  2. 动态顺序表:使用动态开辟的数组存储。
// 顺序表的静态存储
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
 SLDataType array[N]; // 定长数组
 size_t size; // 有效数据的个数
}SeqList;



// 顺序表的动态存储
typedef struct SeqList
{
 SLDataType* array; // 指向动态开辟的数组
 size_t size ; // 有效数据个数
 size_t capicity ; // 容量空间的大小
}

在这里插入图片描述
由于静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表

下面是动态的顺序表各功能实现

尽量使用多文件的编辑方式,代码易读却便于修改和调试

头文件

//#pragma once
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;//这样数据类型可以方便更改
typedef struct SeqList
{
	SLDataType* arr;//指向动态开辟的数组
	size_t size;//有效数据个数
	size_t capicity;//容量空间的大小
}SeqList;
//typedef struct SeqList 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);//尾删
int SeqListFind(SeqList* psl, SLDataType x);//查找
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);//pos位置插入
void SeqListErase(SeqList* psl, size_t pos);//pos位置删除

void SeqListRemove(SeqList* psl, SLDataType x);//删除一个x这个数字
void SeqListRemoveALL(SeqList* psl, SLDataType x);//删除所有x这个数字


void SeqListModify(SeqList* psl, size_t pos, SLDataType x);//pos位置的数据修改成x的值

void SeqListPrint(SeqList* psl);//打印输出

#endif

函数功能实现

#include"Seqlist.h"

void SeqListInit(SeqList* psl)//初始化
{
	psl->arr = (SeqList*)malloc(sizeof(SLDataType)*capacity);
	psl->arr=NULL;
	psl->size = 0;
	psl->capicity = capacity;
}
void SeqListDestory(SeqList* psl)//销毁
{
	assert(psl);
	free(psl->arr);
	psl->arr = NULL;
	psl->size = 0;
	psl->capicity = 0;
}
void CheckCapacity(SeqList* psl)//检查空间大小
{
	assert(psl);
	if (psl->size == psl->capicity)
	{
		SLDataType* new_psl_arr = (SLDataType*)malloc(sizeof(SLDataType)*psl->capicity * 2);
		assert(new_psl_arr);
		//free(psl->arr);//释放旧空间
		for (size_t i = 0; i < psl->size; i++)
		{
			new_psl_arr[i] = psl->arr[i];
		}
		psl->capicity = psl->capicity * 2;
	}
}
void SeqListPushBack(SeqList* psl, SLDataType x)//尾插
{
	assert(psl);
	CheckCapacity(psl);
	psl->arr[psl->size] = x;
	psl->size++;
}
void SeqListPopBack(SeqList* psl)//尾删
{
	assert(psl);
	//CheckCapacity(psl);
	//psl->arr[psl->size] = 0;
	psl->size--;
}
void SeqListPushFront(SeqList* psl, SLDataType x)//头插
//最后一位先移位,避免重叠
{
	assert(psl);
	CheckCapacity(psl);
	for (size_t i = psl->size; i > 0;i--)
	{
		psl->arr[i] = psl->arr[i-1];
	}
	psl->arr[0] = x;
	psl->size++;
}
void SeqListPopFront(SeqList* psl)//头删
{
	assert(psl);
	for (size_t i = 0; i < psl->size; i++)
	{
		psl->arr[i] = psl->arr[i + 1];
	}
	psl->size--;

}

int SeqListFind(SeqList* psl, SLDataType x)//查找
{
	assert(psl);
	for (size_t i = 0; i < psl->size; i++)
	{
		if (psl->arr[i] == x)
		{
			printf("%d", i);
		}
	}
	return -1;

}

void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)//pos位置插入
//最后一位先移位
{
	assert(psl&&pos<=psl->size);
	CheckCapacity(psl);
	for (size_t i = psl->size; i >pos; i--)
	{
		psl->arr[i] = psl->arr[i-1];
	}
	psl->arr[pos] = x;
	psl->size++;
}
void SeqListErase(SeqList* psl, size_t pos)//pos位置删除
{
	assert(psl&& pos<psl->size);
	for (size_t i =pos; i<psl->size; i++)
	{
		psl->arr[i] = psl->arr[i+1];
	}
	psl->size--;


}

void SeqListRemove(SeqList* psl, SLDataType x)//删除指定x这个数字
{
	assert(psl);
	for (size_t i = 0; i < psl->size; i++)
	{
		if (psl->arr[i] == x)
		{
			SeqListErase(psl, i);
		}
	}

}
void SeqListRemoveALL(SeqList* psl, SLDataType x)//删除所有x这个数字
{
	assert(psl);
	for (size_t i = 0; i < psl->size; i++)
	{
		if (psl->arr[i] == x)
		{
			SeqListErase(psl, i);
			i--;
		}

	}

}
void SeqListModify(SeqList* psl, size_t pos, SLDataType x)//pos位置的数据修改成x的值
{
	assert(psl&&pos < psl->size);
	psl->arr[pos] = x;

}
void SeqListPrint(SeqList* psl)
{
	assert(psl);
	size_t i = 0;
	for (i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->arr[i]);
	}
	printf("\n");
}

测试功能
把功能放到单个接口里,方便测试不同功能

#include"Seqlist.h"


void test()
{
	SeqList psl;
	SeqListInit(&psl, 5);//初始化

	
	SeqListPushBack(&psl, 0);//尾插
	SeqListPushBack(&psl, 1);
	SeqListPushBack(&psl, 2);
	SeqListPushBack(&psl, 3);
	SeqListPushBack(&psl, 4);
	SeqListPushBack(&psl, 5);

	SeqListPopBack(&psl);//尾删
	SeqListPopBack(&psl);
	SeqListPopBack(&psl);

	SeqListPrint(&psl);

}
void test2()
{
	SeqList psl;
	SeqListInit(&psl, 5);//初始化


	SeqListPushBack(&psl, 0);//尾插
	SeqListPushBack(&psl, 1);
	SeqListPushBack(&psl, 2);
	SeqListPushBack(&psl, 3);
	SeqListPushBack(&psl, 4);
	SeqListPushBack(&psl, 5);

	SeqListPushFront(&psl, 2);//头插
	//SeqListPopFront(&psl);//头删

	SeqListPrint(&psl);
	
}
void test3()
{
	SeqList psl;
	SeqListInit(&psl, 5);//初始化


	SeqListPushBack(&psl, 0);//尾插
	SeqListPushBack(&psl, 1);
	SeqListPushBack(&psl, 2);
	SeqListPushBack(&psl, 3);
	SeqListPushBack(&psl, 4);
	SeqListPushBack(&psl, 5);

	//SeqListFind(&psl, 4);//查找
	SeqListPrint(&psl);
	SeqListInsert(&psl, 3, 10);//pos位置插入
	SeqListPrint(&psl);

	SeqListErase(&psl, 3);//pos位置删除
	SeqListPrint(&psl); 

	SeqListRemove(&psl, 10);//删除x这个数字
	SeqListPrint(&psl);
	
}
void test4()
{
	SeqList psl;
	SeqListInit(&psl, 5);//初始化


	SeqListPushBack(&psl, 0);//尾插
	SeqListPushBack(&psl, 1);
	SeqListPushBack(&psl, 2);
	SeqListPushBack(&psl, 3);
	SeqListPushBack(&psl, 3);
	SeqListPushBack(&psl, 5);
	SeqListPrint(&psl);


	//SeqListModify(&psl, 3, 10);//pos位置的数据修改成x的值
	//SeqListPrint(&psl);
	SeqListRemoveALL(&psl, 3);
	SeqListPrint(&psl);

}
int main()
{
	test4();
	return 0;
}
发布了29 篇原创文章 · 获赞 8 · 访问量 2002

猜你喜欢

转载自blog.csdn.net/qq_44785014/article/details/103526731