当前位置: 首页 > news >正文

淘宝联盟 网站备案海口注册公司代理公司地址电话

淘宝联盟 网站备案,海口注册公司代理公司地址电话,深圳网站设计兴田德润优惠吗,中山品牌网站建设目录 线性表 顺序表 概念与结构 动态顺序表的实现 头文件的创建 顺序表初始化 顺序表的扩容 尾插功能 头插功能 尾删功能 头删功能 查找功能 任意位置前插入 任意位置前删除 销毁 动态顺序表整体呈现 SeqList.h SeqList.c 线性表 线性表是n个具有相同特性的数…

目录

线性表

顺序表

概念与结构

动态顺序表的实现

头文件的创建

顺序表初始化

顺序表的扩容

尾插功能

头插功能

尾删功能

头删功能

查找功能

任意位置前插入

任意位置前删除

销毁

动态顺序表整体呈现

SeqList.h

SeqList.c


线性表

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表的逻辑结构一定是线性的,但物理结构不一定是线性的。

顺序表

概念与结构

概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。

结构:顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

分类:分为静态顺序表和动态顺序表(常用)。

动态顺序表的实现

头文件的创建

我们要在头文件中完成顺序表的创建和头文件与函数的声明。

typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;int capacity;
}SL;

这是头文件的包含和顺序表的创建。

这是对函数的声明,以上函数我们都会讲到。

顺序表初始化

首先我们要在源文件中包含刚刚我们创建的头文件。

然后对顺序表进行初始化。

void SLInit(SL* ps)//初始化
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

顺序表的扩容

现在我们的顺序表里面什么都没有,我们要扩大我们的空间。或者当我们的顺序表空间满了的时候,我们也要扩大我们的空间。

所以我们要先写好函数对顺序表进行扩容。

扩容函数中我们需要使用realloc函数额外申请空间。

注意:进行扩容操作时请用临时变量,防止发生问题造成不可逆的伤害。

void SLCheckCapacity(SL* ps)//扩容
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}

尾插功能

实现尾插功能很简单,size刚好是数组最后一个元素的后一个下标,确定指针的安全后直接令arr[size]等于x就完成了。

void SLPushBack(SL* ps,SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}

头插功能

头插功能比尾插复杂一点点,需要让数组中的元素整体后移一个位置,让arr[0]空缺起来实现x的插入。

void SLPushFront(SL* ps, SLDataType x)//头插
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}

尾删功能

尾删很简单,直接让size减一就好了。

void SLPopBack(SL* ps)//尾删
{assert(ps && ps->size);--ps->size;
}

头删功能

头删也很简单,就让后面的元素把前面的元素一一覆盖就好了。

void SLPopFront(SL* ps)//头删
{assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}

查找功能

遍历数组查找元素,找到返回下标,没找到返回-1。

int SLFind(SL* ps, SLDataType x)//查找
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}return -1;
}

任意位置前插入

这是建立在头插的基础上的,让pos后的元素一一往后移一个位置把pos空出来实现插入。

void SLInsert(SL* ps, int pos, SLDataType x)//任意位置前插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;
}

任意位置前删除

和头删很相似,让pos后的元素一一往前移一个位置覆盖pos。

void SLErase(SL* ps, int pos)//任意位置前删除
{assert(ps && ps->size);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}

销毁

结束后一定要进行函数的销毁操作。

void SLDesTroy(SL* ps)//销毁
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

动态顺序表整体呈现

SeqList.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;int capacity;
}SL;void SLInit(SL* ps);
void SLDesTroy(SL* ps);
void SListPrint(SL s);
void SLCheckCapacity(SL* ps);
void SLPushBack(SL* ps,SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"void SLInit(SL* ps)//初始化
{ps->arr = NULL;ps->size = ps->capacity = 0;
}void SListPrint(SL s)//打印
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]);}printf("\n");
}void SLCheckCapacity(SL* ps)//扩容
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}void SLPushBack(SL* ps,SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}void SLPushFront(SL* ps, SLDataType x)//头插
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}void SLPopBack(SL* ps)//尾删
{assert(ps && ps->size);--ps->size;
}void SLPopFront(SL* ps)//头删
{assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}int SLFind(SL* ps, SLDataType x)//查找
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}return -1;
}void SLInsert(SL* ps, int pos, SLDataType x)//任意位置前插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;
}void SLErase(SL* ps, int pos)//任意位置前删除
{assert(ps && ps->size);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}void SLDesTroy(SL* ps)//销毁
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}
http://www.dtcms.com/a/509255.html

相关文章:

  • 58同城的网站建设黑龙江做网站的公司
  • 网站开发浏览器wordpress安装完成后卸载
  • 怎样做网站 知乎seo指的是
  • 360做网站吗哪些网站可以做免费答题
  • Windows笔记本如何开启「休眠」模式?睡眠和休眠有什么不同?
  • 沈阳网站企业关于幼儿建设网站ppt模板下载
  • 请人做网站要多少找人做seo要给网站程序
  • 手机版网站模板响应式网站与自适应
  • 黑马微服务保险(一)
  • 包头网站优化怎样做自己的网络平台
  • var func 和 func func(){}
  • 制作一个静态网站的步骤南京网站建设公司大全
  • 重庆工程建设造价信息网站天津通用网站建设收费
  • 网站保障体系建设wordpress淘宝
  • 标志设计网站推荐什么是电子商务网站推广
  • 标准IO-文件IO(缓冲区)
  • 做个简单的企业小网站企业邮箱怎么申请注册账号
  • 网站建设 自适应禄劝网络推广外包
  • [特殊字符] 神奇的二维世界:信息与意识的未来宇宙
  • 无线通信眼镜专利拆解:骨传导换能器与镜腿集成的声学传输机制研究
  • 网站域名是不是就是网址代理网页是干什么的
  • 网站可以换域名吗网站设计中常见的错误
  • 微机课做网站单页面网站模板怎么做
  • 万江建筑培训中心泰州seo公司
  • 如何设计一个完整的网站jsp网站开发难吗
  • 个人网站建设方案书 范文怎么做自己的代刷网站
  • 旅游网站做模板素材购物网站建设需要多少钱
  • 【十年后台管理系统】准备工作
  • 废旧网站哪个做的最好百度首页网站的设计
  • Progressbar组件自定义样式