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

旅游攻略那个网站做的好查询网138网站域名

旅游攻略那个网站做的好,查询网138网站域名,事件营销的方法,做网站必须要买服务器吗【数据结构】线性表之顺序表 一.知识补充1.什么是数据结构2.数据元素的四类基本结构3.数据结构表示4.线性表5.线性结构特点6.常见线性表 二.顺序表1.顺序表概念2.顺序表的实现(C语言实现)①动态顺序表结构定义:②初始化函数:③销毁…

【数据结构】线性表之顺序表

  • 一.知识补充
    • 1.什么是数据结构
    • 2.数据元素的四类基本结构
    • 3.数据结构表示
    • 4.线性表
    • 5.线性结构特点
    • 6.常见线性表
  • 二.顺序表
    • 1.顺序表概念
    • 2.顺序表的实现(C语言实现)
      • ①动态顺序表结构定义:
      • ②初始化函数:
      • ③销毁函数:
      • ④容量检查函数:
      • ⑤尾插函数:
      • ⑥头插函数:
      • ⑦指定位置插入函数:
      • ⑧尾删函数:
      • ⑨头删函数:
      • ⑩删除指定位置的数据函数:
      • ⑪查找指定数据函数:
    • 三.总结
      • 1.头文件(声明动态顺序表的结构,操作等,起到目录作用):
      • 2.源文件(具体实现各种操作):
      • 3.测试文件(测试各个函数的功能)

一.知识补充

1.什么是数据结构

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

2.数据元素的四类基本结构

①.集合:结构中的数据元素除了同属于一个集合外,无其他关系。
在这里插入图片描述
②.线性结构:结构中的数据元素存在一对一的关系。
在这里插入图片描述
③.树形结构:结构中的数据元素存在一对多的关系。
在这里插入图片描述
④.图状结构或网状结构:结构中的数据存在多对多的关系。
在这里插入图片描述

3.数据结构表示

数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。
数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,并因此得出两种不同的存储结构:顺序存储结构和链式存储结构。
顺序映像的特点是借助元素在存储器中的相对位置表示数据元素之间的逻辑关系。非顺序映像的特点是借助指示元素存储地址的指针表示数据元素之间的逻辑关系。

4.线性表

线性表是n个具有相同特性的数据元素的有限序列。
线性表在逻辑上是线性结构,在物理结构上不一定是。
线性表在物理上存储时,通常以数组和链式结构的形式存储。

5.线性结构特点

线性结构的特点是:①.存在唯一一个被称为“第一个”的元素;②.存在唯一一个被称为“最后一个”的元素;③.除第一个元素外,集合每个元素均只有一个前驱;④.除最后一个元素外,集合每个元素均只有一个后继。

6.常见线性表

常见线性表包括顺序表,链表,栈,队列和串等等。

二.顺序表

1.顺序表概念

顺序表即线性表的顺序实现,就是使用一段物理地址连续的存储单元依次存取数据元素的线性结构。
顺序表通常是对数组进行封装再加上增删查改等各种操作。
顺序表可分为静态顺序表(顺序表长度固定)和动态顺序表(使用动态开辟的数组存储) 。

2.顺序表的实现(C语言实现)

由于静态顺序表的长度不够灵活,空间小了可能不够用,空间大了造成浪费,因此实际中更常用的是动态顺序表,所以在此只写出动态顺序表的实现。

①动态顺序表结构定义:

//使用typedef为类型起别名,存储其他类型的数据时也方便修改
//例如存储double类型的数据时直接将int修改成double
typedef int SQDataType;typedef struct SeqList
{SQDataType* arr;int size;    //记录当前实际存储数据的个数int capacity;//顺序表容量大小
}SL;//将struct SeqList简写为SL

②初始化函数:

//初始化函数定义
void SLInit(SL* ps)//使用指针接收,否则形参的改变不会影响实参
{ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}

③销毁函数:

//销毁函数定义
void SLDestory(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}

④容量检查函数:

//检查空间是否充足(其他插入函数也需要检查空间是否充足,因此直接封装为一个函数)
void SLCheckCapacity(SL* ps)
{//处理数组满了的情况if (ps->size == ps->capacity){//如果当前顺序表容量大小为0,那么乘2也为0,所以用三目操作符判断。一般是二倍扩容int NewCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//防止出现扩容失败造成数据丢失,因此先用tmp暂存SQDataType* tmp = (SQDataType*)realloc(ps->arr, NewCapacity * sizeof(SQDataType));if (tmp == NULL){printf("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = NewCapacity;}
}

⑤尾插函数:

//尾插函数定义
//时间复杂度为O(1)
void SLPushBack(SL* ps, SQDataType x)
{//使用断言检查指针是否为空assert(ps);SLCheckCapacity(ps);//尾插时当前数据个数与要插入的位置下标是相同的ps->arr[ps->size] = x;ps->size++;
}

⑥头插函数:

