一、 ACM算法:顺序表的查找

顺序表的查找指获取顺序表的第i个元素。对于线性表的顺序存储结构来说,如果我们要实现获取元素的操作(GetElem),即将线性表L中的第i个位置元素值返回。就程序而言,只要i的数值在数组下标范围内,就是把数组第i-1下标的值返回即可。

#define OK 1

# define ERROR 0

# define TRUE 1

# define FALSE 0

typedef int Status;

/* Status 是函数的类型,其值是函数结果状态代码,如OK等*/

/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/

/*操作结果:用e返回L中第i个数据元素的值*/

Status GetElem(Sqlist L,int i, ElemType *e)

{

if(L.length==0 || i<1 | |i> L.length)

return ERROR;

*e=L.data[i-1];

return OK;

}

注意这里返回值类型Status是一个整型,返回OK代表1,ERROR代表0

二、 ACM算法:顺序表的修改

由于顺序表中可以随机存取,将第i个元素修改为e的操作很简单。算法如下所示。

Status UptElem(Sqlist L,int i, ElemType e)

{

if(L.length==0 || i<1 | |i> L.length)

return ERROR;

L.data[i-1]=e;

return OK;

}

三、 线性表顺序存储结构的优缺点

线性表顺序存储结构的优缺点如图所示:

四、 顺序表的合并算法

  1. 1.        ACM算法:两个非递减有序的顺序表合并为一个非递减有序的顺序

问题描述:已知顺序表la是一个非递减有序的顺序表,lb也是一个非递减有序的顺序表。将两个线性别合并,合并后的线性表lc也必须是非递减有序的。

合并算法如下:

  1. #define MAX 100
  2.  
  3. struct slist
  4.  
  5. {
  6.  
  7. int a[MAX];
  8.  
  9. int len;
  10.  
  11. };
  12.  
  13. void main()
  14.  
  15. {
  16.  
  17. int i,p,q,r;
  18.  
  19. struct slist lc; //合并后的顺序表lc
  20.  
  21. struct slist la={{,,,,},},lb={{,,,,},}; //定义顺序表la,lb并赋初值。
  22.  
  23. lc.len=; //lc的初始长度为0
  24.  
  25. printf("顺序表la的元素是:");
  26.  
  27. for(i=;i<la.len;i++)
  28.  
  29. {
  30.  
  31. printf("%d\t",la.a[i]);
  32.  
  33. }
  34.  
  35. printf("\n顺序表lb的元素是:");
  36.  
  37. for(i=;i<lb.len;i++)
  38.  
  39. {
  40.  
  41. printf("%d\t",lb.a[i]);
  42.  
  43. }
  44.  
  45. p=; //p标识la顺序表的下标
  46.  
  47. q=; //q标识lb顺序表的下标
  48.  
  49. r=; //r标识lc顺序表的下标
  50.  
  51. while(p<la.len && q<lb.len) //当两个两表都为到最后一个元素
  52.  
  53. {
  54.  
  55. //将小的放到新顺序表中
  56.  
  57. if(la.a[p]<=lb.a[q])
  58. {
  59. lc.a[r]=la.a[p];
  60. r++;
  61. p++;
  62. lc.len++;
  63.  
  64. }
  65. else
  66. {
  67. lc.a[r]=lb.a[q];
  68. r++;
  69. q++;
  70. lc.len++;
  71. }
  72. }
  73. while(p<la.len) //la表未结束还有元素,将剩余元素加到lc表
  74. {
  75. lc.a[r]=la.a[p];
  76. r++;
  77. p++;
  78. lc.len++;
  79. }
  80.  
  81. while(q<lb.len) //lb表未结束还有元素,将剩余元素加到lc表
  82. {
  83. lc.a[r]=lb.a[q];
  84. r++;
  85. q++;
  86. lc.len++;
  87. }
  88. printf("\n合并顺序表后lc的元素是:"); //输出合并后的顺序表
  89. for(i=;i<lc.len;i++)
  90. {
  91. printf("%d\t",lc.a[i]);
  92. }
  93. }

该算法运行结果如图所示:

五、 顺序表算法的时间复杂度分析:

现在我们来分析一下,插入和删除的时间复杂度。

先来看最好的情况,如果元素要插入到最后一个位置,或者删除最后一个元素,此时时间复杂度O(1),因为不需要移动元素的,就如同来了一个新人要正常排队,当人是排在最后,如果此时他又不想排了,那么他一个人离开就好了,不影响任何人。

最坏的情况呢,如果元素要插入到第一个位置或者删除第一个元素,此时时间复杂度是多少呢?那就意味着要移动所有的元素向后或者向前,所以这个时间复杂度为O(n)。

