热门标签 | 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语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文深入解析了 Kuangbin 数学训练营中的经典问题——Ekka Dokka,并通过详细的代码示例和数学推导,探讨了该问题的多种解法及其应用场景。通过对算法的优化和扩展,本文旨在为读者提供全面的理解和实用的参考。 ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • 解题心得:UVA1339(逻辑分析与字符串处理+排序算法)
    解题心得:UVA1339(逻辑分析与字符串处理+排序算法) ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在Linux系统中,通过使用`read`和`write`函数可以实现文件的高效复制操作。`open`函数用于打开或创建文件,其返回值为文件描述符,成功时返回一个有效的文件描述符,失败时返回-1。`path`参数指定了要操作的文件路径,而`oflag`参数则定义了文件的打开模式和属性。此外,为了确保数据的完整性和一致性,还需要合理处理文件读取和写入过程中的错误和异常情况。 ... [详细]
  • 本文详细介绍了267 Collections的特性和应用场景。作为Java集合框架中的核心接口,Collection接口是所有单列集合类的顶级接口,涵盖了列表、集合和队列等数据结构。通过具体的应用实例,本文深入解析了Collection接口的各种方法和功能,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 图论入门基础教程
    图论是计算机科学和数学中的重要分支,本教程旨在为初学者提供全面的基础知识。通过实例解析,如“昂贵的聘礼”问题,讲述了一个年轻探险家在印第安部落与酋长女儿的爱情故事,展示了图论在解决实际问题中的应用。教程内容涵盖了图的基本概念、表示方法以及常见算法,适合各类读者学习。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
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社区 版权所有