数据结构顺序表(电话通讯录)
- 格式:docx
- 大小:18.60 KB
- 文档页数:5
数据结构(c语言版)课后习题答案完整版数据结构(C语言版)课后习题答案完整版一、数据结构概述数据结构是计算机科学中一个重要的概念,用来组织和存储数据,使之可以高效地访问和操作。
在C语言中,我们可以使用不同的数据结构来解决各种问题。
本文将提供完整版本的C语言数据结构的课后习题答案。
二、顺序表1. 顺序表的定义和基本操作顺序表是一种线性表,其中的元素在物理内存中连续地存储。
在C 语言中,我们可以通过定义结构体和使用指针来实现顺序表。
以下是顺序表的一些基本操作的答案:(1)初始化顺序表```ctypedef struct{int data[MAX_SIZE];int length;} SeqList;void InitList(SeqList *L){L->length = 0;}```(2)插入元素到顺序表中```cbool Insert(SeqList *L, int pos, int elem){if(L->length == MAX_SIZE){return false; // 顺序表已满}if(pos < 1 || pos > L->length + 1){return false; // 位置不合法}for(int i = L->length; i >= pos; i--){L->data[i] = L->data[i-1]; // 向后移动元素 }L->data[pos-1] = elem;L->length++;return true;}```(3)删除顺序表中的元素```cbool Delete(SeqList *L, int pos){if(pos < 1 || pos > L->length){return false; // 位置不合法}for(int i = pos; i < L->length; i++){L->data[i-1] = L->data[i]; // 向前移动元素 }L->length--;return true;}```(4)查找顺序表中的元素```cint Search(SeqList L, int elem){for(int i = 0; i < L.length; i++){if(L.data[i] == elem){return i + 1; // 找到元素,返回位置 }}return -1; // 未找到元素}```2. 顺序表习题解答(1)逆置顺序表```cvoid Reverse(SeqList *L){for(int i = 0; i < L->length / 2; i++){int temp = L->data[i];L->data[i] = L->data[L->length - 1 - i]; L->data[L->length - 1 - i] = temp;}}```(2)顺序表元素去重```cvoid RemoveDuplicates(SeqList *L){for(int i = 0; i < L->length; i++){for(int j = i + 1; j < L->length; j++){if(L->data[i] == L->data[j]){Delete(L, j + 1);j--;}}}}```三、链表1. 单链表单链表是一种常见的链式存储结构,每个节点包含数据和指向下一个节点的指针。
数据结构实验一1、实验目的∙掌握线性表的逻辑特征∙掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算2、实验内容:建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:∙创建一个新的顺序表,实现动态空间分配的初始化;∙根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;∙根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);∙利用最少的空间实现顺序表元素的逆转;∙实现顺序表的各个元素的输出;∙彻底销毁顺序线性表,回收所分配的空间;∙对顺序线性表的所有元素删除,置为空表;∙返回其数据元素个数;∙按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;∙按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;∙判断顺序表中是否有元素存在,对判断结果进行返回;.编写主程序,实现对各不同的算法调用。
2.实现要求:∙“初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;∙“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;∙“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;∙“逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;∙“输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;∙“销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;∙“置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;∙“求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;∙“按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值∙“按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;∙“判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
数据结构课程设计报告一、需求分析1问题描述:根据需要设计出合理的Hash函数,并由此建立相应的Hash表。
要求:1)每个电话用户信息包括(姓名,电话,住址)信息。
2)可以使用姓名与地址查找相应的用户信息。
3)使用Hash表实现。
使用开放定址法解决冲突。
2 基本要求:1)记录每个用户的姓名、地址和电话。
2)从键盘输入,以姓名和地址为关键字分别建立Hash表。
3)用开放地址法解决冲突。
4)分别按姓名和地址查找并显示电话号码。
二、概要设计三、详细设计typedef struct //定义结构Hash表{定义Hash表内的所有成员}HashTable[MaxSize];int Key(char x[])//关键字转换为数值{求字符数组x每个字符对应的asc值的绝对值之和,并返回最后结果}void CreateHT(HashTable ha)//创建Hash表{创建Hash表,并初始化它}void InsertHTna(HashTable ha,int &n,KeyType k,int d) //按姓名插入{以姓名为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。
若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。
}void InsertHTadd(HashTable ha,int &n,KeyType k,int d)//按地址插入{以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。
若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。
}void InserHT(HashTable ha)//Hash表插入{输入用户姓名、地址和电话,分别调用按姓名插入和按地址插入函数进行插入。
数据结构-顺序表判断题1.(neuDS)所谓随机存取,就是通过⾸地址和元素的位序号值可以在O(1)的时间内找到指定的元素。
F2.(neuDS)在顺序表上进⾏插⼊、删除操作时需要移动元素的个数与待插⼊或待删除元素的位置⽆关。
T F3.顺序存储⽅式只能⽤于存储线性结构。
T F4.在顺序表中取出第i个元素所花费的时间与i成正⽐。
T F5.对于顺序存储的长度为N的线性表,删除第⼀个元素和插⼊最后⼀个元素的时间复杂度分别对应为O(1)和O(N)。
T F6.(neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。
F7.顺序存储的线性表可以随机存取。
F8.顺序存储结构的主要缺点是不利于插⼊或删除操作。
F选择题1.⽤数组表⽰线性表的优点是()。
A.便于插⼊和删除操作B.便于随机存取C.可以动态地分配存储空间D.不需要占⽤⼀⽚相邻的存储空间2.阅读下列程序,其功能是()。
typedef struct {ElemType *list;int size;intMaxSize;}SeqList;void fun1(SeqList&L) {inti, j;ElemType temp;for (i=0, j= L.sise-1; i<j; i++, j--) {temp=L.list[i];L.list[i]=L.list[j];L.list[j]=temp;}}A.将顺序表原地逆置B.将链表原地逆置C.将顺序表⾸尾元素对换D.将链表⾸尾元素对换3.顺序存储表⽰中数据元素之间的逻辑关系是由()表⽰的。
A.指针B.逻辑顺序C.存储位置D.问题上下⽂4.顺序表的优点是()。
A.插⼊操作的时间效率⾼B.适⽤于各种逻辑结构的存储表⽰C.存储密度(存储利⽤率)⾼D.删除操作的时间效率⾼5.若线性表最常⽤的操作是存取第i个元素及其前驱的值,则采⽤( )存储⽅式节省时间。
A.单链表B.双向链表C.单循环链表D.顺序表6.数组A[1..5,1..6]每个元素占5个单元,将其按⾏优先次序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为:A.1120B.1125C.1140D.11457.若某线性表最常⽤的操作是存取任⼀指定序号的元素和在最后进⾏插⼊和删除运算,则利⽤哪种存储⽅式最节省时间?A.双链表B.单循环链表C.带头结点的双循环链表D.顺序表8.若长度为n的线性表采⽤顺序结构,在第i个数据元素之前插⼊⼀个元素,需要它依次向后移动()个元素。
实验报告实验名称单链表通讯录一、实验目的1.熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验内容1.用带头结点的单链表作存储结构,实现通讯录单链表的建立、查询、修改、排序、合并、统计、结点的查找、移动以及通讯录链表的输出功能。
三、实验要求设计要求:为了实现通讯录管理的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
主控菜单设计要求:菜单内容程序运行后,给出9个菜单项的内容和输入提示:1.创建通讯录链表;2.将姓名为Name的好友的手机号改为MTel;3.输出通讯录;4.插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名>Name的结点放到该结点后面5.将通讯录按照好友姓名进行非递减排序;6.将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个;7.统计籍贯是“大连”的好友人数;8.将通讯录中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序);9.将通讯录的正中间位置结点之后的全部结点倒置;0.退出管理系统请选择0—9:菜单设计要求:使用数字0—9来选择菜单项,其它输入则不起作用。
四、实验概要设计1)功能框图五. 使用说明1.运行环境:VC6.02.首先选择主控菜单中的操作1,即建表,然后进行其它操作.六.实验截图(见下页)七实验体会附源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define Newsp (TxlList *)malloc(sizeof(struct TxlList))typedef struct TxlList{char Name[16]; //姓名char MTel[11]; //手机号char Tel[9]; //固定电话char EMail[16]; //邮箱地址char BornAddr[20]; //籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称)char BroadN[50]; //博客名struct TxlList *next; //指针域}TxlList, *TxlLink;void Lbuild1(TxlLink &T){//创建文件FILE *fp;TxlLink q;q=Newsp;q=T;int NUM;char filename[20];printf("\n*请输入要创建的通讯录名:\n");gets(filename);if ((fp=fopen(filename, "wb"))==NULL) { /*以写方式在当前目录打开(新建)文件*/printf("can't open file!!!\n");exit(0); //如果文件无法打开,关闭已经打开的其它文件,结束程序。
实验报告课程数据结构及算法实验项目 1.顺序表的建立和基本运算成绩专业班级*** 指导教师***姓名*** 学号*** 实验日期***实验一顺序表的建立和基本运算一、实验目的1、掌握顺序表存储结构的定义及C/C++语言实现2、掌握顺序表的各种基本操作及C/C++语言实现3、设计并实现有序表的遍历、插入、删除等常规算法二、实验环境PC微机,Windows,DOS,Turbo C或者Visual C++三、实验内容1、顺序表的建立和基本运算(1)问题描述顺序表时常进行的运算包括:创建顺序表、销毁顺序表、求顺序表的长度、在顺序表中查找某个数据元素、在某个位置插入一个新数据元素、在顺序表中删除某个数据元素等操作。
试编程实现顺序表的这些基本运算。
(2)基本要求实现顺序表的每一个运算要求用一个函数实现。
(3)算法描述参见教材算法2.3、算法2.4、算法2.5等顺序表的常规算法。
(4)算法实现#include<malloc.h> // malloc()等#include<stdio.h> // NULL, printf()等#include<process.h> // exit()// 函数结果状态代码#define OVERFLOW -2#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等typedef int Boolean; // Boolean是布尔类型,其值是TRUE或者FALSE//-------- 线性表的动态分配顺序存储结构-----------#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量#define LIST_INCREMENT 2 // 线性表存储空间的分配增量typedef int ElemType;struct SqList{ElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(int)为单位)};void InitList(SqList &L) // 算法2.3{ // 操作结果:构造一个空的顺序线性表LL.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW); // 存储分配失败L.length=0; // 空表长度为0L.listsize=LIST_INIT_SIZE; // 初始存储容量}void DestroyList(SqList &L){ // 初始条件:顺序线性表L已存在。
数据结构课程设计通讯录管理系统一、系统需求分析通讯录管理系统的主要目标是提供一个方便、高效的方式来管理联系人信息。
具体需求包括:1、能够添加联系人,包括姓名、电话号码、电子邮件、地址等基本信息。
2、可以对联系人信息进行修改和删除操作。
3、支持按照姓名、电话号码等关键字进行快速查找。
4、能够以列表形式展示所有联系人的信息。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储联系人信息。
考虑到联系人信息的多样性和动态性,链表是一个不错的选择。
链表可以方便地进行插入、删除和修改操作,并且能够灵活地调整存储空间。
另外,为了提高查找效率,我们可以结合使用哈希表。
通过将联系人的关键信息(如姓名或电话号码)进行哈希运算,快速定位到对应的联系人节点。
三、系统功能实现1、添加联系人功能当用户选择添加联系人时,系统会提示用户输入联系人的各项信息。
这些信息被封装成一个结构体,并通过链表的插入操作添加到链表中。
同时,将关键信息映射到哈希表中,以便后续快速查找。
2、修改联系人功能用户输入要修改的联系人的关键字,系统通过哈希表快速找到对应的联系人节点。
然后,提示用户输入修改后的信息,并更新链表和哈希表中的数据。
3、删除联系人功能与修改功能类似,通过关键字找到联系人节点,从链表和哈希表中删除相应的节点和信息。
4、查找联系人功能用户输入查找关键字,系统通过哈希表进行快速定位,如果找到匹配的联系人,则显示其详细信息。
5、展示所有联系人功能遍历链表,将所有联系人的信息以列表形式输出到屏幕上。
四、系统界面设计为了提高用户体验,系统设计了简洁直观的界面。
主界面提供了添加、修改、删除、查找和展示所有联系人等功能选项。
用户通过选择相应的选项,进入对应的操作流程。
五、代码实现示例以下是部分关键代码的示例:```c//联系人结构体typedef struct Contact {char name50;char phoneNumber20;char email50;char address100;struct Contact next;} Contact;//哈希表节点结构体typedef struct HashNode {char key50;Contact contact;struct HashNode next;} HashNode;//链表插入联系人void insertContact(Contact head, Contact newContact) {newContact>next = head;head = newContact;}//哈希函数unsigned int hashFunction(const char key) {unsigned int hash = 0;while (key) {hash =(hash << 5) + key++;}return hash % HASH_TABLE_SIZE;}//查找联系人Contact findContact(Contact head, const char key, HashNode hashTable) {unsigned int hashValue = hashFunction(key);HashNode node = hashTablehashValue;while (node) {if (strcmp(node>key, key) == 0) {return node>contact;}node = node>next;}Contact current = head;while (current) {if (strcmp(current>name, key) == 0 ||strcmp(current>phoneNumber, key) == 0) {//更新哈希表HashNode newNode =(HashNode )malloc(sizeof(HashNode));strcpy(newNode>key, key);newNode>contact = current;newNode>next = hashTablehashValue;hashTablehashValue = newNode;return current;}current = current>next;}return NULL;}```六、系统测试在完成系统的开发后,需要进行全面的测试以确保系统的稳定性和可靠性。
重庆交通大学计算机与信息学院数据结构实验报告实验名称:顺序表操作实验性质:课程安排实验所属课程:数据结构指导教师:班级: 2008级3班学号:姓名:完成时间: 2010年 4 月 7 日目录封面 (1)目录 (2)一、实验目的 (3)二、实验内容及要求................................................. (3)(1)实验内容(2)实现功能(3)上交内容三、实验设备及软件 (4)四、设计方案 (5)(一)题目:顺序表及其相关操作(二)设计的主要思路 (5)(三)主要功能 (5)(四)程序大致流程图 (6)五、主要代码(略) (7)六、测试结果及说明 (7)七、实验体会 (10)一、实验目的培养学生在程序设计方面知识的综合应用能力及程序设计能力(包括编制能力及程序调试能力)二、实验内容及要求(1)以顺序存储方式实现线性表进行简单的图书管理,图书信息由学生自行定义。
(2)主要实现以下功能:增加图书、删除图书、修改图书信息、查询与定位(查询方式由学生自行设计)、显示与浏览、图书信息文件的打开与保存等(3)上交内容:1、实验报告:要求内容充实、结构完整、格式规范、说明详细等2、源代码与数据文件:将所有的源代码与测试用数据文件一并压缩后提交注:实验报告、源代码中均需要注明自己的学号、姓名、年级、专业、班级等信息三、实验设备及软件计算机、Visual C++6.0四、设计方案(一)题目:顺序表及其相关操作(二)设计的主要思路1、建立能保存图书信息的数据类型,定义类book1)由于本次实验要求,图书信息自己定义,所以本次选用双精度型作为编号,字符串类型的名称和作者以及整型的页数;2)根据原来定义类的经验,本次程序同样定义了比较完善的共有成员函数,其中包括设置私有成员的值(含有函数重载,包括有参函数和无参函数)、私有成员数据的获取、book数据类型赋值符号的重载、输入、输出,以及文件操作的读入数据函数。
数据结构用顺序表实现的电话通讯录(C语言)#include<stdio.h>#include<malloc.h>#include<math.h>#include<string.h>#define FALSE 0#define ERROR 0#define OK 1#define INFEASIBLE -1#define LIST_INIT_SIZE 10#define LIST_INCREMENT 5#define N 5typedef int Status;typedef struct{ char name[10]; //姓名char num[15]; //号码}student;typedef struct{student *elem;//存储空间基址int length;//当前长度int listsize;//当前分配的存储空间(以sizeof(student)为单位) }Sqlist;Sqlist L; //定义全局变量L 为Sqllist类型Status ListInsert(Sqlist &L,int i,student e){//插入学生信息到顺序表L中int j;student *newbase;if(i<1||i>L.length+1) return ERROR; //i值不合法if(L.length>=L.listsize)//当前存储空间已满,增加分配{newbase=(student*)realloc(L.elem,(LIST_INIT_SIZE+LIST_INCREMENT)*(sizeof(student)));if(!newbase) //存储分配失败exit(OVERFLOW);L.elem=newbase;//新基址L.listsize+=LIST_INCREMENT;//增加存储容量}for(j=L.length;j>=i;j--)L.elem[j]=L.elem[j-1]; //插入位置及之后元素的右移L.elem[i-1]=e;L.length++;return OK;void InitList(Sqlist &L){//创建顺序表L.elem=(student *)malloc(LIST_INIT_SIZE*sizeof(student));if(!L.elem) exit(OVERFLOW);//存储分配失败L.length=0;//空表长度L.listsize=LIST_INIT_SIZE;//初始存储容量}void ListTraverse(Sqlist L,void(*vi)(student &)){//显示顺序表中的所有记录system("cls");printf("姓名电话号码\n");student *p;int i;p=L.elem;for(i=1;i<L.length+1;i++)vi(*p++);printf(" 输入0:返回菜单请输入您的选择:");}void print(student &a){//信息输出printf("%-10s%-8s",,a.num);printf("\n");}int ListLength(Sqlist L) //返回顺序表的长度{ return L.length; }int LocateElem(Sqlist L,student e,Status(*compare)(student,student)){//返回L中第一个与e满足关系compare的数据的位序,//若这样的数据不存在,则返回为0;int i=1;//i的初值为第1个元素的位序student*p=L.elem;//p的初值为第1个元素的存储位置while(i<=L.length&&!compare(*p++,e))i++;if(i<=L.length)return i;elsereturn ERROR;}Status ListDelete(Sqlist &L,int i,student &e)//在顺序表L中删除第i个元素,并返回OKsystem("cls"); //清除屏幕int j;if(i<1||i>L.length) //i值不合法return ERROR;else{e=L.elem[i-1];//p为删除元素的位置for(j=i;j<=L.length;j++) L.elem[j-1]=L.elem[j];L.length--;return OK;}}void wrong(){//错误提示信息输出printf("you have inputed a wrong number");printf(" please input the number that is between 0 and 8");}void Delete(Sqlist &L){//根据i删除顺序表中的记录student e;int j;printf("请输入要删除的位置(1≦i≦%d):",L.length+1);scanf("%d",&j);ListDelete(L,j,e);printf("已删除!");printf("输入0:返回菜单请输入您的选择:");}void ScanIn(Sqlist &L){//信息输入system("cls");int i;student e;char a[2];printf("请输入信息:\n");do{student *p=L.elem;printf("请输入姓名:");scanf("%s",);printf("请输入电话号码:");scanf("%s",e.num);printf("请输入你要插入的位置(1≦i≦%d): ",L.length+1);scanf("%d",&i);ListInsert(L,i,e);jump:printf("是否继续输入信息(y/n)");scanf("%s",a);}while(strcmp(a,"y")==0||strcmp(a,"Y")==0);printf("输入0:返回菜单请输入您的选择:");}student stu[N]={{"小易","137****1111"},{"小二","134****2222"},{"小伞","187****3333"},{"小斯","158****4444"},{"小武","134****5555"}};int stuIntsertList(Sqlist &L){//将结构体数组stu中的记录插入到顺序表int i,j;for(i=0;i<N;i++)j=ListInsert(L,i+1,stu[i]);system("cls");if(j)printf("已成功加入到顺序表中\n");printf(" 输入0:返回菜单请输入您的选择:");return OK;}void menu(){//菜单函数printf("\t\t *************************************\n");printf("\t\t * 1. 导入记录*\n");printf("\t\t * 2. 输入记录*\n");printf("\t\t * 3. 删除记录*\n");printf("\t\t * 4. 显示所有记录*\n");printf("\t\t *0. 返回本菜单*\n");printf("\t\t *************************************\n\n\n");}//开始函数void start(){printf("\n");printf("\t\t\t**************************\n");printf("\t\t\t* 欢迎使用*\n");printf("\t\t\t* 电话查询系统*\n");printf("\t\t\t**************************\n");printf("\t\t\t* *\n");printf("\t\t\t**************************\n");printf("\n");menu();}int main(){int i=0,j;student e;Sqlist p,q;InitList(L);start();while(scanf("%d",&i)){switch(i){case 1: stuIntsertList(L); break;case 2: ScanIn(L);break;case 3: Delete(L);break;case 4: ListTraverse(L,print);break;case 0: menu();break;default:wrong();}}return 0;}。