城市链表实验报告 全

城市链表实验报告  全
城市链表实验报告  全

学生实验报告

实验项目:城市链表

课程名称:数据结构

年级:2008

专业:信息管理与信息系统

指导教师:李超锋

实验地点:管理学院综合实验室

完成日期:2010年6月11日

小组成员:陈越08056054

李霞08056053

陈绪08056027

张彬08056021

叶华晶08056026

200 9 学年至20 10 学年度第2 学期

一、实验目的

1、掌握线性表链表的表示和实现;

2、学会抽象定义数据类型;

3、熟练掌握线性表中的查找、插入、删除和更新等操作;

4、学会分析问题,设计适当的解决方案。

二、实验内容

【问题描述】

将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名、城市的位置坐标。要求能够城市名和位置坐标进行有关的查找、插入、删除和更新等操作。【基本要求】

1)、给定一个城市名,返回其位置坐标;

2)、给定一个位置坐标P和一个距离D,泛会所有与P的距离小于等于D的城市。【测试数据】

1)、输入”1”调用函数Create(Store);

新建城市信息:

CQ(1,2) NN(3,4) CD(5,6) ZK(7,8) SZ(9,10) GL(11,12) 输入END键,退出.

2)、输入”2”,调用函数FindCity(Store);

当键入城市名时,返回其城市坐标: 如:键入城市名”GL”,返回坐标:11.00,12.00

3)、输入“3”调用函数FindCityDistance(Store);

如:当给定坐标P(3,4)时,距离5时,就输出所有与P的距离小于等于5的城市信息。

4)、输入”4”,调用函数Insert(Store).进行插入新城市信息操作;

如:插入城市信息:WH(5,8),当进行查找时,能看到插入城市的信息.证明插入成功.

5)、输入”5”,调用函数Delete(Store),进行删除操作:

6)、输入”6”,调用函数UpdateCity(Store),进行更新操作;

7)、输入”7”,退出.

三、实验步骤

(一)需求分析

1、根据题目,我们认为我们所编的程序需要实现以下功能:

(1)、创建一个城市链表,能够输入城市信息,即城市名和城市位置坐标;

(2)、能够根据城市名查询其位置坐标;

(3)、根据离中心坐标距离查询城市名;

(4)、能够插入城市信息;

(5)、能够删除城市信息;

(6)、能够更新城市信息;

(7)、执行完毕,退出程序。

2、演示程序以用户和计算机的对话方式执行,即在在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;输入相应的数据(滤去输入中非法字符),

运算结果显示在其后。

3、程序执行的命令包括: (1)构造函数1;(2)构造函数2;(3)构造函数3;(4)构造函数4;(5)构造函数5; (6)构造函数6;(7)构造函数7。 (二)概要设计

1、为实现上述程序功能,应以有序链表表示集合。 ADT List{ 数据对象:D={

,1,2,}i

i

ElemSet i a a

∈=≥…,n,n 0

数据关系:

111{,,,2,}i i i i D i a a a a R --=??∈=…,n

基本操作: InitList(&L)

操作结果:构造一个空的线性表L ,即初始化表L 。 ListLength (L )

初始条件:线性表L 已存在。

操作结果:求线性表L 中数据元素个数,即求表长。 GetElem(L ,i ,&e )

初始条件:线性表L 已存在,1≤i ≤ListLength (L ) 操作结果:用e 返回L 中第i 个数据元素的值。 LocateElem (L,e,compare())

初始条件:线性表L 已存在,compare()是数据元 素判定函数。

操作结果:返回L 中第一个与e 满足关系compare() 的数据元素的位置。若L 中不存在这样 的数据元素 ,则返回值0。 ListInsert(&L,i,e)

初始条件:线性表L 已存在,1<=i<=ListLength(L)+1 操作结果:在L 中第i 个位置之前插入新的数据元素 e,L 的长度加1。

ListDelete(&L,i,&e)

初始条件:线性表L 已存在且非空,1<=i<=ListLength(L)

操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1。 }ADT List

2、本程序包含两个模块 (1)主程序模块: Void main () { 初始化

Switch (){ 接受命令; 处理命令;

}

}

System(“pause”);

Return 0;

(2)、函数调用模块:

typedef struct CITYLIST cityList;

void Init(cityList *LHead);

void Insert(cityList *LHead);

void Delete(cityList *LHead);

void Create(cityList *LHead);

void FindCity(cityList* LHead);

void FindCityDistance(cityList* LHead);

