数据结构_顺序表基本操作代码

 

✨✨所属专栏:数据结构✨✨

✨✨作者主页:嶔某✨✨

概念:

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表的本质就是数组,动态增长,并且要求里面存储的数据必须是从左往右连续的。逻辑结构与物理结构是一致的。

它分为静态顺序表(容量不可修改)和动态顺序表(可修改容量,可任意增删查改数据)

SeqList.h

定义顺序表,声明函数。这里size表示有效数据,capacity表示可用空间大小,data是存储数据的指针(可以看作一个数组)。

#pragma once
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>

typedef int SQDataType;

typedef struct SeqList
{
	SQDataType* data;
	int size;
	int capacity;
}SLT;

void SeqListPrint(SLT* ps);//打印
void SeqListInit(SLT* ps);//初始化
void SeqListDistory(SLT* ps);//销毁
void SeqListCheckCapacity(SLT* ps);//扩容
void SeqListPushBack(SLT* ps, SQDataType x);//尾插
void SeqListPushFront(SLT* ps, SQDataType x);//头插
void SeqListPopBack(SLT* ps);//尾删
void SeqListPopFront(SLT* ps);//头删
void SeqListInsert(SLT* ps, int pos, SQDataType x);//指定插入
void SeqListErase(SLT* ps, int pos);//指定删除
int SeqListFind(SLT* ps, SQDataType x);//查找(返回下标)
void SeqListModity(SLT* ps,int pos,SQDataType x);//修改

这里我们介绍十二种接口。

初始化:

void SeqListInit(SLT* ps)
{
	assert(ps);//保证ps不为空
	//memset(ps->data, 0, sizeof(SQDataType) * 4);
	ps->data = NULL;
	ps->size = ps->capacity = 0;
}

把data置为空,size,capacity置为0,进行初始化。

打印:

void SeqListPrint(SLT* ps)
{
	for (int i = 0; i < ps->size; i++)
		printf("%d ", ps->data[i]);
	printf("\n");
}

打印就不过多讲了,记得换行。

销毁:

void SeqListDistory(SLT* ps)
{
	free(ps->data);
	ps->data = NULL;
	ps->capacity = ps->size = 0;
}

销毁就是把内存还给系统。直接free。

尾插:

void SeqListPushBack(SLT* ps, SQDataType x)
{
	SeqListCheckCapacity(ps);

	ps->data[ps->size] = x;
	ps->size++;
}

我们想插入一个数据,就先要判断空间是否足够。所以这里面就有了void SeqListCheckCapacity(SLT* ps);这个函数:

扩容:

void SeqListCheckCapacity(SLT* ps)
{
	if (ps->size == ps->capacity)//满了扩容
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SQDataType* tmp = realloc(ps->data, newcapacity * sizeof(SQDataType));
		if (tmp == NULL)
		{
			printf("realloc is fail!\n");
			exit(-1);
		}
		else
		{
			ps->data = tmp;
			ps->capacity = newcapacity;
		}
	}
}

如果有效数据个数和有效空间相等那么就把空间扩至二倍。这里用到了realloc函数。详情见:cplusplus.com/reference/cstdlib/realloc/icon-default.png?t=N7T8https://cplusplus.com/reference/cstdlib/realloc/

头插:

void SeqListPushFront(SLT* ps, SQDataType x)
{
	SeqListCheckCapacity(ps);

	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->data[end + 1] = ps->data[end];
		end--;
	}
	ps->data[0] = x;
	ps->size++;
}

有了前面的基础,后面就容易多了。头插也要先判断空间是否足够,之后把数据从前往后挪,把ps->data[0]的地方空出来,将x放进去。

尾删:

void SeqListPopBack(SLT* ps)
{
	assert(ps->size > 0);
	//ps->data[ps->size - 1] = 0;//有没有都无所谓,有效数据是用size来表示的
	ps->size--;
}

这里的简单方法就是把size--就行,尾数置不置零都无所谓,因为算的都是在size范围内的有效数据。

头删:

void SeqListPopFront(SLT* ps)
{
	assert(ps->size > 0);
	int start = 0;
	while (start <= ps->size)
	{
		ps->data[start] = ps->data[start + 1];
		start++;
	}
	ps->size--;
}

这里直接从前往后挪,把第一个数据覆盖掉就行,然后size--。

指定插入:

void SeqListInsert(SLT* ps,int pos, SQDataType x)
{
	assert(pos <= ps->size);
	SeqListCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->data[end + 1] = ps->data[end];
		end--;
	}
	ps->data[pos - 1] = x;
	ps->size++;
}

同样只要是插入数据,就要判断空间是否足够。然后把数据依次往后挪将ps->data[pos-1]这个位置空出来,把x放进去。

