顺序表

  • 顺序表
    • 图示
    • 代码实现
    • 实际应用

顺序表

顺序表是简单的一种线性结构,逻辑上相邻的数据在计算机中内的存储位置也是相邻的,可以快速定位第几个元素,中间允许有空值,插入、删除时需要移动大量元素。

顺序表的三个要素

  • 用elems记录存储位置的基地址。
  • 分配一段连续的存储空间size(可以存放的元素个数)。
  • 用length记录实际的元素个数,即顺序表的长度(现在实际存放的元素个数)。

图示

代码实现

#define MAX_SIZE 100typedef int ElemsType;typedef struct _SqList
{ElemsType* elems;int length;//长度int size;//容量
}SqList;//初始化
bool initSqList(SqList &sqlist)
{sqlist.elems = new int[MAX_SIZE];if (!sqlist.elems)//开辟失败直接返回{return false;}sqlist.length = 0;sqlist.size = MAX_SIZE;return true;
}
//打印整个list
void printSqList(SqList &sqlist)
{for (int i = 0; i < sqlist.length; i++){cout << sqlist.elems[i] << " ";}cout << endl;
}
//顺序表增加元素
bool addSqList(SqList& sqlist,int e)
{if (sqlist.length == sqlist.size){return false;}sqlist.elems[sqlist.length] = e;sqlist.length++;return true;
}//指定位置插入元素
bool insertSqList(SqList& sqlist,int index,int e)
{//合法性判断if (index < 0 || index >= sqlist.length){return false;}if (sqlist.length == sqlist.size){return false;}for (int j= sqlist.length-1; j >= index; j--){sqlist.elems[j + 1] = sqlist.elems[j];}sqlist.elems[index] = e;sqlist.length++;return true;
}
//删除指定位置元素
bool deleteSqList(SqList& sqlist, int index)
{if (index < 0 || index >= sqlist.length){return false;}if (index == sqlist.length){sqlist.length--;return true;}for (int j = index; j < sqlist.length; j++){sqlist.elems[j] = sqlist.elems[j + 1];}sqlist.length--;return true;
}
//销毁整个表
void destorySqList(SqList& sqlist)
{if (sqlist.elems){delete[]sqlist.elems;}sqlist.length = 0;sqlist.size = 0;
}

实际应用

高并发WEB服务器中顺序表的应用

高性能的 web 服务器 Squid 每秒可处理上万并发的请求,从网络连接到服务器的客 户端与服务器端在交互时会保持一种会话(和电话通话的场景类似)。服务器端为了管 理好所有的客户端连接,给每个连接都编了一个唯一的整数编号,叫做文件句柄,简称 fd。


为了防止某些恶意连接消耗系统资源,当某个客户端连接超时(在设定的一定时间内没有发送数据)时,服务器就需要关闭这些客户端的连接。


具体实现方案:

1.当有新的请求连到服务器时,如果经过服务器频率限制模块判断,貌似恶意连 接,则使用顺序表来保存此连接的超时数据,超时值使用时间戳来表示,时间戳是指格林 威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒(相当于北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起至现在的总秒数。

补充:求当前的时间戳time_t now;time(&now);cout << "当前时间戳:" << now << endl;

其结构体定义如下:

typedef struct { int fd; time_t timeout; // 使用超时时刻的时间戳表示
}ConnTimeout;

2.服务器程序每隔一秒钟扫描一次所有的连接,检查是否超时,如果存在超时的 连接,就关闭连接,结束服务,同时将顺序表中的记录清除!

大致实现过程(相关接口并未实现)

static void checkTimeOut(TimeOutSqList& list,time_t now)
{int fd,i;cout<<"检查超时"<<endl;for(int i = 0 ; i  < list.length;i++){if(list.emels[i].timeout > now){continue;}//超时 清理fd = list.emels[i].fd;//关闭链接---模拟cout<<"关闭链接"<<ednl;listDelete(list,i);//注意顺序表会移动,注意漏删情况i--;}
}
int main(void)
{time_t now,end;time_t last_timeout;//每秒执行一次超时检测TimeOutSqList list;time(&now);end  = now+60;//就处理一分钟,60s后退出循环initList(list);//通过频率限制模块通过判断分析,增加恶意连接到顺序表中for(int i = 0;i< 10;i++){ConnectTimeOut e;e.df = i;e.timeout = now + i *2;listAdd(list,e);}listPrint(list);do{//控制 1(几)秒钟做一次事情if(last_timeout + 0.999 < now){checkTimeOut(list,now); last_timeout = now;}Sleep(10);time(&now);//读取现在时间}while(end > now);return 0;
}

(理解顺序表在这其中的作用即可。)

【数据结构】顺序表(C++)相关推荐

  1. C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...

    c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...

  2. 数据结构-顺序表(动态分配存储空间)

    数据结构-顺序表(动态分配存储空间) (1)顺序表的结构定义: 结构型定义:(动态分配存储空间) /*** 动态分配存储空间*/ #define InitSize 100 //动态分配存储空间时,不限 ...

  3. C语言/C++常见习题问答集锦[八十三]之数据结构顺序表(operand types are error: no match for “operator==“)

    C语言/C++常见习题问答集锦[八十三]之数据结构顺序表{operand types are error: no match for "operator=="} 程序之美 前言 主 ...

  4. 数据结构--顺序表的使用

    数据结构--顺序表的使 #include<iostream> #include<cstdio> #include<cstring> using namespace ...

  5. Educoder头歌数据结构顺序表及其应用

    头歌实践平台答案educoder 数据结构-顺序表及其应用 第1关:顺序表的实现之查找功能 /***************************************************** ...

  6. 数据结构——顺序表的合并

    数据结构--顺序表的合并 具体要求:写一个函数,其函数的功能是将非递增顺序表LA和LB合并到非递增顺序表LC中 数据结构-顺序表的操作之合并顺序表 一.顺序表的结构 首先要定义的是顺序表的结构体,只有 ...

  7. python顺序表数组_数据结构 | 顺序表

    什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表.集合与字典等都 ...

  8. 8.基本数据结构-顺序表和链表

    一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计 ...

  9. 数据结构顺序表基本流程

    生活中很多事物是有顺序关系的,如班级座位从前到后是按排的顺序,从左到右是按列的顺序,可以很方便的定位到某一个位置,但如果座位是散乱的,就很难定位. 在程序中,经常需要将一组(通常是同为某个类型的)数据 ...

  10. C#数据结构-顺序表

    顺序表,顾名思义存储在计算机指定内存区域的一块连续的存储结构,跟我们一起排队做广播体操的那种方式 存储物理结构:物理内存空间上是连续的 存储逻辑关系:存储值之间的关系为一对一 使用场景:一般访问数据量 ...

最新文章

  1. android 9 pie公司,谷歌Android 9 Pie,真正的安卓派
  2. 如何设置可见性Android软键盘
  3. Ansible管理节点过多导致的超时问题解决方法
  4. python 队列与栈的实现
  5. 西安工程大学c语言试卷,知到_大学应用写作_单元测试答案知到C语言程序设计(西安工程大学)见面课答案...
  6. 接二手java项目需要什么资料_师妹问双非本科如何进BAT,我告诉她Java后端路线...
  7. dp、px之间单位转换Util
  8. 使用electron和vue,以ipc通信的方式构建客户端版本的掘金首页
  9. 批量插入数据到sqlserver
  10. 用OpenStack构建“区域医疗”云平台
  11. 1*1的卷积核与Inception
  12. proteus不能打开一直在开启界面转圈
  13. Rayson API 框架分析系列之3:RSON序列化格式
  14. 什么是资产证券化 - 以及资产支持证券在实际中的应用
  15. 生活美学 | 8种咖啡冲煮器具分别有什么特点
  16. 包络线公式如何用计算机求,包络线公式
  17. 【每晚一个恐怖的测开技术学习小故事】第三集:无限噩梦算法
  18. python学生成绩管理系统【完整版】
  19. JAVA跨考_考研人的2019——一战跨考清华计算机的血泪史
  20. C++ 文本编码探测CED (Compact Encoding Detection)技术

热门文章

  1. Android开发学习(基础)
  2. 视频消息沟通,我的工作总是快人一步,感谢帧想
  3. 最适合新手入门的数据可视化大屏制作软件,现在支持免费使用
  4. 第四天 IPTABLES功能深入
  5. 基于MATLAB的psnr利用峰值信噪比来比较图片相似性GUI
  6. 使用Fiddler抓取网易MUMU模拟器数据包
  7. 【Maven】使用插件拷贝jar包到指定目录
  8. 浅谈视频智能化的发展与应用
  9. Python处理PPT文件的实用姿势
  10. 热敏打印机实现打印小票