void UpdateCity(cityList* L

(三)详细设计

1、城市名类型、位置坐标类型、节点类型和指针类型

Typedef char CityNameType; //城市名类型

Typedef float NumType; //位置坐标类型

Typedef struct CityList{

CityNameType data;

CityNumType data;

CityList *next;

}CityList, *LHead; // 结点类型,指针类型

2、函数声明部分

void Init(cityList *LHead);

void Insert(cityList *LHead);

void Delete(cityList *LHead);

void Create(cityList *LHead);

void FindCity(cityList* LHead);

void FindCityDistance(cityList* LHead);

void UpdateCity(cityList* LHead);

3、根据对单链表的基本操作,来通过函数调用实现对每个操作的实现。

void Init(cityList *LHead) ;

//构造一个带头结点的空的链表L;并返回TURE;

//若分配空间失败,则令L.head为NULL,并返回FALSE

voidCreate(cityList *LHead);

//在线性表中创建城市信息。

void FindCity(cityList* LHead)

//根据城市名查找城市位置,如果LHead所指向的结点信息与所给城市名相同,则返回其位置坐标。

//若不符合,则LHead指向LHead->Next。

void FindCityDistance(cityList* LHead)

//计算出LHead所指城市坐标与所给中心坐标的距离,若小于等于所给距离,则返回

//LHead所知城市信息。然后LHead=LHead->Next。

void Delete(cityList *LHead)

//删除LHead所指向结点。

void UpdateCity(cityList* LHead)

//在链表CityList中,找到LHead所指向结点的CityName与所给匹配的信息,并返回//TURE,否则,LHead=LHead->Next,并返回FALSE.

其中,部分操作的伪代码算法如下:

void Init(cityList *LHead)

{

LHead->Next = NULL;

} //建立一个带头结点的单链线性表,LHead指向头结点。

void Insert(cityList *LHead)

{

cityList* newNode; //定义指针结构为cityList型

char m;

newNode = (cityList*)malloc(sizeof(cityList)); //生成新结点

if(newNode == NULL) //验证空间申请是否成功

{

printf("内存分配失败\n");

return; //若分配内存不成功,则返回继续分配。

}

printf("请输入城市名\n");/

scanf("%s",newNode->cityName);

printf("请输入城市坐标x,y\n");

scanf("%f%c%f",&newNode->x,&m,&newNode->y); //将城市信息填入新节点中

while(LHead->Next != NULL)

{

LHead = LHead->Next;

}//如果非空,HLead指针的位置向后移

newNode->Next = LHead->Next;

LHead->Next = newNode;

} //将新节点插入链表

void Delete(cityList *LHead)

{

char delCity[30];

printf("请输入要删除的城市名\n");

scanf("%s",delCity);

while(strcmp(LHead->Next->cityName,delCity)) //从LHead指向得头结点的下一个结点

开判断结点中的城市名与输入城市名是否

相等。

{

LHead = LHead->Next; //不相等则指针LHead下移,继续查找

}

LHead ->Next = LHead->Next->Next; //相等则删除此节点

}

void Create(cityList *LHead)

{

char sign[20]; //定义输入信息类型及长度

printf("输入END退出,输入其余值继续\n"); //当输入END时,在任意输入,则退出此操作

scanf("%s",sign);

while(strcmp(sign,"END")) ////当输入END时,再任意输入,则退出此操作

{

Insert(LHead);

printf("输入END退出,输入其余值继续\n");

scanf("%s",sign);

}

}

void FindCity(cityList* LHead)

{

char cityName[30];

printf("请输入您要搜索的城市名\n");

scanf("%s",cityName);

while(LHead->Next != NULL && strcmp(LHead->Next->cityName,cityName))

{

LHead = LHead->Next;

}

if(LHead->Next == NULL)

{

printf("您要搜索的城市不存在\n");

return;

}

printf("城市坐标为%.2f,%.2f\n",LHead->Next->x,LHead->Next->y);

}

void UpdateCity(cityList* LHead)

{

char cityName[30];

printf("请输入您要更新的城市名\n");

scanf("%s",cityName);

while(strcmp(LHead->Next->cityName,cityName)) //从LHead指向得头结点的下一个结点

开判断结点中的城市名与输入城市名是否

相等。

{

LHead = LHead->Next; 当不相等则指针LHead下移,继续查找

}

printf("请输入城市新信息:\n");

printf("请输入城市新名\n");

scanf("%s",LHead->Next->cityName);

printf("请输入城市新坐标\n");

scanf("%f",&LHead->Next->x);

scanf("%f",&LHead->Next->y);

} //输入城市新信息

void FindCityDistance(cityList* LHead)

{

char m;

float x;

float y;

float distance;

printf("请输入中心坐标x,y\n");

scanf("%f%c%f",&x,&m,&y);

printf("请输入距离:");

scanf("%f",&distance);

LHead = LHead->Next;

while(LHead != NULL)

{

if((x-LHead->x)*(x-LHead->x) + (y-LHead->y)*(y-LHead->y) <= distance*distance)

{

printf("城市名为%s\n",LHead->cityName);

printf("城市坐标为%.2f,%.2f\n",LHead->x,LHead->y);

}

LHead = LHead->Next;

}

4、主函数为和其他伪函数的代码:

int main()

{

//主函数

cityList* LHead;

cityList* Store;

char choice[3] = {1,2,3};

LHead = (cityList*)malloc(sizeof(cityList));

Init(LHead);

Store = LHead;

while(strcmp(choice,"7")){ //当所选择等于7时,进行以下操作

printf("***************************\n");

printf("***************************\n");

printf(" 欢迎使用本系统 \n");

printf("***************************\n");

printf("***************************\n");

printf("1.创建城市链表\n");

printf("2.根据城市名查询城市\n");

printf("3.根据离中心坐标距离查询城市\n");

printf("4.插入新城市信息\n");

printf("5.删除城市信息\n");

printf("6.更新城市信息\n");

printf("7.退出\n"); //以上相当于一个选择菜单,皆为提示信息 printf("==========================\n");

printf("请输入:");

scanf("%s",&choice);

switch(choice[0]){

case '1': //相当于选择1

Create(Store); 构造并创建城市信息链表

break;

case '2':

FindCity(Store);//根据城市名查找城市位置

break;

case '3':

FindCityDistance(Store);//根据所给中心坐标和距离值,返回小于等于所给距

离值得节点信息。

break;

case '4':

Insert(Store);//插入新结点

break;

case '5':

Delete(Store);删除结点

break;

case '6':

UpdateCity(Store);更新结点信息

break;

case '7':退出

break;

default:

printf("输入错误,请重新输入\n");

break;

}

}

system("PAUSE");

return 0;

}

5、、函数调用关系图反映了演示程序的层次结构。

(四)调试分析

1、算法的时空分析

1)由于有序表采用带头结点的有序单链表,并增设尾指针。首先对链表地长度有所限制,存储空间不够就根据实际情况再申请。各种操作的算法时间复杂度比较合理。InitList,这个操作的时间复杂度都是O(1)。InsertList, DeleteList ,FindCity, FindCityDistance, UpdateCity的时间复杂度则是O(n),n为链表长度。

2)基于有序链表的结构特点,在算法运算时大多需要进行匹配查找,满足条件就进行相关操作。如DeleteCity,需要输入城市名,用void Delete (citylist *LHead)函数中的判断语句进行查找,然后再修改结点地指向。

