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

旅游攻略那个网站做的好关键词权重

旅游攻略那个网站做的好,关键词权重,网站小样用什么做,有哪些网站是做红酒批发的【数据结构】线性表之顺序表 一.知识补充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/100199.html

相关文章:

  • 如何在电网网站做备案爱站网关键词搜索
  • 公司网站制作重庆seo优化主要工作内容
  • 武汉微信网站建设电销系统软件排名
  • 网站根目录是什么在线一键建站系统
  • 上海网站建设代码整合营销的案例
  • 网站建设公司好吗微信广告推广如何收费
  • 中小学教师兼职做网站成都业务网络推广平台
  • php做网站教程游戏推广怎么快速拉人
  • 万动力网站外链提交
  • 公司营销网站制作百度推广怎么做免费
  • 崇明专业做网站谷歌优化排名哪家强
  • 工业皮带怎么做免费的网站中国营销传播网官网
  • 网站建设图文片小学生摘抄新闻
  • 网站建设致谢昆明抖音推广
  • 郑州做网站kuihuakeji黄冈seo顾问
  • 营销型网站建立费用中国刚刚发生的新闻
  • 企业网站改版建议杭州关键词排名提升
  • seo外链网站百度有哪些app产品
  • 江苏建设工程交易信息网站苏州seo关键词优化排名
  • 怎样建设卡盟网站sem是什么的英文缩写
  • 做信息图的网站seo的作用是什么
  • 做网站如何不被忽悠国际新闻界官网
  • 泰安房产网站建设南宁网站建设公司
  • 哈尔滨建站公司外链平台有哪些
  • 怎么做网站实惠百度员工收入工资表
  • 游戏网站建设的必要性百度推广登陆入口官网
  • 网站正在建设中html5seo技术公司
  • 企业自建服务器网站建设流程黑龙seo网站优化
  • 淄博外贸网站建设公司关键词全网指数查询
  • 武汉光谷网站建设百度推广河南总部