插入元素:在第i个位置插入元素需要移动n-i+1个元素,平均移动n/2个元素

删除元素:在第i个位置删除元素需要移动n-i个元素,平均移动(n-1)/2个元素

我们前面讨论过时间复杂度的推导,可以得出,平均时间复杂度还是O(n)。

这说明什么?线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数不太变化,而更多是存储数据应用。当然,它的优缺点还不只是这些。

顺序表代码

  1. /* Note:Your choice is C IDE */
  2. #include "stdio.h"
  3. #define MAX 20
  4. typedef int type;
  5.  
  6. typedef struct {
  7. type arr[MAX];
  8. int length;
  9. }sqlist;
  10.  
  11. void fun(sqlist *L,type e)
  12. {
  13. int k;
  14. int i;
  15. printf("输入要插入的位置\n");
  16. scanf("%d",&i);
  17. if(L->length==MAX){
  18. printf("线性表已满\n");
  19. }
  20. if(i<||i>L->length+){
  21. printf("输入错误");
  22. }
  23. /*查找
  24. printf("%d",L->arr[i-1]);*/
  25. /*修改
  26. L->arr[i-1]=e;*/
  27. /*添加
  28. for(k=L->length;k<=i-1;k--){
  29. L->arr[k+1]=L->arr[k];
  30. }
  31. L->arr[i-1]=e;
  32. L->length++;*/
  33. /*删除
  34. for(k=i-1;k<L->length;k++)
  35. { L->arr[k]=L->arr[k+1];
  36. }
  37. L->length--;
  38. */
  39. }
  40. void main(){
  41. int i;
  42. sqlist L={{,,,,,},};
  43. /* for(i=0;i<6;i++){
  44. scanf("%d",&L->arr[i]);
  45. L->length=i+1;
  46. }*/
  47. for(i=;i<L.length;i++){
  48. printf(" %d ",L.arr[i]);
  49. }
  50. fun(&L,);
  51.  
  52. for(i=;i<L.length;i++){
  53. printf(" %d ",L.arr[i]);
  54. }
  55. }

神州租车

  1. /* Note:Your choice is C IDE */
  2. #include "stdio.h"
  3. #include "stdlib.h"
  4. #include "string.h"
  5. double money=0.0;//定义全局变量账号金额
  6. void menu();//功能菜单
  7. void carinfor();//功能1
  8. void carcheck();//功能2
  9. void main()//主函数
  10. {
  11. int bh;
  12. menu();
  13. for(;;){
  14. printf("\n请输入主菜单功能标号:");
  15. scanf("%d",&bh);
  16. switch(bh){
  17. case :
  18. carinfor();
  19. break;
  20. case :
  21. carcheck();
  22. break;
  23. case :
  24. exit();
  25. default:
  26. printf("您输入的功能编号有误,请重新输入!");
  27. break;
  28. }
  29. }//无限循环
  30. }
  31. void menu()
  32. {
  33. printf("\n\n\t\t\t══ 神州租车、中国租车领导者 ══\n");
  34. printf("\t\t\t1:神州专车信息\n");
  35. printf("\t\t\t2:神州专车结算\n");
  36. printf("\t\t\t0:退出\n");
  37. }//菜单实现
  38. void carinfor()
  39. {
  40. char arr[],brr[],ch;//车名,人名,判断条件
  41. for(;;){
  42. printf("请选择车型:奥迪/东风本田:");
  43. fflush(stdin);
  44. gets(arr);
  45. if(strcmp(arr,"奥迪")!=&&strcmp(arr,"东风本田")!=){
  46. printf("暂时没有您需要的车型\n");
  47. continue;
  48. }
  49. printf("请选择司机:吴亦凡/黄晓明:");
  50. fflush(stdin);
  51. gets(brr);
  52. if(strcmp(brr,"吴亦凡")!=&&strcmp(brr,"黄晓明")!=){
  53. printf("%s暂时没有上线\n",brr);
  54. continue;
  55. }
  56. printf("是否确认提交订单Y/N:");
  57. ch=getchar();
  58. if(ch=='Y'){
  59. printf("\n本次专车出行,所选车型是;%s,专车司机是:%s",arr,brr);
  60. break;
  61. }else{
  62. printf("取消成功!");
  63. break;
  64. }
  65. }//for循环
  66. }//功能1实现
  67. void carcheck(){
  68. int number;//订单编号
  69. int distance,time;//里程,时间
  70. char checkstyle[],choice;//支付方式,选择支付
  71. double money1;//充值金额
  72. double sum;//总金额
  73. printf("请输入订单编号;");
  74. scanf("%d",&number);
  75. printf("请输入本次行车里程;");
  76. scanf("%d",&distance);
  77. printf("请输入本次行车时间(分钟);");
  78. scanf("%d",&time);
  79. printf("请输入付款方式;");
  80. scanf("%s",checkstyle);
  81. if(strcmp(checkstyle,"支付宝")==){
  82. printf("请选择充值金额:");
  83. scanf("%lf",&money1);
  84. printf("充值金额满100元得150元\n");
  85. money+=money1;
  86. if(money>=){
  87. money+=;
  88. }
  89.  
  90. printf("确认支付Y/N:");
  91. scanf(" %c",&choice);
  92. if(choice=='Y'){
  93. sum=+(0.7*time)+(4.5*distance);
  94. if(money>=sum){
  95. printf("顾客您好,您的订单编号是%d,行车距离是%d里程,账号金额是%.2lf元,专车费用是%.2lf元,支付后账户余额是%.2lf元",number,distance,money,sum,money-sum);
  96. }else{
  97. printf("账号金额不足,请及时充值\n");
  98. }
  99. }else if(choice=='N'){
  100. printf("取消支付成功!\n");
  101. }else{
  102. printf("输入字符有误\n");
  103. }//是否支付
  104. }else{
  105. printf("支付方式无效!");
  106. }//关于支付宝的判断
  107. }//功能2 结束

