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

网站建设综合训练合肥网络推广软件系统

网站建设综合训练,合肥网络推广软件系统,dede产品展示网站模板,数据库网站建设目录 1. 线性表 2. 顺序表 2.1 动态顺序表 3. 接口实现 前期工作 3.1 初始化、销毁与检查容量 3.1.1 初始化 3.1.2 销毁 3.1.3 检查容量 3.2 尾插 3.3 尾删 3.4 头插 3.5 头删 3.6 插入 3.7 删除 顺序表源码 SeqList.h SeqList.c test.c 写在最后&#xff…

目录

1. 线性表

2. 顺序表

2.1 动态顺序表

3. 接口实现

前期工作

3.1 初始化、销毁与检查容量

3.1.1 初始化

3.1.2 销毁

3.1.3 检查容量

3.2 尾插

3.3 尾删

3.4 头插

3.5 头删

3.6 插入

3.7 删除

顺序表源码

SeqList.h

SeqList.c

test.c

写在最后:


1. 线性表

线性表是n个具有相同特性的数据元素的有限序列,

常见的线性表:顺序表、链表、栈、队列、字符串等等。

2. 顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。

2.1 动态顺序表

我们一般使用的都是动态的顺序表。

3. 接口实现

前期工作

在VS上建三个工程文件,

test.c用来测试顺序表;

SeqList.c用来实现接口;

SeqList.h用来包头文件,和创建动态顺序表的基本结构;

头文件如下:

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>#define INIT_CAPACITY 4//选择需要的类型
typedef int SLDatatype;//动态的顺序表
typedef struct SeqList
{SLDatatype* a;int size;	  //有效的数据个数int capacity; //顺序表的空间容量
}SL;//顺序表的增删查改://初始化顺序表
void SeqInit(SL* s);//销毁顺序表
void SeqDestory(SL* s);//打印顺序表
void SeqPrint(SL* s);//检查容量
void CheckCapacity(SL* s);//尾插
void SeqPushBack(SL* s, SLDatatype x);//尾删
void SeqPopBack(SL* s);//头插
void SeqPushFront(SL* s, SLDatatype x);//头删
void SeqPopFront(SL* s);//插入
void SeqInsert(SL* s, int pos, SLDatatype x);//删除
void SeqErase(SL* s, int pos);

3.1 初始化、销毁与检查容量

接口如下:

3.1.1 初始化

//初始化顺序表
void SeqInit(SL* ps)
{//结构体指针不能为空assert(ps);//开辟空间ps->a = (SLDatatype*)malloc(sizeof(SLDatatype) * INIT_CAPACITY);//检查if (ps->a == NULL){perror("malloc fail");}ps->size = 0;ps->capacity = INIT_CAPACITY;
}

3.1.2 销毁

