热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实验一:数据结构之顺序表例程简易电话薄

验证结果如下:实现代码如下:#include#include#include#incl

验证结果如下:

实现代码如下:

#include
#include
#include
#include
//#include #define OK 0 //成功执行
#define Err_Memory -1 //内存分配错误
#define Err_InvalidParam -2 //输入参数无效
#define Err_Overflow -3 //溢出错误
#define Err_IllegalPos -4 //非法位置
#define Err_NoResult -5 //无法返回结果或返回结果为空
#define Max_Length 100 //顺序表最大长度
#define Increment_Length 10 //顺序表存储空间分配增量typedef struct {char name[11];char department[15];char phone[15];char mobile[18];
} ElemType; //定义顺序表的元素类型ElemTypetypedef struct {ElemType * data; //data指向存储数据元素的一维数组,初始大小为Max_Lengthint Length; //顺序表的实际长度,其值小于等于ListLengthint ListLength; //当前顺序表分配的空间大小,初始值为Max_Length
} SeqList; //顺序表结构定义typedef int Status; //定义返回状态Status InitList (SeqList *L)
{L->data = (ElemType *)malloc(Max_Length*sizeof(ElemType)); //分配内存空间if (!L->data) //如果内存分配失败,返回内存分配错误return Err_Memory;L->Length = 0; //顺序表的实际长度置为0L->ListLength = Max_Length; //当前顺序表存储大小置为Max_Lengthreturn OK; //成功返回
}Status ClearList (SeqList *L)
{L->Length=0; //顺序表的实际长度置为0return OK; //成功返回}Status EmptyList (SeqList *L)
{return (L->Length == 0); //如果Length为0,返回True,否则返回False
}Status LengthList (SeqList *L)
{return L->Length; //返回顺序表的长度
}/*Status TraverseList (SeqList *L)
{int i;for(i = 0; iLength; i++)printf("%d\t",L->data[i]);
}*/Status InsertList (SeqList *L, int i, ElemType e)
{int k;ElemType * newdata;if (i<1 || i> L->Length &#43; 1) //判断插入位置是否为无效位置return Err_IllegalPos;if (L->Length &#61;&#61; L->ListLength){//如果顺序表满&#xff0c;增加分配&#xff08;增量由Increment_Length指定&#xff09;newdata &#61; (ElemType *)realloc(L->data,(L->ListLength&#43;Increment_Length)*sizeof(ElemType));if(!newdata)return Err_Memory; //如果重新分配失败&#xff0c;返回内存分配错误L->data &#61; newdata; //新基址L->ListLength &#43;&#61; Increment_Length;//增加存储空间大小}for (k&#61;L->Length-1; k>i-1;k--)L->data[k&#43;1] &#61; L->data[k]; //将第i个位置及以后的元素后移一个位置L->data[i-1] &#61; e; //将元素e插入到第i个位置&#xff08;下标为i-1&#xff09;L->Length&#43;&#43;; //顺序表长度加1return OK;
}Status DeleteList (SeqList *L, int i, ElemType *e)
{int k;if (L->Length &#61;&#61; 0)return Err_InvalidParam; //顺序表为空if (i<1 || i>L->Length) //删除位置不合法return Err_IllegalPos;*e &#61; L->data[i-1]; //将第i个元素放到e中for (k &#61; i; kLength; k&#43;&#43;)L->data[k-1] &#61; L->data[k];//将第i&#43;1及其以后元素依次前移一位L->Length --; //表的长度减一return OK;
}//Status LocateList (SeqList *L, ElemType e);Status GetElem (SeqList *L, int i, ElemType *e)
{if (i<1 || i>L->Length)return Err_IllegalPos; //位置不合法*e &#61; L->data[i-1]; //将第i个位置的数据元素保存到ereturn OK;
}void TraverseList(SeqList *L) //遍历算法
{int i;for (i&#61;0;iLength;i&#43;&#43;)printf("%s\t%s\t%s\t%s\t\n",L->data[i].name, L->data[i].department,L->data[i].phone, L->data[i].mobile); //输出姓名&#xff0c;单位&#xff0c;固定电话和移动电话}int LocateList(ElemType e, SeqList *L)//定位算法
{int i &#61; 0;while(iLength&&strcmp(L->data[i].name, e.name)!&#61;0)//从第一个元素比较i&#43;&#43;; //L->data[i].name与e.name相等时 strcmp函数返回0if(iLength) //定位成功&#xff0c;返回e出现的位置return i&#43;1;elsereturn 0; //定位失败
}void main()
{ElemType e, *re;SeqList *List; //声明顺序表int choice, i;List &#61; (SeqList *)malloc(sizeof(SeqList)); //为顺序表List分配地址if (InitList(List)!&#61;OK) //初始化线性表Listreturn;while (1){ //循环操作printf("\n电话本管理\n");printf("1. 插入记录\t2. 查找记录\t3. 删除记录\t4. 浏览记录\t5. 退出\n");printf("\n请选择&#xff08;1-5&#xff09;\n");scanf("%d", &choice);switch(choice){case 1:printf("请输入姓名&#xff1a;");scanf("%s", e.name);printf("请输入单位&#xff1a;");scanf("%s", e.department);printf("请输入固定电话&#xff1a;");scanf("%s", e.phone);printf("请输入移动电话&#xff1a;");scanf("%s", e.mobile);if(InsertList(List, List->Length&#43;1, e) &#61;&#61; OK)printf("\n插入记录成功\n");break;case 2:printf("请输入要查找的姓名&#xff1a;");scanf("%s", e.name);i&#61;LocateList(e, List);if (i>0){re&#61;(ElemType *)malloc(sizeof(ElemType));GetElem(List, i, re);printf("\n详细信息如下&#xff1a;\n\n");printf("姓名&#xff1a;%s\t 单位&#xff1a;%s\t 固定电话: %s\t 移动电话&#xff1a;%s\n",re->name, re->department, re->phone, re->mobile);} else {printf("查无此人");}break;case 3:printf("请输入要删除信息的姓名&#xff1a;");scanf("%s", e.name);i&#61;LocateList(e, List);if (i>0){re&#61;(ElemType *)malloc(sizeof(ElemType));if (DeleteList(List, i, re) &#61;&#61; OK)printf("删除成功\n");elseprintf("删除失败\n");} else {printf("查无此人");}break;case 4:printf("当前共有电话本记录%d条&#xff0c;以下是详细信息&#xff1a;\n\n", List->Length);printf("姓名\t 单位\t 固定电话\t 移动电话\n");TraverseList(List);break;case 5:break;default:printf("选择错误&#xff0c;请重新选择&#xff01;\n");break;}}
}

 


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
author-avatar
最佳永恒的六二
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有