指定删除:

void SeqListErase(SLT* ps, int pos) 
{
	assert(pos <= ps->size);
	int end = pos;
	while (end <= ps->size)
	{
		ps->data[end - 1] = ps->data[end];
		end++;
	}
	ps->size--;
}

采取同样的方法,将第pos位的数据覆盖,之后size--。

查找:

int SeqListFind(SLT* ps, SQDataType x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->data[i] == x)
			return i;
	}
	return -1;
}

这里暴力循环就好了,找到了就返回下标,否则返回-1,因为没有哪个数据的下标是-1的。

修改:

void SeqListModity(SLT* ps, int pos, SQDataType x)
{
	assert(pos < ps->size);
	ps->data[pos - 1] = x;
}

这里直接将第pos位(ps->data[pos-1])修改成x就行。搞腚!


完整代码附上:

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Seqlist.h"

void SeqListInit(SLT* ps)
{
	assert(ps);//保证ps不为空
	//memset(ps->data, 0, sizeof(SQDataType) * 4);
	ps->data = NULL;
	ps->size = ps->capacity = 0;
}

void SeqListDistory(SLT* ps)
{
	free(ps->data);
	ps->data = NULL;
	ps->capacity = ps->size = 0;
}

void SeqListPrint(SLT* ps)
{
	for (int i = 0; i < ps->size; i++)
		printf("%d ", ps->data[i]);
	printf("\n");
}

void SeqListCheckCapacity(SLT* ps)
{
	if (ps->size == ps->capacity)//满了扩容
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SQDataType* tmp = realloc(ps->data, newcapacity * sizeof(SQDataType));
		if (tmp == NULL)
		{
			printf("realloc is fail!\n");
			exit(-1);
		}
		else
		{
			ps->data = tmp;
			ps->capacity = newcapacity;
		}
	}
}

void SeqListPushBack(SLT* ps, SQDataType x)
{
	SeqListCheckCapacity(ps);

	ps->data[ps->size] = x;
	ps->size++;
}

void SeqListPushFront(SLT* ps, SQDataType x)
{
	SeqListCheckCapacity(ps);

	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->data[end + 1] = ps->data[end];
		end--;
	}
	ps->data[0] = x;
	ps->size++;
}

void SeqListPopBack(SLT* ps)
{
	assert(ps->size > 0);
	//ps->data[ps->size - 1] = 0;//有没有都无所谓,有效数据是用size来表示的
	ps->size--;
}

void SeqListPopFront(SLT* ps)
{
	assert(ps->size > 0);
	int start = 0;
	while (start <= ps->size)
	{
		ps->data[start] = ps->data[start + 1];
		start++;
	}
	ps->size--;
}

void SeqListInsert(SLT* ps,int pos, SQDataType x)
{
	assert(pos <= ps->size);
	SeqListCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->data[end + 1] = ps->data[end];
		end--;
	}
	ps->data[pos - 1] = x;
	ps->size++;
}

void SeqListErase(SLT* ps, int pos) 
{
	assert(pos <= ps->size);
	int end = pos;
	while (end <= ps->size)
	{
		ps->data[end - 1] = ps->data[end];
		end++;
	}
	ps->size--;
}

int SeqListFind(SLT* ps, SQDataType x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->data[i] == x)
			return i;
	}
	return -1;
}

void SeqListModity(SLT* ps, int pos, SQDataType x)
{
	assert(pos < ps->size);
	ps->data[pos - 1] = x;
}

本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
数据结构顺序基本操作代码包括插入、删除、查找和修改。以下是这些操作的示例代码: 1. 插入操作: ```python def insert(seq_list, index, data): if index < 0 or index > len(seq_list): return False seq_list.append(None) # 扩展顺序长度 for i in range(len(seq_list)-1, index, -1): seq_list[i = seq_list[i-1] seq_list[index = data return True ``` 2. 删除操作: ```python def delete(seq_list, index): if index < 0 or index >= len(seq_list): return False for i in range(index, len(seq_list)-1): seq_list[i = seq_list[i+1] seq_list.pop() # 缩小顺序长度 return True ``` 3. 查找操作: ```python def search(seq_list, data): for i in range(len(seq_list)): if seq_list[i == data: return i return -1 ``` 4. 修改操作: ```python def modify(seq_list, index, data): if index < 0 or index >= len(seq_list): return False seq_list[index = data return True ``` 这些基本操作可以帮助我们在顺序中插入、删除、查找和修改数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数据结构-顺序基本实现(C语言,简单易懂,含全部代码)](https://blog.csdn.net/qq_43460230/article/details/124160112)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嶔某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值