//销毁顺序表
void SeqDestory(SL* ps)
{//结构体指针不能为空assert(ps);//释放并置空free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}

3.1.3 检查容量

//检查容量
void CheckCapacity(SL* ps)
{//结构体指针不能为空assert(ps);if (ps->size == ps->capacity){//增容(两倍)SLDatatype* tmp = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * ps->capacity * 2);//检查是否增容成功if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}

3.2 尾插

//尾插
void SeqPushBack(SL* ps, SLDatatype x)
{//代码复用SeqInsert(ps, ps->size, x);/*单独实现//结构体指针不能为空assert(ps);//检查容量CheckCapacity(ps);//尾插ps->a[ps->size++] = x;*/
}

3.3 尾删

//尾删
void SeqPopBack(SL* ps)
{//代码复用SeqErase(ps, ps->size - 1);/*单独实现//结构体指针不能为空assert(ps);//检查顺序表是否为空assert(ps->size);//尾删ps->size--;*/
}

3.4 头插

//头插
void SeqPushFront(SL* ps, SLDatatype x)
{//代码复用SeqInsert(ps, 0, x);/*单独实现//结构体指针不能为空assert(ps);//检查容量CheckCapacity(ps);//把值往后挪int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}//头插ps->a[0] = x;ps->size++;*/
}

3.5 头删

//头删
void SeqPopFront(SL* ps)
{//代码复用SeqErase(ps, 0);/*单独实现//结构体指针不能为空assert(ps);//当顺序表为零时就不能删了assert(ps->size);//将数据往前覆盖int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;*/
}

3.6 插入

//插入
void SeqInsert(SL* ps, int pos, SLDatatype x)
{//结构体指针不能为空assert(ps);//pos需要在有数据的区间assert(pos >= 0 && pos <= ps->size);//检查容量CheckCapacity(ps);//往后挪动数据int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}//插入数据ps->a[pos] = x;ps->size++;
}

3.7 删除

//删除
void SeqErase(SL* ps, int pos)
{//结构体指针不能为空assert(ps);//pos需要在有数据的区间assert(pos >= 0 && pos < ps->size);//挪动数据int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

我们发现,

其实顺序表核心的功能就是插入和删除,

只要我们完成这两个接口,

其他的接口的实现都是大同小异。

顺序表源码

SeqList.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>#define INIT_CAPACITY 4//选择需要的类型
typedef int SLDatatype;//动态的顺序表
typedef struct SeqList
{SLDatatype* a;int size;	  //有效的数据个数int capacity; //顺序表的空间容量
}SL;//顺序表的增删查改://初始化顺序表
void SeqInit(SL* s);//销毁顺序表
void SeqDestory(SL* s);//打印顺序表
void SeqPrint(SL* s);//检查容量
void CheckCapacity(SL* s);//尾插
void SeqPushBack(SL* s, SLDatatype x);//尾删
void SeqPopBack(SL* s);//头插
void SeqPushFront(SL* s, SLDatatype x);//头删
void SeqPopFront(SL* s);//插入
void SeqInsert(SL* s, int pos, SLDatatype x);//删除
void SeqErase(SL* s, int pos);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1#include "SeqList.h"//初始化顺序表
void SeqInit(SL* ps)
{//结构体指针不能为空assert(ps);//开辟空间ps->a = (SLDatatype*)malloc(sizeof(SLDatatype) * INIT_CAPACITY);//检查if (ps->a == NULL){perror("malloc fail");}ps->size = 0;ps->capacity = INIT_CAPACITY;
}//销毁顺序表
void SeqDestory(SL* ps)
{//结构体指针不能为空assert(ps);//释放并置空free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}//打印
void SeqPrint(SL* ps)
{//结构体指针不能为空assert(ps);//遍历打印for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]); }printf("\n");
}//检查容量
void CheckCapacity(SL* ps)
{//结构体指针不能为空assert(ps);if (ps->size == ps->capacity){//增容(两倍)SLDatatype* tmp = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * ps->capacity * 2);//检查是否增容成功if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}//尾插
void SeqPushBack(SL* ps, SLDatatype x)
{//代码复用SeqInsert(ps, ps->size, x);/*单独实现//结构体指针不能为空assert(ps);//检查容量CheckCapacity(ps);//尾插ps->a[ps->size++] = x;*/
}//尾删
void SeqPopBack(SL* ps)
{//代码复用SeqErase(ps, ps->size - 1);/*单独实现* //结构体指针不能为空assert(ps);//检查顺序表是否为空assert(ps->size);//尾删ps->size--;*/
}//头插
void SeqPushFront(SL* ps, SLDatatype x)
{//代码复用SeqInsert(ps, 0, x);/*单独实现//结构体指针不能为空assert(ps);//检查容量CheckCapacity(ps);//把值往后挪int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}//头插ps->a[0] = x;ps->size++;*/
}//头删
void SeqPopFront(SL* ps)
{//代码复用SeqErase(ps, 0);/*单独实现//结构体指针不能为空assert(ps);//当顺序表为零时就不能删了assert(ps->size);//将数据往前覆盖int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;*/
}//插入
void SeqInsert(SL* ps, int pos, SLDatatype x)
{//结构体指针不能为空assert(ps);//pos需要在有数据的区间assert(pos >= 0 && pos <= ps->size);//检查容量CheckCapacity(ps);//往后挪动数据int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}//插入数据ps->a[pos] = x;ps->size++;
}//删除
void SeqErase(SL* ps, int pos)
{//结构体指针不能为空assert(ps);//pos需要在有数据的区间assert(pos >= 0 && pos < ps->size);//挪动数据int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "SeqList.h"//测试接口
void SLTest()
{SL s;SeqInit(&s);SeqPushBack(&s, 1);SeqPushBack(&s, 2);SeqPushBack(&s, 3);SeqPushBack(&s, 4);SeqPushBack(&s, 5);SeqPushBack(&s, 6);SeqPrint(&s);SeqPopBack(&s);SeqPopBack(&s);SeqPrint(&s);SeqPushFront(&s, 10);SeqPushFront(&s, 50);SeqPrint(&s);SeqPopFront(&s);SeqPopFront(&s);SeqPopFront(&s);SeqPrint(&s);SeqDestory(&s);
}int main()
{SLTest();return 0;
}

测试结果无误。

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

http://www.ds6.com.cn/news/12209.html

相关文章:

  • 绍兴公司网站建设 中企动力绍兴海外短视频软件
  • 雄安做网站优化站长域名查询
  • 交友网站建设策划方案(2)网图搜索识别
  • 网站建设系统智能营销方法
  • WordPress安装aplayer广州seo推荐
  • wordpress主页文件百度官方优化指南
  • 西宁网站制作公司南安seo
  • 前端网站开发论文国内新闻最新消息今天简短
  • 草包做视频网站互站网
  • 10g空间网站做视频网站东莞产品网络推广
  • 网站如何做线下推广太原网站制作优化seo公司
  • 教做家庭菜的网站天津百度关键词seo
  • 使用QQ做网站客服营销qq下载
  • 做乡村旅游的网站关键词seo优化排名
  • 西安网站建设中企建站it教育培训机构排名
  • 深圳外贸公司网站自助建站系统开发
  • 深圳效果图制作公司成都网络优化公司有哪些
  • 那些空号检测网站是怎么做的私人做网站的流程
  • 易无忧建站国内it培训机构排名
  • 淘宝网客网站建设周口seo公司
  • 免费做网站排名seo初级入门教程
  • 知名网站制作公网站建设方案书模板
  • 用.net做的网站吗品牌运营管理有限公司
  • wordpress 自定义分类 模板重庆seo整站优化报价
  • 网站培训方案佳木斯seo
  • 网站 用cms 侵权海东地区谷歌seo网络优化
  • 动漫网站建设的目标百度指数里的资讯指数是什么
  • vi设计征集seo顾问服务 品达优化
  • 网站开发项目培训优化搜索点击次数的方法
  • 门户网站建设标准淘宝seo推广优化