2、创建城市链表时,输入城市信息较为麻烦,每个城市信息输入完后,若还想输入其它城市信息,则输入任意键继续,否则输入END退出,所以在输入信息时需注意输入步骤,以免发生输入混乱。

3、行更新操作时,我们试图将GL(11,12)更新为GL1(13,14).却显示:输入错误,请重

新输入。仔细检查发现,我们输入坐标的形式为:

而 UpdateCity(cityList* LHead)函数中定义的坐标输入形式为:

printf("请输入城市新坐标\n");

scanf("%f",&LHead->Next->x);

scanf(“%f”,&LHead->Next->y);

所以,正确的输入坐标形式应为:

(五)用户手册

1、本试验使用的运行软件是VC++6.0。

2、进入演示程序后即显示文本方式的用户界面:

3、输入相应的数据选择相应的命令,回车进入数据测试,在执行命令‘1’时输入END结束,执行其它命令时以回车键结束。

4、接受其他命令后即执行相应运算和显示相应结果。

(六)测试结果

执行命令‘1’:输入测试数据

CQ(1,2)

NN(3,4)

CD(5,6)

ZK(7,8)

SZ(9,10)

GL(11,12)

输出结果如右

执行命令‘2’:输入GL,输出结果如下

执行命令‘3’:输入中心坐标3,4,输入距离5,输出结果如下

执行命令‘4’:输入城市名及中心坐标为WH和5,8,并通过查询验证已插入,结果如下

执行命令‘5’:输入数据WH,并通过查询验证数据已删除,结果如下

执行命令‘6’:输入要更新的城市名为NN,将其信息更新为NM和6,7

执行命令‘7’:退出程序

(七)附录

源程序文件名清单:

Stdlib.H //头文件

Stdio.H //主程序

String.H //字符串处理函数的头文件

Malloc.H //动态存储分配实现单元

(八)心得体会

通过这次课程设计,我对完成一项小组任务有了更深刻地了解。首先是对程序的分析。虽然题目的要求很简单,但我们需要更深入地思考其实质是什么。了解实验所需要的基本程序,并用所学知识实现它。其次是小组合作问题。我们要对每个人都有所了解,然后分配相应地任务。事情的流程是:知道有哪些任务需要完成→那几项任务的关联较大则将任务集中→任务各自完成,但要注意相互帮助,不要太独立。最后是程序地实现。我们一起讨论了程序实现过程中所出现的问题,共同对程序加以改进。

从整体来说,主要是以上这个过程。就收获而言,一方面,对数据结构这门课地应用有了一定地了解,知道对线性表插入、删除等操作的实现,加深对课本地理解。另一方面就是小组成员的合作。怎样协调大家共同做好一件事的问题。只有参与此过程才会体会团队合作所带来的快乐。

(九)评价

城市链表实验报告

2014-2015学年第一学期实验报告 课程名称:算法与数据结构 实验名称:城市链表

一、实验目的 本次实验的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。同时,通过本次实验帮助学生复习高级语言的使用方法。 二、实验内容 (一)城市链表: 将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。 (二) 约瑟夫环 m 的初值为20;密码:3,1,7,2,6,8,4(正确的结果应为6,1,4,7,2,3,5)。三、实验环境 VS2010 、win8.1 四、实验结果 (一)城市链表: (1)创建城市链表; (2)给定一个城市名,返回其位置坐标; (3)给定一个位置坐标P 和一个距离D,返回所有与P 的距离小于等于 D 的城市。 (4)在已有的城市链表中插入一个新的城市; (5)更新城市信息; (6)删除某个城市信息。 (二) 约瑟夫环 m 的初值为20;密码:3,1,7,2,6,8,4 输出6,1,4,7,2,3,5。 五、附录 城市链表: 5.1 问题分析 该实验要求对链表实现创建,遍历,插入,删除,查询等操作,故使用单链表。

