所谓数据结构顺序表和链表的基本操作,实际上就是实现对一个顺序表(链表)的增删查改及其其他接口的实现。
由长度和数据数组组成:
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;
}
#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);//修改
除了最基本的增删查改外,还增加了打印和销毁等功能。
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;
}
上面便是对顺序表基础接口的实现,调试并未展出,如果有想法可以自己操作
Datawhale作者:瞿晓阳,AutoML书籍作者寄语:让计算机自己去学习和训练规则,是否能达到更好的效果呢?自动机器学习就是答案,也就是所谓“AI的AI”,让AI去学习AI。随着...
这里主要利用RxJava来避免重复点击导入rxjava依赖:implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha2'java中使用如下:throttleFirst(1,TimeUnit.SECONDS)方法中:参数1表示多少秒内的第一次点击有效,这里是1秒参数2表示单位RxView.clicks(mai...
helm2.9.1报错[[email protected] ~]# helm versionClient: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}E0801 14:37:59.972688 5854 portfo...
Delphi SM2/SM4国密算法在国家医保平台中的应用场景
题目大意 还是八数码问题,输入起始结束状态,输出最小字典序的操作顺序思路 还是用BFS打表,为了使操作最短,处理出X在不同位置不断操作能达到的各种状态,至于为什么根据X的不同处理,除了X外,其他数字可以随意替换,如:1 2 3 3 4 54 5 6 => 7 8 X7 8 X 6 2 1可以替换成a b c c d ed e f ...
从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:无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。此算法是一个分组算法,用于无线局域网产品。该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。此算法采用非线性迭代结构,每次迭代由一个轮函数给出,其中轮函数由一个非线性变换和线性变换复合而成,非线性变换由S盒所给出。其中rki为轮密钥,合成置换T组成轮函数。
Core_v5.0.pdf
记录一下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之声明式事务1.回顾事务2.spring中的事务管理1.回顾事务把一组业务当成一个业务来做;要么都成功,要么都失败!事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎!确保完整性和一致性;事务ACID原则:原则性一致性隔离性多个业务可能操作同一个资源,防止数据损坏持久性事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中!2.spring中的事务管理声明式事务:AOP编程式事务:需要再代码中,进行事务的管理
直接进入正题:--分组统计,统计各个部门的平均薪资(使用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