c语言进阶13-线性表之顺序表的更多相关文章

  1. c/c++ 线性表之顺序表

    线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...

  2. [C++]数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  3. C#线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

  4. [C++]线性链表之顺序表<一>

    顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...

  5. [C++]线性链表之顺序表<二>

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

  6. 线性表之顺序表C++实现

    线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...

  7. [数据结构 - 第3章] 线性表之顺序表(C++实现)

    一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...

  8. 数据结构Java实现02----线性表与顺序表

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. 数据结构Java实现01----线性表与顺序表

    一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...

  10. c语言进阶12-线性表之顺序表

    一.  线性表的定义 为什么要学习线性表呢? 因为我们日常生活中存在种数据关系,计算机程序是为了解决日常生活的数据关系,因此我们要学习线性表. 线性表是什么呢? 线性表是由n个元素组成的有限序列. 需 ...

随机推荐

  1. delphi 实现微信开发(1) (使用kbmmw web server)

    原文地址:delphi 实现微信开发(1)作者:红鱼儿 大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生 ...

  2. new和delete必须成对出现吗?【网上集合贴+个人总结】

    new和delete必须成对出现吗?[网上集合贴+个人总结] 1.从内存泄露与否的角度考虑 new 和 delete不一定要成对出現.理论上是這樣的.但是从习惯上來說,new delete成對出現是一 ...

  3. ASP.NET Core 通过 Microsoft.DotNet.Watcher.Tools 实现热部署

    之前开发前端的时候,webpack 会有热更新工具,在修改了代码之后,自动将代码编译,实时展现到页面上,给开发带来了极大的方便. Java也可以通过第三方插件JRebel实现热部署,不用频繁的重启To ...

  4. 如何设计firemonkey的style样式

    您好,在窗体上添加一个 TStyleBook(StyleBook1), 可以载入.编辑.另存这些样式.编辑 StyleBook1 后, 可以把它直接赋给窗体的 StyleBook 属性: proced ...

  5. YARN分析系列之一 -- 总览YARN组件

    下图简单明了的描述了hadoop yarn 的功能是如何从 hadoop 中细化出来的. 注:图片来自 https://apprize.info/php/hadoop/9.html Hadoop 从 ...

  6. Android native进程间通信实例-binder篇之——简单的单工通信

    网上找了很多binder相关文章,大部分都是在跟踪binder实现源代码,然后再把框架代码贴出来,看着实在费力. 这篇文章从实际出发,直接用一个案例下手,后续想了解binder相关原理的话,可以参考& ...

  7. Python 爬虫从入门到进阶之路(七)

    在之前的文章中我们一直用到的库是 urllib.request,该库已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Hum ...

  8. sails连接monogodb数据库

    1.全局安装:cnpm install -g sails 2.命令窗口进入项目位置 新建项目:sails new sails_cqwu --fast,选择2(快速建立sails项目) 3.cd进入sa ...

  9. 【JDK】ArrayList集合 源码阅读

    这是博主第二次读ArrayList 源码,第一次是在很久之前了,当时读起来有些费劲,记得那时候HashMap的源码还是哈希表+链表的数据结构. 时隔多年,再次阅读起来ArrayList感觉还蛮简单的, ...

  10. 有用的java学习网站

    1.在线编译运行Java代码的网站 https://www.compilejava.net/ 2. 综合学习网站: http://www.tutorialspoint.com/,可以在线执行多种编程语 ...