C语言 数据结构入门----顺序表的实现cx_表中的cx是什么意思_张大彪cx的博客-程序员秘密

技术标签: 算法  老顶的实用程序  数据结构  

C语言实现顺序表的基础操作

所谓数据结构顺序表和链表的基本操作,实际上就是实现对一个顺序表(链表)的增删查改及其其他接口的实现。

顺序表线性结构存储示意图

在这里插入图片描述

C语言顺序表的基本操作

定义顺序表结构体

由长度和数据数组组成:

typedef int SeqDataType;//类型
typedef struct SeqList
{
    
	SeqDataType* a;
	int size;     //有效数据的个数
	int capacity; //容量
}SeqList,SEQ;
结构体初始化
//结构体初始化只能在定义的地方
void SeqListInit(SeqList* pq)//创
{
    
	assert(pq);//养成好习惯,断言
	pq->a = NULL;
	pq->size = pq->capacity = 0;
}

接口的列举(SepList.h)

#pragma once
#include <stdio.h>
#include<assert.h>
#include<stdlib.h>
//静态的顺序表
//#define N 100
//struct SeqList
//{
    
//	int a[N];
//	int size;
//};

typedef int SeqDataType;//类型
typedef struct SeqList
{
    
	SeqDataType* a;
	int size;     //有效数据的个数
	int capacity; //容量
}SeqList,SEQ;

//数据结构:内存中管理数据的结构增删查改的接口
//一般都包含
void SeqListInit(SeqList* pq);//初始化
void SeqListDestory(SeqList* pq);//销毁
void SeqListPrint(SeqList* pq);//打印
//四种最常用
void SeqListPushBack(SeqList* pq, SeqDataType x);//头插
void SeqListPushFront(SeqList* pq, SeqDataType x);//尾插
void SeqListPopBack(SeqList* pq);//尾删
void SeqListPopFront(SeqList* pq);//头删

int SeqListFind(SeqList* pq, SeqDataType x);//查找

void SeqListInsert(SeqList* pq, int pos, SeqDataType x);//中间某位置插入
void SeqListErase(SeqList* pq, int pos);//删除某个位置

void SeqListModify(SeqList* pq, int pos, SeqDataType x);//修改

除了最基本的增删查改外,还增加了打印和销毁等功能。

接口的实现(SepList.c)

1、扩容接口:

void SeqCheckCapacity(SeqList* pq)//扩容接口
{
    
	if (pq->size == pq->capacity)
	{
    
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;
		SeqDataType* newA = realloc(pq->a, sizeof(SeqDataType)*newcapacity);
		if (newA == NULL)
		{
    
			printf("relloc fail\n");
			exit(-1);
		}
		pq->a = newA;
		pq->capacity = newcapacity;
	}
}

2、插入操作:分为头插、尾插及在中间i位置i插入,其中头插和尾插要注意扩容接口

void SeqListPushBack(SeqList* pq, SeqDataType x)//尾插
{
    
	assert(pq);
	SeqCheckCapacity(pq);
	//满了,需要增容
	pq->a[pq->size] = x;
	pq->size++;
}

void SeqListPushFront(SeqList* pq, SeqDataType x)//头插
{
    
	assert(pq);
	SeqCheckCapacity(pq);
	int end = pq->size - 1;
	while (end >= 0)
	{
    
		pq->a[end + 1] = pq->a[end];
		end--;
	}
	pq->a[0] = x;
	pq->size++;
}

在数据表的第i个位置插入元素,在顺序表的第i个位置插入元素e,首先将顺序表第i个位置的元素依次向后移动一个位置,然后将元素e插入第i个位置,移动元素要从后往前移动元素,即:先移动最后一个元素,在移动倒数第二个元素,依次类推;插入元素之前要判断插入的位置是否合法,顺序表是否已满,在插入元素之后要将表长L->length++;且在i位置插入,i可以是头或尾,所以也可以用此接口代替

void SeqListInsert(SeqList* pq, int pos, SeqDataType x)//中间某位置插入
{
    
	assert(pq);
	assert(pq >= 0 && pos <= pq->size);
	SeqCheckCapacity(pq);
	int end = pq->size - 1;
	while (end >= pos)
	{
    
		pq->a[end + 1] = pq->a[end];
		end--;
	}
	pq->a[pos] = x;
	pq->size++;
}

3、删除操作:与插入一样,删除同样分为头删尾删及某一位置的删除
头删,尾删:

void SeqListPopBack(SeqList* pq)//尾删
{
    
	assert(pq);
	assert(pq->size > 0);
	--pq->size;
}

void SeqListPopFront(SeqList* pq)//头删
{
    
	assert(pq);
	assert(pq->size > 0);
	int begin = 0;
	while (begin < pq->size - 1)
	{
    
		pq->a[begin] = pq->a[begin + 1];
		begin++;
	}
	pq->size--;
	//SeqListErase(pq, 0);
}

在某一位置删除:同样这里的某一位置包括头和尾,所以可以代替头删和尾删。