//头插函数定义
//时间复杂度为O(n)
void SLPushFront(SL* ps, SQDataType x)
{assert(ps);SLCheckCapacity(ps);//头插时先要把数据整体后移(先移动后面的数据)for (int i = ps->size - 1; i >= 0; i--){ps->arr[i + 1] = ps->arr[i];}ps->arr[0] = x;ps->size++;
}

⑦指定位置插入函数:

//指定位置插入函数定义
//时间复杂度为O(n)
void SLInsert(SL* ps, SQDataType x, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);//要将指定位置及之后的数据整体往后移for (int i = ps->size - 1; i >=pos;i--){ps->arr[i + 1] = ps->arr[i];}ps->arr[pos] = x;ps->size++;
}

⑧尾删函数:

//尾删函数定义
//时间复杂度为O(1)
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//数据个数为0时不能删除ps->size--;
}

⑨头删函数:

//头删函数定义
//时间复杂度为O(n)
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);//所有数据整体向前移动一位即头删for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

⑩删除指定位置的数据函数:

//删除指定位置的数据
//时间复杂度为O(n)
void SLErase(SL* ps, int pos)
{assert(ps);assert(ps->size);assert(pos >= 0 && pos < ps->size);//pos位置之后的数据整体向前移即完成删除for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

⑪查找指定数据函数:

//查找指定数据
//时间复杂度为O(n)
int SLFind(SL* ps, SQDataType x)
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;//查找成功返回下标}//循环结束仍未返回,则代表没有该数据,查找失败返回-1return -1;
}

三.总结

上述是动态顺序表的各个函数操作实现,以下是动态顺序表全部实现。
小tips:尽量写完一部分代码就调试一部分代码,否则可能出现代码全部写完,但出现很多报错无从下手的情况。

1.头文件(声明动态顺序表的结构,操作等,起到目录作用):

SeqList.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>//使用typedef为类型起别名,存储其他类型的数据时也方便修改
//例如存储double类型的数据时直接将int修改成double
typedef int SQDataType;typedef struct SeqList
{SQDataType* arr;int size;    //记录当前实际存储数据的个数int capacity;//顺序表容量大小
}SL;//将struct SeqList简写为SL//初始化函数声明
void SLInit(SL* ps);//销毁函数声明
void SLDestory(SL* ps);//打印顺序表(方便调试)
void SLPrint(SL* ps);//检查空间是否充足
void SLCheckCapacity(SL* ps);//尾插函数声明
void SLPushBack(SL* ps, SQDataType x);//头插函数声明
void SLPushFront(SL* ps, SQDataType x);//指定位置插入函数声明
void SLInsert(SL* ps, SQDataType x, int pos);//尾删函数声明
void SLPopBack(SL* ps);//头删函数声明
void SLPopFront(SL* ps);//删除指定位置的数据
void SLErase(SL* ps, int pos);//查找指定数据
int SLFind(SL* ps, SQDataType x);

2.源文件(具体实现各种操作):

SeqList.c

//包含自己写的头文件需用“”
#include"SeqList.h"//初始化函数定义
void SLInit(SL* ps)//使用指针接收,否则形参的改变不会影响实参
{ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}//销毁函数定义
void SLDestory(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}//打印顺序表(方便调试)
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}//检查空间是否充足(其他插入函数也需要检查空间是否充足,因此直接封装为一个函数)
void SLCheckCapacity(SL* ps)
{//处理数组满了的情况if (ps->size == ps->capacity){//如果当前顺序表容量大小为0,那么乘2也为0,所以用三目操作符判断。一般是二倍扩容int NewCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//防止出现扩容失败造成数据丢失,因此先用tmp暂存SQDataType* tmp = (SQDataType*)realloc(ps->arr, NewCapacity * sizeof(SQDataType));if (tmp == NULL){printf("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = NewCapacity;}
}//尾插函数定义
//时间复杂度为O(1)
void SLPushBack(SL* ps, SQDataType x)
{//使用断言检查指针是否为空assert(ps);SLCheckCapacity(ps);//尾插时当前数据个数与要插入的位置下标是相同的ps->arr[ps->size] = x;ps->size++;
}//头插函数定义
//时间复杂度为O(n)
void SLPushFront(SL* ps, SQDataType x)
{assert(ps);SLCheckCapacity(ps);//头插时先要把数据整体后移(先移动后面的数据)for (int i = ps->size - 1; i >= 0; i--){ps->arr[i + 1] = ps->arr[i];}ps->arr[0] = x;ps->size++;
}//指定位置插入函数定义
//时间复杂度为O(n)
void SLInsert(SL* ps, SQDataType x, int pos)
{assert(ps);//检查指定位置的有效性assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);//要将指定位置及之后的数据整体往后移for (int i = ps->size - 1; i >=pos;i--){ps->arr[i + 1] = ps->arr[i];}ps->arr[pos] = x;ps->size++;
}//尾删函数定义
//时间复杂度为O(1)
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//数据个数为0时不能删除ps->size--;
}//头删函数定义
//时间复杂度为O(n)
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);//所有数据整体向前移动一位即头删for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//删除指定位置的数据
//时间复杂度为O(n)
void SLErase(SL* ps, int pos)
{assert(ps);assert(ps->size);assert(pos >= 0 && pos < ps->size);//pos位置之后的数据整体向前移即完成删除for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//查找指定数据
//时间复杂度为O(n)
int SLFind(SL* ps, SQDataType x)
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;//查找成功返回下标}//循环结束仍未返回,则代表没有该数据,查找失败返回-1return -1;
}