5.2 设计方案 该程序大致分为以下几个模块: 1.创建城市链表模块,即在空链表中插入新元素。故创建城市链表中包涵插入模块。 2.返回位置坐标模块。 3.计算距离模块 4.插入模块。 5.更新城市信息模块 6.删除信息模块。 5.3 算法 5.3.1 根据中心城市坐标,返回在距离内的所有城市: void FindCityDistance(citylist *L){ //根据距离输出城市 ……//输入信息与距离 L=L->next; w hile(L != NULL){ if(((L->x-x1)*(L->x-x1)+(L->y-y1)*(L->y-y1 )<=dis*dis)&&(((L->x-x1)+(L->y-y1))!=0 )){ printf("城市名称%s\n",L->Name); printf("城市坐标%.2lf,%.2lf\n",L->x,L->y); } L=L->next; } } 该算法主要用到了勾股定理,考虑到不需要实际数值,只需要大小比较,所以只用 横坐标差的平方+纵坐标差的平方<= 距离的平方判定。

链表实验报告

C语言程序设计实验报告 实验一:链表的基本操作一·实验目的 1.掌握链表的建立方法 2.掌握链表中节点的查找与删除 3.掌握输出链表节点的方法 4.掌握链表节点排序的一种方法 5.掌握C语言创建菜单的方法 6.掌握结构化程序设计的方法 二·实验环境 1.硬件环境:当前所有电脑硬件环境均支持 2.软件环境:Visual C++6.0 三.函数功能 1. CreateList // 声明创建链表函数 2.TraverseList // 声明遍历链表函数 3. InsertList // 声明链表插入函数 4.DeleteTheList // 声明删除整个链表函数 5. FindList // 声明链表查询函数 四.程序流程图 五.程序代码 #include #include typedef int Elemtype; typedef int Status; typedef struct node//定义存储节点 { int data;//数据域 struct node *next;//结构体指针 } *linklist,node;//结构体变量,结构体名称 linklist creat (int n)//创建单链表 { linklist head,r,p;//定义头指针r,p,指针 int x,i; head=(node *)malloc(sizeof(node));//生成头结点

r=head;//r指向头结点 printf("输入数字:\n"); for(i=n;i>0;i--)//for 循环用于生成第一个节点并读入数据{ scanf("%d",&x); p=(node *)malloc(sizeof(node)); p->data=x;//读入第一个节点的数据 r->next=p;//把第一个节点连在头结点的后面 r=p;//循环以便于生成第二个节点 } r->next=0;//生成链表后的断开符 return head;//返回头指针 } void output (linklist head)//输出链表 { linklist p; p=head->next; do { printf("%3d",p->data); p=p->next; } while(p); printf("\n") } Status insert ( linklist &l,int i, Elemtype e)//插入操作 { int j=0; linklist p=l,s; while(jnext; ++j; } if(!p || j>i-1) return -1; else { s=(node *)malloc(sizeof(node)); s->data=e; s->next=p->next; p->next=s; return 1; } } Status delect ( linklist &l,int i, Elemtype &e)//删除操作 { int j=0; linklist p=l,q; while(jnext) { p=p->next; ++j; } if(!p->next || j>i-1) return -1;

单链表实验报告

计算机与信息技术学院综合性、设计性实验报告 一、实验目的 (1)熟悉顺序表的创建、取值、查找、插入、删除等算法,模块化程序设计方法。 二、实验仪器或设备 (1)硬件设备:CPU为Pentium 4 以上的计算机,内存2G以上 (2)配置软件:Microsoft Windows 7 与VC++6.0 三、总体设计(设计原理、设计方案及流程等) 设计原理: 单链表属于线性表,线性表的存储结构的特点是:用一组任意存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。因此,对于某个元素来说,不仅需要存储其本身的信息,还需要存储一个指示其直接后继的信息。 设计方案: 采用模块化设计的方法,设计各个程序段,最终通过主函数实现各个程序段的功能。设计时,需要考虑用户输入非法数值,所以要在程序中写入说可以处理非法数值的代码。 设计流程: 1. 引入所需的头文件; 2. 定义状态值; 3. 写入顺序表的各种操作的代码; 写入主函数,分别调用各个函数。在调用函数时,采用if结构进行判断输 入值是否非法,从而执行相应的程序 四、实验步骤(包括主要步骤、代码分析等) #include // EOF(=A Z 或F6),NULL #in clude // srand( ) ,rand( ),exit (n) #in clude // malloc( ),alloc( ),realloc() 等 #in clude // INT_MAX 等 #in clude #in clude #in clude // floor(),ceil( ),abs() #in clude // cout,ci n #in clude // clock( ),CLK_TCK,clock_t #defi ne TRUE 1 #defi ne FALSE 0 #defi ne OK 1 #defi ne ERROR 0 #defi ne INFEASIBLE -1

链表实验报告

链表实验报告

————————————————————————————————作者: ————————————————————————————————日期:

《数据结构》实验报告二 系别:嵌入式系统工程系班级:嵌入式11003班 学号:11160400314姓名:孙立阔 日期:2012年4月9日指导教师:申华 一、上机实验的问题和要求: 单链表的查找、插入与删除。设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。 2.从键盘输入1个字符,在单链表中查找该结点的位置。若找到,则显示“找到了”;否则, 则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出单链表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。 5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结 点值,观察输出结果。 6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。 7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素, 而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。 二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 创建一个空的单链表,实现对单链表的查找,插入,删除的功能。 三、源程序及注释: #defineOK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define TRUE 1

链表实现多项式相加实验报告

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间:2012年10月17日

1、实验目的和要求 1)掌握链表的运用方法; 2)学习链表的初始化并建立一个新的链表; 3)知道如何实现链表的插入结点与删除结点操作; 4)了解链表的基本操作并灵活运用 2、实验内容 1)建立两个链表存储一元多项式; 2)实现两个一元多项式的相加; 3)输出两个多项式相加后得到的一元多项式。 3、算法基本思想 数降序存入两个链表中,将大小较大的链表作为相加后的链表寄存处。定义两个临时链表节点指针p,q,分别指向两个链表头结点。然后将另一个链表中从头结点开始依次与第一个链表比较,如果其指数比第一个小,则p向后移动一个单位,如相等,则将两节点的系数相加作为第一个链表当前节点的系数,如果为0,则将此节点栓掉。若果较大,则在p前插入q,q向后移动一个,直到两个链表做完为止。 4、算法描述 用链表实现多项式相加的程序如下: #include #include #include struct node{ int exp; float coef; struct node*next; };

