热门标签 | 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;}}
}

 


推荐阅读
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
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社区 版权所有