3.测试文件(测试各个函数的功能)

test.c

#include"SeqList.h"//测试初始化函数
void test01()
{SL sl;SLInit(&sl);SLDestory(&sl);
}//测试尾插函数
void test02()
{SL sl;SLInit(&sl);for (int i = 0; i < 10; i++){SLPushBack(&sl, i);}SLPrint(&sl);SLDestory(&sl);
}//测试头插函数
void test03()
{SL sl;SLInit(&sl);for (int i = 0; i < 10; i++){SLPushFront(&sl, i);}SLPrint(&sl);SLDestory(&sl);
}//测试指定位置插入
void test04()
{SL sl;SLInit(&sl);//先尾插五个数据for (int i = 0; i < 5; i++){SLPushBack(&sl, i);}SLPrint(&sl);SLInsert(&sl, 87, 3);SLPrint(&sl);SLInsert(&sl, 56, 0);SLPrint(&sl);SLInsert(&sl, 16, 7);SLPrint(&sl);SLDestory(&sl);
}//测试尾删函数
void test05()
{SL sl;SLInit(&sl);SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPushBack(&sl, 5);SLPrint(&sl);SLPopBack(&sl);SLPrint(&sl);SLPopBack(&sl);SLPrint(&sl);SLPopBack(&sl);SLPrint(&sl);SLPopBack(&sl);SLPrint(&sl);SLPopBack(&sl);SLPrint(&sl);SLDestory(&sl);
}//测试头删函数
void test06()
{SL sl;SLInit(&sl);SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPushBack(&sl, 5);SLPrint(&sl);SLPopFront(&sl);SLPrint(&sl);SLPopFront(&sl);SLPrint(&sl);SLPopFront(&sl);SLPrint(&sl);SLPopFront(&sl);SLPrint(&sl);SLPopFront(&sl);SLPrint(&sl);SLDestory(&sl);
}//测试指定位置删除
void test07()
{SL sl;SLInit(&sl);SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPushBack(&sl, 5);SLPrint(&sl);SLErase(&sl, 1);SLPrint(&sl);SLErase(&sl, 0);SLPrint(&sl);SLErase(&sl, 2);SLPrint(&sl);SLDestory(&sl);
}//测试查找函数
void test08()
{SL sl;SLInit(&sl);SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPushBack(&sl, 5);SLPrint(&sl);printf("%d\n", SLFind(&sl, 3));printf("%d\n", SLFind(&sl, 1));printf("%d\n", SLFind(&sl, 5));printf("%d\n", SLFind(&sl, 79));SLDestory(&sl);
}int main()
{//调用测试函数//test01();//test02();//test03();//test04();//test05();//test06();//test07();test08();return 0;
}
http://www.dtcms.com/wzjs/307382.html

相关文章:

  • 广州番禺网站制作推广alexa
  • 建设银行网站注销整站排名优化公司
  • 青提wifi小程序开发教程厦门seo百度快照优化
  • 什么网站不用备案北京aso优化
  • 手机微信官方网站首页百度产品推广怎么收费
  • 南宁网站设计公司排名百度推广开户渠道公司
  • 能免费做封面的网站编程培训机构排名前十
  • enfold wordpress北京网站优化步
  • 自己做网站要会什么软件上海哪家seo公司好
  • 网站备案报道优化网站结构一般包括
  • 小米发布会官网兰州seo实战优化
  • 电子商务网站需要做那些准备工作成都seo专家
  • 中音阶梯网站谁家建设网络优化工程师有前途吗
  • 业之峰装饰全包靠谱吗百度seo推广免费
  • 制作个人网页的过程长沙网站优化培训
  • 淮安建设局网站saas建站平台
  • wordpress通过文章id获取文章资源优化网站排名
  • 电子商务的门户网站站长是什么职位
  • 清远建网站的公司百度明星人气榜入口
  • 网站开发客户阿里云案例某网站seo策划方案
  • 装饰公司网站如何布局2023年8月新冠疫情
  • 新手学做网站 iso ed2k全网营销渠道
  • 哪家网站建设企业微信营销管理软件
  • 南京手机网站制作公司2023广州疫情最新消息今天
  • wordpress登陆页插件面电脑优化
  • 电子商务网站建设步网站权重排名
  • 在阿里巴巴做网站多少钱2019百度权重
  • 网站关键词 公司我想做网络推广找谁
  • php网站开发实训报告seo网站排名优化软件
  • 河南科技网站建设seo诊断优化专家