void add_node(struct node*h1,struct node*h2); void print_node(struct node*h); struct node*init_node() { struct node*h=(struct node*)malloc(sizeof(struct node)),*p,*q; int exp; float coef=1.0; h->next=NULL; printf("请依次输入多项式的系数和指数(如:\"2 3\";输入\"0 0\"时结束):\n"); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node)); for(;fabs(coef-0.0)>1.0e-6;) { scanf("%f %d",&coef,&exp); if(fabs(coef-0.0)>1.0e-6) { q->next=p; p->coef=coef; p->exp=exp; p->next=NULL; add_node(h,q); } } free(p); free(q); return(h); } void add_node(struct node*h1,struct node*h2) { struct node*y1=h1,*y2=h2; struct node*p,*q; y1=y1->next; y2=y2->next; for(;y1||y2;) if(y1) { if(y2) { if(y1->expexp) y1=y1->next; else if(y1->exp==y2->exp) { y1->coef+=y2->coef; if(y1->coef==0)

数据结构课程设计实验报告

数据结构课程设计实验报告

设计题目:一 单位员工通讯录管理系统 一、题目要求 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 二、概要设计 本程序通过建立通讯录链表,对员工信息进行记录,并建立一个系统的联系。 三、主要代码及分析 这里面关于链表的主要的操作有插入,查询,删除。则这里只列出这几项的主代码。 1、通过建立通讯录结构体,对信息进行存储,建立链表,建立信息之间 的联系。 typedef struct { }DataType;结构体来存储通讯录中的基本信息 typedef struct node { DataType data; /*结点的数据域*/ struct node *next; /*结点的指针域*/ }ListNode,*LinkList; 2、信息插入操作,将信息查到链表的后面。 void ListInsert(LinkList list){ //信息插入 ListNode *w; w=list->next; while(w->next!=NULL) { w=w->next; } ListNode *u=new ListNode; u->next=NULL; cout<<"员工编号:";cin>>u->data.num; cout<<"员工姓名:";cin>>u->https://www.360docs.net/doc/919807614.html,; cout<<"手机号码:";cin>>u->data.call; cout<<"员工邮箱:";cin>>u->data.email; cout<<"办公室电话号码:";cin>>u->data.phone; w->next=u;w=w->next; }

单链表的插入和删除实验报告

. 实验一、单链表的插入和删除 一、目的 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 二、要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 三、程序源代码 #include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表

ListNode *LocateNode(); //函数,按值查找结点 void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值 void DeleteAll(); //函数,删除所有结点,释放内存 //==========主函数============== void main() { char ch[10],num[10]; LinkList head; head=CreatListR1(); //用尾插入法建立单链表,返回头指针printlist(head); //遍历链表输出其值 printf(" Delete node (y/n):");//输入“y”或“n”去选择是否删除结点scanf("%s",num); if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){ printf("Please input Delete_data:"); scanf("%s",ch); //输入要删除的字符串 DeleteList(head,ch); printlist(head); } DeleteAll(head); //删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表

C语言链表实验报告

链表实验报告 一、实验名称 链表操作的实现--学生信息库的构建 二、实验目的 (1)理解单链表的存储结构及基本操作的定义 (2)掌握单链表存储基本操作 (3)学会设计实验数据验证程序 【实验仪器及环境】计算机 Window XP操作系统 三、实验内容 1、建立一个学生成绩信息(学号,姓名,成绩)的单链表,按学号排序 2、对链表进行插入、删除、遍历、修改操作。 3、对链表进行读取(读文件)、存储(写文件) 四、实验要求 (1)给出终结报告(包括设计过程,程序)-打印版 (2)对程序进行答辩

五、实验过程、详细内容 1、概念及过程中需要调用的函数 (1)链表的概念结点定义 结构的递归定义 struct stud_node{ int num; char name[20]; int score; struct stud_node *next; }; (2)链表的建立 1、手动输入 struct stud_node*Create_Stu_Doc() { struct stud_node *head,*p; int num,score; char name[20]; int size=sizeof(struct stud_node); 【链表建立流程图】

2、从文件中直接获取 先建立一个 (3)链表的遍历 (4 )插入结点 (5)删除结点 (6)动态储存分配函数malloc () void *malloc(unsigned size) ①在内存的动态存储区中分配一连续空间,其长度为size ②若申请成功,则返回一个指向所分配内存空间的起始地址的指针 ③若申请不成功,则返回NULL (值为0) ④返回值类型:(void *) ·通用指针的一个重要用途 ·将malloc 的返回值转换到特定指针类型,赋给一个指针 【链表建立流程图】 ptr ptr ptr->num ptr->score ptr=ptr->next head pt r s s->next = ptr->next ptr->next = s 先连后断 ptr2=ptr1->next ptr1->next=ptr2->next free (ptr2)

数据结构实验二-

实 验 报 告 一、实验目的 1) 加深对图的表示法和图的基本操作的理解,并可初步使用及操作; 2) 掌握用图对实际问题进行抽象的方法,可以解决基本的问题; 3) 掌握利用邻接表求解非负权值、单源最短路径的方法,即利用Dijkstra 算法求最短 路径,同时掌握邻接表的建立以及使用方法,能够解决相关的问题; 4) 学会使用STL 中的map 抽象实际问题,掌握map ,List,,priority_queue 等的应 用。 二、实验内容与实验步骤 (1) 实验内容: 使用图这种抽象的数据结构存储模拟的欧洲铁路路线图,通过Dijkstra 算法求出欧洲旅行最少花费的路线。该实验应用Dijkstra 算法求得任意两个城市之间的最少路费,并给出路费最少的路径的长度和所经过的城市名。 (2) 抽象数据类型及设计函数描述 1) 抽象数据类型 class City : 维护一个城市的信息,包括城市名name ,是否被访问过的标记visted ,从某个城市到达该城市所需的总费用total_fee 和总路径长度total_distance ,求得最短路径后路径中到达该城市的城市名from_city 。 class RailSystem : 用邻接表模拟欧洲铁路系统,该邻接表使用数据结构map 实现,map 的key-value 课程名称:数据结构 班级: 实验成绩: 实验名称:欧洲旅行 学号: 批阅教师签字: 实验编号:实验二 姓名: 实验日期:2013 年6 月 18 日 指导教师: 组号: 实验时间:

值对的数据类型分别为string和list<*Service>,对应出发城市名和该城市与它能 够到达的城市之间的Service链表。 class Service: 为铁路系统模拟了两个城市之间的直接路线,包括两个城市之间直接到达的费用 fee,两城市之间的直接距离distance。 部分设计函数描述 ●RailSystem(const string& filename) 构造函数,调用load_services(string const &filename)函数读取数据 ●load_services(string const &filename) 读取传入的文件中的数据并建立上述两个map以模拟欧洲铁路路线图 ●reset(void) 遍历cities图,初始化所有城市的信息:visted未访问,total_distance最大 值,total_fee费用最大值,from_city为空 ●~RailSystem(void) 析构函数,用delete将两个map中所有使用new操作符开辟的空间删除 ●void output_cheapest_route(const string& from, const string& to, ostream& out); 输出两城市间的最少费用的路径,调用calc_route(string from, string to)函 数计算最少费用 ●calc_route(string from, string to) 使用Dijkstra算法计算from和to两个城市间的最少费用的路径 (3)采用的存储结构 1)map > outgoing_services 用来保存由一个城市出发可以直接到达的城市名及这两个城市之间的路径信息。 2)list 以service为指针的list表,保存两城市间的路径。 3)map cities 用来保存所有城市信息,通过城市名查找该城市有关信息。 4)priority_queue, Cheapest> candidates 存储候选的遍历城市,City*是优先队列存储的对象类型,vector是该对象的向量集合,Cheapest是比较规则。 三、实验环境 操作系统:Windows 8 调试软件:Microsoft visual studio 2012 上机地点:综合楼311 机器台号:笔记本