void SeqListErase(SeqList* pq, int pos)//删除某个位置
{
    
	assert(pq);
	assert(pos >= 0 && pos < pq->size);
	int begin = pos;
	while (begin <= pq->size - 1)
	{
    
		pq->a[begin] = pq->a[begin + 1];
		begin++;
	}
	pq->size--;
}

4、查找:

int SeqListFind(SeqList* pq, SeqDataType x)//查找
{
    
	assert(pq);
	for (int i = 0; i < pq->size; i++)
	{
    
		if (pq->a[i] == x)
		{
    
			return i;
		}
	}
	return -1;
}

5、打印接口:此接口也是调试过程中不可缺少的一项

void SeqListPrint(SeqList* pq)//打印
{
    
	assert(pq);
	for (int i = 0; i < pq->size; i++)
	{
    
		printf("%d ", pq->a[i]);
	}
	printf("\n");
}

6、修改:

void SeqListModify(SeqList* pq, int pos, SeqDataType x)//修改
{
    
	assert(pq);
	assert(pos >= 0 && pos < pq->size);
	pq->a[pos] = x;
}

7、销毁顺序表:

void SeqListDestory(SeqList* pq)//销毁
{
    
	assert(pq);
	free(pq->a);
	pq->a = NULL;
	pq->size = pq->capacity = 0;
}

上面便是对顺序表基础接口的实现,调试并未展出,如果有想法可以自己操作

OVER

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52320568/article/details/116073919

智能推荐

一文讲解自动机器学习(AutoML)!你已经是个成熟的模型了,该学会自己训练了..._Datawhale的博客-程序员秘密

Datawhale作者:瞿晓阳,AutoML书籍作者寄语:让计算机自己去学习和训练规则,是否能达到更好的效果呢?自动机器学习就是答案,也就是所谓“AI的AI”,让AI去学习AI。随着...

android防止view被重复点击_一杯酒几分愁的博客-程序员秘密

这里主要利用RxJava来避免重复点击导入rxjava依赖:implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha2'java中使用如下:throttleFirst(1,TimeUnit.SECONDS)方法中:参数1表示多少秒内的第一次点击有效,这里是1秒参数2表示单位RxView.clicks(mai...

Helm - Error: cannot connect to Tiller_weixin_30349597的博客-程序员秘密

helm2.9.1报错[[email protected] ~]# helm versionClient: &amp;version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}E0801 14:37:59.972688 5854 portfo...

Delphi SM2/SM4国密算法-程序员秘密

Delphi SM2/SM4国密算法在国家医保平台中的应用场景

HDU 3567 Eight II(BFS打表)_luSpet的博客-程序员秘密

题目大意  还是八数码问题,输入起始结束状态,输出最小字典序的操作顺序思路  还是用BFS打表,为了使操作最短,处理出X在不同位置不断操作能达到的各种状态,至于为什么根据X的不同处理,除了X外,其他数字可以随意替换,如:1 2 3      3 4 54 5 6   =&gt;  7 8 X7 8 X      6 2 1可以替换成a b c      c d ed e f   ...

shell 脚本中获取mysql多个字段的值_weixin_34064653的博客-程序员秘密

从mysql中查询出的结果为:mysql-Ne"SELECTip,portFROMop.hostWHEREos='linux'andtype='支持'"+------------+------+|10.3.1.155|22||10.3.1.156|22||10.3.1.174|22||10.3.1.212|...

随便推点

国密算法使用-SM4_国密算法sm4_Angus sonder的博客-程序员秘密

SM4:无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。此算法是一个分组算法,用于无线局域网产品。该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。此算法采用非线性迭代结构,每次迭代由一个轮函数给出,其中轮函数由一个非线性变换和线性变换复合而成,非线性变换由S盒所给出。其中rki为轮密钥,合成置换T组成轮函数。

html json 折叠效果,格式化json、html展示json数据_NX-8MAA09148HY的博客-程序员秘密

记录一下function formatJson(json, options) {var reg = null,formatted = '',pad = 0,PADDING = ' '; // one can also use '\t' or a different number of spaces// optional settingsoptions = options || {};// r...

Spring之声明式事务(十一)_(YSY_YSY)的博客-程序员秘密

Spring之声明式事务1.回顾事务2.spring中的事务管理1.回顾事务把一组业务当成一个业务来做;要么都成功,要么都失败!事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎!确保完整性和一致性;事务ACID原则:原则性一致性隔离性多个业务可能操作同一个资源,防止数据损坏持久性事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中!2.spring中的事务管理声明式事务:AOP编程式事务:需要再代码中,进行事务的管理

Oracle--统计查询语句_oracle统计查询_xxf159797的博客-程序员秘密

直接进入正题:--分组统计,统计各个部门的平均薪资(使用group by)select d.dname as 部门 ,avg(sal) as 平均薪资 from scott.emp e left join scott.dept don e.deptno=d.deptno group by d.dname;select * from scott.dept d inne

推荐文章

热门文章

相关标签