c语言进阶13-线性表之顺序表
一、 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. ACM算法:两个非递减有序的顺序表合并为一个非递减有序的顺序
问题描述:已知顺序表la是一个非递减有序的顺序表,lb也是一个非递减有序的顺序表。将两个线性别合并,合并后的线性表lc也必须是非递减有序的。
合并算法如下:
#define MAX 100 struct slist { int a[MAX]; int len; }; void main() { int i,p,q,r; struct slist lc; //合并后的顺序表lc struct slist la={{,,,,},},lb={{,,,,},}; //定义顺序表la,lb并赋初值。 lc.len=; //lc的初始长度为0 printf("顺序表la的元素是:"); for(i=;i<la.len;i++) { printf("%d\t",la.a[i]); } printf("\n顺序表lb的元素是:"); for(i=;i<lb.len;i++) { printf("%d\t",lb.a[i]); } p=; //p标识la顺序表的下标 q=; //q标识lb顺序表的下标 r=; //r标识lc顺序表的下标 while(p<la.len && q<lb.len) //当两个两表都为到最后一个元素 { //将小的放到新顺序表中 if(la.a[p]<=lb.a[q])
{
lc.a[r]=la.a[p];
r++;
p++;
lc.len++; }
else
{
lc.a[r]=lb.a[q];
r++;
q++;
lc.len++;
}
}
while(p<la.len) //la表未结束还有元素,将剩余元素加到lc表
{
lc.a[r]=la.a[p];
r++;
p++;
lc.len++;
} while(q<lb.len) //lb表未结束还有元素,将剩余元素加到lc表
{
lc.a[r]=lb.a[q];
r++;
q++;
lc.len++;
}
printf("\n合并顺序表后lc的元素是:"); //输出合并后的顺序表
for(i=;i<lc.len;i++)
{
printf("%d\t",lc.a[i]);
}
}
该算法运行结果如图所示:
五、 顺序表算法的时间复杂度分析:
现在我们来分析一下,插入和删除的时间复杂度。
先来看最好的情况,如果元素要插入到最后一个位置,或者删除最后一个元素,此时时间复杂度O(1),因为不需要移动元素的,就如同来了一个新人要正常排队,当人是排在最后,如果此时他又不想排了,那么他一个人离开就好了,不影响任何人。
最坏的情况呢,如果元素要插入到第一个位置或者删除第一个元素,此时时间复杂度是多少呢?那就意味着要移动所有的元素向后或者向前,所以这个时间复杂度为O(n)。
插入元素:在第i个位置插入元素需要移动n-i+1个元素,平均移动n/2个元素
删除元素:在第i个位置删除元素需要移动n-i个元素,平均移动(n-1)/2个元素
我们前面讨论过时间复杂度的推导,可以得出,平均时间复杂度还是O(n)。
这说明什么?线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数不太变化,而更多是存储数据应用。当然,它的优缺点还不只是这些。
顺序表代码
/* Note:Your choice is C IDE */
#include "stdio.h"
#define MAX 20
typedef int type; typedef struct {
type arr[MAX];
int length;
}sqlist; void fun(sqlist *L,type e)
{
int k;
int i;
printf("输入要插入的位置\n");
scanf("%d",&i);
if(L->length==MAX){
printf("线性表已满\n");
}
if(i<||i>L->length+){
printf("输入错误");
}
/*查找
printf("%d",L->arr[i-1]);*/
/*修改
L->arr[i-1]=e;*/
/*添加
for(k=L->length;k<=i-1;k--){
L->arr[k+1]=L->arr[k];
}
L->arr[i-1]=e;
L->length++;*/
/*删除
for(k=i-1;k<L->length;k++)
{ L->arr[k]=L->arr[k+1];
}
L->length--;
*/
}
void main(){
int i;
sqlist L={{,,,,,},};
/* for(i=0;i<6;i++){
scanf("%d",&L->arr[i]);
L->length=i+1;
}*/
for(i=;i<L.length;i++){
printf(" %d ",L.arr[i]);
}
fun(&L,); for(i=;i<L.length;i++){
printf(" %d ",L.arr[i]);
}
}
神州租车
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
double money=0.0;//定义全局变量账号金额
void menu();//功能菜单
void carinfor();//功能1
void carcheck();//功能2
void main()//主函数
{
int bh;
menu();
for(;;){
printf("\n请输入主菜单功能标号:");
scanf("%d",&bh);
switch(bh){
case :
carinfor();
break;
case :
carcheck();
break;
case :
exit();
default:
printf("您输入的功能编号有误,请重新输入!");
break;
}
}//无限循环
}
void menu()
{
printf("\n\n\t\t\t══ 神州租车、中国租车领导者 ══\n");
printf("\t\t\t1:神州专车信息\n");
printf("\t\t\t2:神州专车结算\n");
printf("\t\t\t0:退出\n");
}//菜单实现
void carinfor()
{
char arr[],brr[],ch;//车名,人名,判断条件
for(;;){
printf("请选择车型:奥迪/东风本田:");
fflush(stdin);
gets(arr);
if(strcmp(arr,"奥迪")!=&&strcmp(arr,"东风本田")!=){
printf("暂时没有您需要的车型\n");
continue;
}
printf("请选择司机:吴亦凡/黄晓明:");
fflush(stdin);
gets(brr);
if(strcmp(brr,"吴亦凡")!=&&strcmp(brr,"黄晓明")!=){
printf("%s暂时没有上线\n",brr);
continue;
}
printf("是否确认提交订单Y/N:");
ch=getchar();
if(ch=='Y'){
printf("\n本次专车出行,所选车型是;%s,专车司机是:%s",arr,brr);
break;
}else{
printf("取消成功!");
break;
}
}//for循环
}//功能1实现
void carcheck(){
int number;//订单编号
int distance,time;//里程,时间
char checkstyle[],choice;//支付方式,选择支付
double money1;//充值金额
double sum;//总金额
printf("请输入订单编号;");
scanf("%d",&number);
printf("请输入本次行车里程;");
scanf("%d",&distance);
printf("请输入本次行车时间(分钟);");
scanf("%d",&time);
printf("请输入付款方式;");
scanf("%s",checkstyle);
if(strcmp(checkstyle,"支付宝")==){
printf("请选择充值金额:");
scanf("%lf",&money1);
printf("充值金额满100元得150元\n");
money+=money1;
if(money>=){
money+=;
} printf("确认支付Y/N:");
scanf(" %c",&choice);
if(choice=='Y'){
sum=+(0.7*time)+(4.5*distance);
if(money>=sum){
printf("顾客您好,您的订单编号是%d,行车距离是%d里程,账号金额是%.2lf元,专车费用是%.2lf元,支付后账户余额是%.2lf元",number,distance,money,sum,money-sum);
}else{
printf("账号金额不足,请及时充值\n");
}
}else if(choice=='N'){
printf("取消支付成功!\n");
}else{
printf("输入字符有误\n");
}//是否支付
}else{
printf("支付方式无效!");
}//关于支付宝的判断
}//功能2 结束
c语言进阶13-线性表之顺序表的更多相关文章
- c/c++ 线性表之顺序表
线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...
- [C++]数据结构:线性表之顺序表
1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...
- C#线性表之顺序表
线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
- [C++]线性链表之顺序表<一>
顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...
- [C++]线性链表之顺序表<二>
/* @content 线性链表之顺序表 @date 2017-3-21 1:06 @author Johnny Zen */ /* 线性表 顺序表 链式表[带头指针/不 ...
- 线性表之顺序表C++实现
线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...
- [数据结构 - 第3章] 线性表之顺序表(C++实现)
一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...
- 数据结构Java实现02----线性表与顺序表
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 数据结构Java实现01----线性表与顺序表
一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...
- c语言进阶12-线性表之顺序表
一. 线性表的定义 为什么要学习线性表呢? 因为我们日常生活中存在种数据关系,计算机程序是为了解决日常生活的数据关系,因此我们要学习线性表. 线性表是什么呢? 线性表是由n个元素组成的有限序列. 需 ...
随机推荐
- Delphi中Menu设置Images属性后快捷按键下划线被隐藏解决方法
现象:MainMenu设置Images属性后,看不到快捷按键的下划线,如:新建(&N) 分析:VCL中Menus.pas单元的代码,看到如下语句procedure TMenuItem.Adva ...
- 安装Cloudera Impala
安装Cloudera Impala Cloudera Impala是Cloudera Enterprise Core的开源扩展,用于快速返回查询结果. Impala作为你环境的插件,与其他组件的安装独 ...
- 玩转java多线程(wait和notifyAll的正确使用姿势)
转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...
- 【JDK】ArrayList集合 源码阅读
这是博主第二次读ArrayList 源码,第一次是在很久之前了,当时读起来有些费劲,记得那时候HashMap的源码还是哈希表+链表的数据结构. 时隔多年,再次阅读起来ArrayList感觉还蛮简单的, ...
- 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM
CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...
- mybatis以及预编译如何防止SQL注入
SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injection - Wikipedia SQL ...
- SSM框架学习笔记_第1章_SpringIOC概述
第1章 SpringIOC概述 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 1.1 控制反转IOC IOC(inversion of controller)是一种概念 ...
- 如何确保TCP协议传输稳定可靠?
TCP,控制传输协议,它充分实现了数据传输时的各种控制功能:针对发送端发出的数据包确认应答信号ACK:针对数据包丢失或者出现定时器超时的重发机制:针对数据包到达接收端主机顺序乱掉的顺序控制:针对高效传 ...
- core文件生成和路径设置
在程序崩溃时,内核会生成一个core文件,即程序最后崩溃时的内存映像,和程序调试信息. 之后可以通过gdb,打开core文件察看程序崩溃时的堆栈信息,可以找出程序出错的代码所在文件和函数. 1.cor ...
- ECharts 地图绘制与钻取简易接口
1.地图绘制过程原理 给定范围边界经纬度数据,再给它个名字就构成了绘制地图的基础.也就是说,你可以绘制任意形状的地图版块. 2.地图数据生成 中国以及省市县等地图的基础数据可以从这里生成与下载. ht ...