顺序表的应用__电话本

顺序表的建立及使用

顺序表: 就所谓的数组式操作
编程实现顺序存储结构中的基本操作的实现(电话本的建立、插入、删除、修改、逆置、查找、输出)
整个操作过于简陋, 只对上述功能做叙述, 采用结构体数组实现, 本打算用class操作, 可因为某种原因就搁置了………..
代码中的注释部分是用于测试数据, 电话本只存有number, name

//size全局变量表示电话本当前大小不包含0位置,0号位置作为中间变量处理, 重新申请中间变量太麻烦了就省略 
//
#include<cstdio>
#include<cstring>
#define MAXSIZE 100
#define null 0int size=0; //表示当前电话本中有几个联系人的信息typedef struct{char name[10];char number[12];
}telephone;telephone t[MAXSIZE];//创建结构体数组的时候,可采用new,此处对此操作省略
void create();
int find(int lo,int hi,telephone t[],char* target_value);
void insert(telephone t[],int size);
void display(telephone t[],int size);
void convert(telephone t[],int size); void create(){int t_size;printf("输入需要创建的电话本大小");scanf("%d",&t_size);insert(t,t_size+1);
//  printf("%d\n",size); 
}int find(int lo,int hi,telephone t[],char target_value[]){//使用二分查找if(lo>=hi)return null;//递归基 if(strcmp(target_value,t[(lo+hi)/2].name)==0) //递归基 return (lo+hi)/2;if(strcmp(target_value,t[(lo+hi)/2].name)>0)return find((lo+hi)/2+1,hi,t,target_value);else if(strcmp(target_value,t[(lo+hi)/2].name)<0)return find(lo,(lo+hi)/2,t,target_value);}
//在插入的过程中使用插入排序,以便于find操作
void insert(telephone t[],int t_size){int i,j;for(i=size+1;i<t_size;i++){printf("输入姓名,电话\n"); scanf("%s%s",t[i].name,t[i].number);//t[0]为哨兵,作为每次插入的中间变量strcpy(t[0].name,t[i].name);//哨兵元素每次表示要插入的元素(该元素先插到数组的尾部)strcpy(t[0].number,t[i].number);j=i-1;//此时的j表示待插入元素的前一个元素 //待插入的元素比哨兵元素小,进行移动覆盖,查找到比哨兵元素小的值时//将哨兵元素放到此位置while((strcmp(t[j].name,t[0].name)>0)){strcpy(t[j+1].name,t[j].name);strcpy(t[j+1].number,t[j].number);j--;}//此处的j指向刚插入的元素的位置 strcpy(t[j+1].name,t[0].name);//哨兵放置 strcpy(t[j+1].number,t[0].number); ++size; //每插入一个人的信息,size增加一次
//          printf("当前i=%d insert后size=%d\n",i,size); }
//      printf("insert后size=%d\n",size); return; 
}int remove(telephone t[],char* target_value,int t_size){
//在删除的过程中出现,将局部变量的值的名称设置了和全局变量一致,出现size无法减少的情况 int i; int location=find(0,size,t,target_value);
//  printf("find=%d\n",location); if(location==0) return null;for(i=location;i<=size;i++){//将要删除的元素进行覆盖处理,令i=size,可实现将最后一个元素变为"\0" strcpy(t[i].name,t[i+1].name);strcpy(t[i].number,t[i+1].number);} 
//  strcpy(t[i].name,"\0");
//  strcpy(t[i].number,"\0");//将要删除的元素的name.number置为空串
//  if(location==size){//判断是否删除最后一个元素,若是则需要进行对0号元素更新,防止insert出现错误//  strcpy(t[0].name,t[i-1].name);//  strcpy(t[0].number,t[i-1].number);//}size--;return location; 
//  printf("remove后size=%d\n",size); 
}void display(telephone t[],int size){char c;
//可在display中引入倒置, 此处不做叙述for(int i=1;i<=size;i++)printf("%d=姓名:%s, 号码:%s\n",i,t[i].name,t[i].number);return; 
}void convert(telephone t[],int size){//倒置处理for(int i=1;i<=size/2;i++){strcpy(t[0].name,t[i].name);strcpy(t[i].name,t[size-i+1].name);strcpy(t[size-i+1].name,t[0].name);//name做倒置strcpy(t[0].number,t[i].number);strcpy(t[i].number,t[size-i+1].number);strcpy(t[size-i+1].number,t[0].number);//number倒置}
}int main(){int i,key=1;char *c; //用于插入, 删除时临时的中间变量, 也可使用数组while(key){ printf("1-创建电话本\n 2-插入账户信息\n 3-查找号码\n 4-删除号码\n 5-查看所有信息\n 6-将电话本倒置\n 7-关闭\n");scanf("%d",&i);switch(i){case 1:create();fflush(stdin);break;if(create_flag==1){ case 2:insert(t,size+2);fflush(stdin);break;//当执行单步插入的时候形参要修改为在size的基础上扩大1,但是t[0]并不存数据,所以size+2处理 case 3:printf("输入查找的元素,0表示查找失败\n 查找的姓名:");scanf("%s",c);printf("所在的位置是%d\n",find(1,size,t,c));fflush(stdin);break;case 4:printf("输入要删除的元素,0表示删除失败\n 删除的姓名:");scanf("%s",c);printf("删除元素的位置是%d\n",remove(t,c,size));fflush(stdin);break;case 5:display(t,size);fflush(stdin);break;case 6:convert(t,size);fflush(stdin);break;}else printf("未创建电话本,不可删除,查找,展示,倒置操作"); case 7: key=0;break; }} return 0;
} 

在写代码的过程中出现的问题是:

  • 二分查找的时候没有做尾递归处理,导致返回值出现问题, 不能正确的返回出是否查找到当前元素的位置, 处理find((lo+hi)/2+1,hi,t,target_value); 写成做 (lo+hi)/2; 导致在递归查找的过程中出现死递归, 不能返回出来
  • 在remove中将局部变量的名称与全局变量的名称写成一样的(size), 导致size–出错; 真是愚蠢
  • 进行代码调试的时候只是从逻辑的角度分析问题, 而没有写printf语句观察程序的运行过程, 细心考虑每个变量的变化情况, 造成无法准确地定位错误的位置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拨号云服务器怎么自动配置网关_云服务器配置网站卡慢怎么办

网站访问卡慢有很多原因&#xff0c;一次完整的 HTTP 请求包括域名解析、建立 TCP 连接、发起请求、云服务器接收到请求进行处理并返回处理结果、浏览器对 HTML 代码进行解析并请求其他资源&#xff0c;以及对页面进行渲染呈现。其中&#xff0c;HTTP 的请求过程经历了用户本地…

TVS 和压敏电阻联合使用进行浪涌保护时,压敏电阻的压敏电压要低于TVS 的钳位电压 VC。

TVS(瞬态电压抑制器)二极管和MOV(金属氧化物压敏电阻)通常被用于电路中以提供浪涌保护。当两者联合使用时,设计要求MOV的压敏电压低于TVS二极管的钳位电压VC是因为: 1、分担能量: MOV设计用于吸收和分散大量能量,能够在遭受浪涌时承受较长时间的高电压。MOV在其压敏电压…

通俗理解Java中的Lambda表达式

Lambda Lambda表达式支持将代码块作为方法参数, 允许使用更为简洁的方式实现抽象类或接口的抽象方法, 而不再是通过匿名内部类的方式, 它具有对某一方法重写或实现的功能; 接下来通过一个简单的例子了解一下 public class LambaExpressionDemo {public void eat(Eatable e) {…

中断下半部机制-softirq-Tasklet-工作队列

中断上半部和下半部 在中断上半部,就是中断处理函数里面,是关中断的,所以为了快速执行,不能放太多的处理代码,只能执行非常短,这就衍生出了中断下半部。下半部主要是为了方便执行大量和本次中断相关的代码。 中断下半部的三种机制 下半部上下文顺序执行保障softirq中断…

jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理 最近在看jquery源码分析的视频教学&#xff0c;希望将视频中学到的知识用博客记录下来&#xff0c;更希望对有同样对jquery源码有困惑的童鞋能有一点点的帮助&#xff08;我是从一个小白的角度出发&#xff0c;感觉…

手机java软件_浅谈软件开发就业前景

​  我国信息化人才培养还处于发展阶段&#xff0c;导致社会实际需求人才基数远远大于信息化人才的培养基数&#xff0c;使得数以万计的中小企业急需全面系统掌握软件开发基础技能与知识的软件工程师。目前对软件已达20万并且以每年20%左右的速度增长。在未来5年内合格软件人…

单链表的应用(电话本)

单链表 单链表的定义就不说了, 很简单, 请自行百度; 那么从今天的主题<单链表的应用>入手; 利用单链表实现电话本的模拟程序&#xff1a;定义单链表的数据类型&#xff0c;将头插法和尾插法、插入、逆置、删除、查找、修改、计数、输出等操作都定义成子函数的形式&#…

有意思的BAT CMD if while循环 整型自增

引言 我们开发过程中经常遇到写bat进行测试的&#xff0c;需要对这方面有些基础&#xff0c;我给出个示例&#xff0c;也方便自己以后工作做参考。 echo off title qifa :looprem setlocal enabledelayedexpansionset /a a1 echo loop %a%choice /t 1 /d y /n >nulrem 判断…

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...

ufldl学习笔记与编程作业&#xff1a;Multi-Layer Neural Network(多层神经网络识别手写体编程) ufldl出了新教程&#xff0c;感觉比之前的好&#xff0c;从基础讲起&#xff0c;系统清晰&#xff0c;又有编程实践。 在deep learning高质量群里面听一些前辈说&#xff0c;不必深…

sql查询无结果返回空_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...

引言Laravel 提供了 Eloquent ORM 对象用于操作数据库&#xff0c;将其进行抽象方便操作。因为设计的灵活度&#xff0c;大家在使用Model查询数据集的时候&#xff0c;会面临结果为空&#xff0c;记录不存在的问题&#xff0c; 那么如何有效地判断查询记录为空呢&#xff1f;本…

Android 7.1 bootchart触发后导致不断重启

android7.1 bootchart android 7.1的bootchart问题比较多&#xff0c;之前的版本还是比较稳定的&#xff0c;但是7.1之后出现了问题。 由於7.0 bootchart.cpp中有bug, google在7.1上還沒有修复&#xff0c;当我们执行下面的命令后 adb shell echo 120 > /data/bootchart/st…

深度优先搜索小结

深度优先搜索(DFS) 深度优先搜索就好比走迷宫, 不断顺着一条路走, 直到走不通为止, 然后回退到上一个路口再向另外的方向行走(走过的方向就不会再走了,又不是傻子, 知道走不通,还向走不通的方向走), 不断重复(试过所有路口, 状态转移), 重复直到找到唯一的一条合适的路径; DFS…

python 串口_如何使用Python开发串口通讯上位机(一)

用Python开发串口通讯型上位机&#xff0c;其实并非最优解&#xff0c;本系列更新只为个人学习与总结。如果有C语言底子&#xff0c;嵌入式层面的上位机开发&#xff0c;C Builder&#xff0c;C#才是更加好用的利器。1什么是上位机从事过嵌入式软件开发或者工控机开发的&#x…

[RK3399 Android7.1] 开启保存上一次重启前日志

保存上一次重启前日志的必要 分析死机的情况需要我们把上一次不能及时抓取的日志拿到是非常关键的&#xff0c;这个方法非常有利于我们分析内核panic和Android 死机的情况。 开启的方法 内核配置 在dts文件里面添加下面两个节点 ramoops_mem: ramoops_mem { reg <0x0 …

算法题之求二叉树的最大距离

二叉树是一种非常经典的数据结构。如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 下面我们随意构造出一棵二叉树&#xff0c…

MySQL基本操作指令

MySQL 注: MySQL对大小写不敏感, 需要对大小检索, 使用关键字binary, "[]"中内容为可选内容; table_name, tableName表示表名, columnName表示列名, DataType表示表中列数据类型, 粗体部分表示关键字 创建数据库: create database [if not exits] 数据库名;删除数据…

php 公众号验证回调方法_微信公众号关键词自动回复设置方法!

什么是公众号关键词自动回复&#xff1f;在微信公众号平台设置关键词自动回复&#xff0c;可以通过添加规则&#xff0c;关注/订阅的用户发送的消息内容如果是你设置的关键字&#xff0c;即可以实现自动回复预先设置好的内容。关键字自动回复设置方法&#xff1a;1、 首先我们进…

图文|Android 使用Thread 和多线程使用互斥锁

为什么需要多线程进行开发&#xff1f;多线程不管是嵌入式系统RTOS&#xff0c;Linux&#xff0c;还是应用开发&#xff0c;中间件开发&#xff0c;都是必不可少的&#xff0c;做一个技术的时候&#xff0c;如果能做到举一反三&#xff0c;下次使用的时候不会再遇到坑&#xff…

01.轮播图之三 : collectionView 轮播

个人觉得 collection view 做轮播是最方便的&#xff0c;设置下flowlayout 其他不会有很大的变动&#xff0c;没有什么逻辑的代码 lets begin…… 创建自定义的view .h 声明文件 interface CollectionViewShuffling : UIViewproperty (nonatomic,strong)NSArray *array;end .m …

JDBC入门级操作

JDBC:数据库连接, 通过接口实现不同数据库之间的切换, 面向接口编程 JDBC驱动程序将JDBC调用映射成特定的数据库调用 驱动类型: 1.JDBC驱动:JDBC-ODBC桥,最早的实现方式,将JDBC API映射到ODBC API,Java8中已删除 2.直接将JDBC API映射成数据库特定的客户端API,次驱动包含特定数…