顺序表(动态内存实现增删查改)

1:简介

在学习数据结构中不少人第一次遇到的就是顺序表,那么什么是顺序表呢。顺序表的优缺点,怎么样实现动态内存的增删查改,接下里我和大家一起了解这些问题。顺序表的底层其实就是数组,只不过他比数组更加灵活,可以自由的增加长度和删减长度,试想一下,如果我们需要创建一个通讯录,如果只用数组的话,每一次里面的人员表满了之后我们就要去改一次数组的大小,会非常的麻烦,顺序表就很好的结局了这样一个问题。

2:顺序表的优点

优点一:访问命中率高。在计算机的世界里面他的运算速度是由cpu到到内存的这样一个等级划分,你创建一个数组去循环,如果他每一次都需要去内存中找这个数的地址,这样就会大大影响我们的运算速度。那么其实cpu每一次去访问内存的时候不是一次只拿一个数据,而是有一个预加载,每一次都是拿一段,其他不用的数据就放在了缓冲区,那么下一次区找另一个数的时候就不需要再去内存里面拿而是直接去缓冲区里面。

 优点二:随机访问

3:顺序表的缺点

顺序表在中间头部插入删除的速度很慢,因为他每一次删除都需要把后面一个数往前面挪一个位置,插入同理,所以顺序表多数作用域尾插。

空间不够时,增容会产生空间的浪费,因为顺序表增容一般都是按照*2的方式来经行增容,如果我只有1000个元素但需要1001个元素的时候也会增容2倍,就会产生大量的浪费。

4:顺序表的实现

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDateType;
typedef struct SeqList
{
	SLDateType* a;
	SLDateType size;
	SLDateType capacity;
}SeqList;

//尾插
void SeqListpushBack(SeqList* ps, SLDateType x);

//尾删
void SeqListpopBack(SeqList* ps);

//头插
void SeqListpushFront(SeqList* ps, SLDateType x);

//头删
void SeqListpopFront(SeqList* ps);

//初始化
void SeqListInit(SeqList* ps);

//打印
void SeqListPrint(SeqList ps);

//查找
int SeqListFind(SeqList* ps, SLDateType x);

//指定位置插入数据
void SeqListInsert(SeqList* ps, int pos, SLDateType x);

//指定位置删除
void SeqListErase(SeqList* ps, int pos);

//修改
void SeqListChange(SeqList* ps, int pos);

//销毁数组
void SeqListDisPosal(SeqList* ps);


#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
//当size等于capaci是扩容空间
void SeqListADDMemset(SeqList* ps)
{
	SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * ps->capacity * 2);
	if (tmp == NULL)
	{
		perror("realloc:\n");
		return;
	}
	ps->a = tmp;
	ps->capacity *= 2;
}
//打印顺序表中的内容
void SeqListPrint(SeqList ps)
{
	for (int i = 0; i < ps.size; i++)
	{
		printf("%d ", ps .a[i]);
	}
	printf("\n");
}
//初始化顺序表
void SeqListInit(SeqList* ps)
{
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
	if (ps->a==NULL)
	{
		perror("malloc:\n");
		return;
	}
	ps->size = 0;
	ps->capacity = 4;
}

//头部插入数据
void SeqListpushFront(SeqList* ps,SLDateType x)
{
	for (int i = ps->size; i>=0; i--)
	{
		if (ps->size == ps->capacity)
			SeqListADDMemset(ps);
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[0] = x;
	ps->size++;
}

//尾部插入数据
void SeqListpushBack(SeqList* ps, SLDateType x)
{
	if (ps->size == ps->capacity)
		SeqListADDMemset(ps);
	ps->a[ps->size] = x;
	ps->size++;
}

//头部删除数据
void SeqListpopFront(SeqList* ps)
{
	assert(ps->size!=0);
	//for (int i = 0; i < ps->size; i++)
	//{
	//	ps->a[i] = ps->a[i + 1];
	//}
	//ps->size--;
	SeqListErase(ps, 0);
}

//尾部删除数据
void SeqListpopBack(SeqList* ps)
{
	assert(ps->size != 0);
	ps->size--;
}

//查找某个元素
int SeqListFind(SeqList* ps, SLDateType x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			return i;
	}
}

//在某个位置插入某个数
void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
	
	for (int i = ps->size; i >=pos; i--)
	{
		if (ps->size == ps->capacity)
			SeqListADDMemset(ps);
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[pos] = x;
	ps->size++;
}


//指定位置删除
void SeqListErase(SeqList* ps, int pos)
{
	for (int i = pos; i < ps->size; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

//修改某个数
void SeqListChange(SeqList* ps, int pos)
{
	assert(ps->size);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == pos)
		{
			ps->a[i] = 6;
			break;
		}
	}
}

void SeqListDisPosal(SeqList* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}


#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

SeqList s;
void test()
{
	//尾插测试
	SeqListInit(&s);
	int x = 0;
	//SeqListpushBack(&s, 4);
	//SeqListpushBack(&s, 3);
	//SeqListpushBack(&s, 2);
	//SeqListpushBack(&s, 1);
	//SeqListPrint(s);
	// 


	//头插测试
	SeqListpushFront(&s,5);
	SeqListpushFront(&s,4);
	SeqListpushFront(&s,3);
	SeqListpushFront(&s,2);
	SeqListpushFront(&s,1);
	SeqListPrint(s);

	//头删测试
	//SeqListpopFront(&s);
	//SeqListpopFront(&s);
	//SeqListPrint(s);

	//尾删测试
	//SeqListpopBack(&s);
	//SeqListpopBack(&s);
	//SeqListpopBack(&s);
	//SeqListPrint(s);

}
void test1()
{
	int x = 0;
	int pos1 = 0;
	printf("请输入删除的位置\n");
	scanf("%d", &pos1);
	SeqListErase(&s, pos1);
	SeqListPrint(s);

	printf("请输入需要插入的位置和插入的数\n");
	int pos = 0;
	scanf("%d %d", &pos, &x);
	SeqListInsert(&s, pos, x);
	SeqListPrint(s);

	printf("请输入查找的数\n");
	scanf("%d", &x);
	int ret = SeqListFind(&s,x);
	printf("找到了下标是%d\n", ret);
	SeqListPrint(s);
	printf("\n");

	printf("请输入需要修改的数\n");
	int n = 0;
	scanf("%d", &n);
	SeqListChange(&s, n);
	SeqListPrint(s);
	printf("\n");
}
int main()
{
	test();
	test1();
	SeqListDisPosal(&s);

	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值