链表基本操作实验报告

实验2 链表基本操作实验 一、实验目的 1. 定义单链表的结点类型。 2. 熟悉对单链表的一些基本操作和具体的函数定义。 3. 通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验内容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、 算法分析与设计。 头结点 ......

2.单链表插入 s->data=x; s->next=p->next; p->next=s; 3.单链表的删除: p->next=p->next->next;

四、运行结果 1.单链表初始化 2.创建单链表 3.求链表长度 4.检查链表是否为空 5.遍历链表 6.从链表中查找元素 7.从链表中查找与给定元素值相同的元素在顺序表中的位置

8.向链表中插入元素 插入元素之后的链表 9.从链表中删除元素 删除位置为6的元素(是3) 10.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程序做了仔细的分析,对单链表创建、插入、删除算法画了详细的N-S流程图。

哈希表实验报告完整版

实验报告 姓名:学号: 1.实验题目 针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。 基本要求:假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 2.需求分析 本演示程序用VC编写,完成哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 输出形式:地址,关键字,收索长度,H(key),拼音 3.概要设计 typedef struct NAME typedef struct hterm void InitNameList() void CreateHashList() void FindList() void Display() int main() 4.详细设计 #include #include #include

#define HASH_LEN 50 #define M 47 #define NAME_NO 8 typedef struct NAME { char *py; //名字的拼音 int k; //拼音所对应的整数}NAME; NAME NameList[HASH_LEN]; typedef struct hterm //哈希表{ char *py; //名字的拼音 int k; //拼音所对应的整数int si; //查找长度 }HASH; HASH HashList[HASH_LEN]; void InitNameList() { NameList[0].py="houxinming"; NameList[1].py="abc"; NameList[2].py="defdgf"; NameList[3].py="zhangrji"; NameList[4].py="jiaxin"; NameList[5].py="xiaokai"; NameList[6].py="liupeng"; NameList[7].py="shenyonghai";

链表的基本操作-数据结构实验报告

大学数据结构实验报告 课程名称数据结构实验第(四)次实验实验名称链表的基本操作 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期2018年10月01日 一、实验目的 1. 学会定义单链表的结点类型,实现对单链表的一些基本操作和具体 的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La (2)在La中插入一个新结点 (3)删除La中的某一个结点 (4)在La中查找某结点并返回其位置 (5)打印输出La中的结点元素值 (6)清空链表 (7)销毁链表 2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、 Lb合并成一个有序单链表Lc。 四、思考与提高: 1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?五、实验设计 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La LinkList InitList() {

int i,value,n; LinkList H=(LinkList)malloc(sizeof(LNode)); LinkList P=H; P->next=NULL; do{ printf("请输入链表的长度:"); scanf("%d",&n); if(n<=0) printf("输入有误请重新输入!\n"); }while(n<=0); printf("请输入各个元素:\n"); for(i=0; idata=value; P->next=NEW; NEW->next=NULL; P=NEW; } printf("链表建立成功!\n"); return H->next; } (2)在La中插入一个新结点 LinkList InsertList(LinkList L,int i,ElemType value) { LinkList h,q,t=NewLNode(t,value); int x=0; h=q=L; if(i==1) t->next=h, h=t; else { while(x++next; t->next=q->next; q->next=t; } printf("插入成功!\n"); return h; } (3)删除La中的某一个结点

链表基本操作实验报告

实验2 链表基本操作实验 一、实验目的 1. 定义单链表的结点类型。 2. 熟悉对单链表的一些基本操作和具体的函数定义。 3. 通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、 算法分析与设计。 头结点

2.单链表插入 s->data=x; s->next=p->next; p->next=s; 3.单链表的删除: p->next=p->next->next;

四、运行结果 1.单链表初始化 2.创建单链表 3.求链表长度 4.检查链表是否为空 5.遍历链表 6.从链表中查找元素 7.从链表中查找与给定元素值相同的元素在顺序表中的位置

8.向链表中插入元素 插入元素之后的链表 9.从链表中删除元素 删除位置为6的元素(是3) 10.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程序做了仔细的分析,对单链表创建、插入、删除算法画了详细的N-S流程图。

2数据结构_全国交通咨询模拟系统实验报告

全国交通咨询模拟 一、设计目的 掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。得到软件设计技能的训练。 二、问题描述 交通咨询模拟。根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。 三、基本要求 1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能; 2、对城市间的交通工具:火车。对列车时刻表进行编辑:里程、和列车班次的添加、修改、删除; 3、提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具,可以不考虑回程; 4、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟列车何时到达何地。

四、具体实现 1、思路 (1) 数据存储。城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。在实验中本想用文本储存数据,但操作不熟悉,而是改用图的邻接矩阵储存原始信息,而后用数组进行添加删改 (2) 数据的逻辑结构。根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为无向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的时间)或旅费。 (3) 数据的存储结构。采用邻接表和邻接矩阵都可作为数据的存储结构,这里建议采用邻接矩阵作为数据的存储结构。 (4) 用不同的功能模块对城市信息和交通信息进行编辑。添加、修改、删除功能可用菜单方式或命令提示方式。只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面,具体实现由学生自行设计,也可参考有关程序(届时在网上提供)。这些工作有不小的工作量。 (5) 最优决策功能模块 ① 读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对方城市到达该元素所代表城市的所有信息;表头数组中的元素所对应的单链表存放与该元素所代表的城市有交通联系的城市(代码、里程、列车车次)。 ② 根据具体最优决策的要求,用floyd算法求出出发城市到其它各城市的最优值(最短时间或最小的费用),搜索过程中所经过城市的局部最优信息都保存在邻接表的表头数组中。其目的城市所代表的元素中就保存了所需的最优决策结果。其相应的初始值可为∞,并在表头数组对应的城市元素中保存响应的信息。 ③主程序可以有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作。 2、数据结构 本程序运用了关于图这种数据结构。 他的抽象数据类型定义如下: typedef struct unDiGraph

单链表实验报告

单链表实验报告

————————————————————————————————作者:————————————————————————————————日期:

计算机与信息技术学院综合性、设计性实验报告 专业:网络工程年级/班级:大二 2016—2017学年第一学期 课程名称数据结构指导教师李四 学号姓名16083240XX 张三 项目名称单链表的基本操作实验类型综合性/设计性实验时间2017.10.3 实验地点216机房 一、实验目的 (1)熟悉顺序表的创建、取值、查找、插入、删除等算法,模块化程序设计方法。 二、实验仪器或设备 (1)硬件设备:CPU为Pentium 4以上的计算机,内存2G以上 (2)配置软件:Microsoft Windows 7与VC++6.0 三、总体设计(设计原理、设计方案及流程等) 设计原理: 单链表属于线性表,线性表的存储结构的特点是:用一组任意存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。因此,对于某个元素来说,不仅需要存储其本身的信息,还需要存储一个指示其直接后继的信息。 设计方案: 采用模块化设计的方法,设计各个程序段,最终通过主函数实现各个程序段的功能。设计时,需要考虑用户输入非法数值,所以要在程序中写入说可以处理非法数值的代码。 设计流程: 1.引入所需的头文件; 2.定义状态值; 3.写入顺序表的各种操作的代码; 写入主函数,分别调用各个函数。在调用函数时,采用if结构进行判断输入值是否非法,从而执行相应的程序 四、实验步骤(包括主要步骤、代码分析等) #include<stdio.h>// EOF(=^Z或F6),NULL #include<stdlib.h> // srand(),rand(),exit(n) #include<malloc.h> // malloc( ),alloc( ),realloc()等 #include //INT_MAX等 #include #include // floor(),ceil( ),abs( ) #include<iostream.h> // cout,cin #include // clock(),CLK_TCK,clock_t #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

单链表的基本操作实验报告

湖南第一师范学院信息科学与工程系实验报告 课程名称:数据结构与算法成绩评定: 实验项目名称:单链表的基本操作指导教师: 学生姓名:沈丽桃学号: 10403080118 专业班级: 10教育技术 实验项目类型:验证实验地点:科B305 实验时间: 2011 年 10 月20 日一、实验目的与要求: 实验目的:实现线性链表的创建、查找、插入、删除与输出。 基本原理:单链表的基本操作 二、实验环境:(硬件环境、软件环境) 1.硬件环境:奔ⅣPC。 2.软件环境:Windows XP 操作系统,TC2.0或VC++。 三、实验内容:(原理、操作步骤、程序代码等) #include #include #include struct celltype { int element; struct celltype*next; }; typedef int position; void main() { struct celltype*head,*p; int x,choice; void INSERT(int x,struct celltype*p); void LOCATE(int x,struct celltype*p); void DELETE(int x,struct celltype*p); p=(struct celltype*)malloc(sizeof(struct celltype)); head=p; p->element=0; p->next=NULL; printf(“Please option:1:Insert 2:Locate 3:Delete\n”); printf(“Please choose:”); scanf(“%d”,&choice); switch(choice) case 1: printf(“Please input a node:”); scanf(“%d”,&x);

单链表操作实验报告

线性表 一、实验目的 1. 了解线性表的逻辑结构特征,以及这种特性在计算机内的两种存储结构。 2. 掌握线性表的顺序存储结构的定义及其C语言实现。 3. 掌握线性表的链式村粗结构——单链表的定义及其C语言实现。 4. 掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5. 掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验要求 1. 认真阅读和掌握本实验的程序。 2. 上机运行本程序。 ) 3. 保存和打印出程序的运行结果,并结合程序进行分析。 4. 按照对顺序表和单链表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 三、实验内容 请编写C程序,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。具体地说,就是要根据键盘输入的数据建立一个单链表,并输出该单链表;然后根据屏幕菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;然后在屏幕菜单中选择0,即可结束程序的运行。 四、解题思路 本实验要求分别写出在带头结点的单链表中第i(从1开始计数)个位置之后插入元素、创建带头结点的单链表中删除第i个位置的元素、顺序输出单链表的内容等的算法。 五、程序清单 #include<> #include<> #include<> typedef int ElemType; ~ typedef struct LNode { ElemType data; struct LNode *next; }LNode; LNode *L; LNode *creat_L(); void out_L(LNode *L); void insert_L(LNode *L,int i,ElemType e); ElemType delete_L(LNode *L,int i); int locat_L(LNode *L,ElemType e); $

链表顺序表实验报告--数据结构与算法分析

链表顺序表实验报告--数据结构与算法分析

数据结构与算法分析课程设计报告 课题名称: 使用一个链表和顺序表构建城市数据库 提交文档组号: 2 编程学生姓名及学号: 测试学生姓名及学号: 报告学生姓名及学号: 指导教师姓名: 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2013 年 11 月日

实验一:Implement a city database using unordered lists and link lists 1.实验的目的和要求: <1>采用C++的ASCII码文件和模块函数实现; <2>熟练掌握数组列表和链表列表的实现; <3>熟练掌握计算机系统的基本操作方法,了解如何编译、运行一个C++程序; <4>上机调试程序,掌握查错、排错使程序能正确运行。 2. 实验的环境: 1、硬件环境:索尼笔记本电脑,Intel(R) Core(TM) i7-3632M ,8GB内存可; 2、软件环境:Windows 8 下的Microsoft Visual Studio 2008 2.算法描述: 数据结构与算法分析的背景: 数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课称,而且已成为其他理工专业的热门选修课。 数据结构是一门专业选技术基础科。一方面,它要求我们学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术;另一方面,数据结构的学习过程也是复杂程序设计的训练过程,要求我们编写的程序结构清楚和正确易读,复合软件工程的规

相关文档
最新文档