城市链表实验报告

合集下载

链表的实验报告

链表的实验报告
{
front->next=alist.front->next;
cout<<"复制构造函数"<<endl;
}
//touchafa
template<class T>
linklist<T>::linklist(T a[],int n)
{
front=new Node<T>;
front->next=NULL;
找到要插入的结点的前一个结点新结点的指针域指向p然后p前面的结点指向这个新的结点这样这个新的结点就插入到了链表里面3代码的时间复杂度
数据结构实验报告
1.
2.
2.1
2.2
2.3
算法一:
template<class T>
linklist<T>::linklist(T a[],int n)
{
front=new Node<T>;
T x=q->data;
delete q;
return x;
}
[1]算法功能:删除链表中的某个元素
[2]思想:删除就是先找到要删除的元素的前面的元素,然后前面的这个结点直接指向这个结点的下一个结点,然后再把这个指针删除。
[3]时间复杂度:O(n)
[4]代码逻辑:
1.从第一个结点开始,查找第i-1个元素,设为P指向该结点,如果查找失败则抛出异常
front->next=NULL;
for(int i=n-1;i>=0;i--)
{
Node<T>*s=new Node<T>;
s->data=a[i];

城市链表(实验报告)

城市链表(实验报告)

本科学生综合性实验报告学院:软件与通信工程学院课程名称:数据结构与算法专业班级:09通信工程1班姓名:王燕学号:0093731学生实验报告(1)一、实验目的1.掌握用 C语言调试程序的基本方法。

2.掌握线性表的基本运算,如创建、插入、删除等。

二、实验内容将若干城市的信息,存入一个带头结点的单链表。

结点中的城市信息包括:城市名,城市的位置坐标。

要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。

[拓展要求](1)给定一个城市名,返回其位置坐标;(2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。

三、实验要求1.用C++/C完成算法设计和程序设计并上机调试通过。

2. 实验过程中学生调试完成,需向教师演示实验过程和结果。

3.撰写实验报告,提供实验结果和数据。

4.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。

5. 采用上机情况、程序质量、实习报告相结合的形式,满分为100分。

四、实验仪器1.WindowsXP以上操作系统;2.Visual C++6.0语言环境;3.每人一台PC机。

五、实验内容和步骤1.启动Windows XP操作系统2.创建工作文件夹创建Visual C++ 6.0的工作文件夹。

3.启动Visual C++ 6.0建立一个空工程LinkList,在建立一个源文件citylinklist4.编写代码如下:#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<math.h>typedef struct Node{char CityName[10];float CityPoistion[2];struct Node *next;}Node, * LinkList;void InitList(LinkList * H){* H=(LinkList)malloc(sizeof(Node));(* H)->next=NULL;}//建立城市信息链表,以城市名“no”作为结束标识符void CreateCity(LinkList H){Node * r, * s;;char name[10];float x,y;r=H;printf("请输入若干个城市的信息!(以城市名no结束)\n城市名经度纬度\n");scanf("%s%f%f",name,&x,&y);while(strcmp(name,"no")!=0){s=(Node*)malloc(sizeof(Node));strcpy(s->CityName,name);s->CityPoistion[0]=x;s->CityPoistion[1]=y;r->next=s;r=s;scanf("%s%f%f",name,&x,&y);}r->next=NULL;}//在某个城市后面插入一个城市信息int InsertCity(LinkList L){char cityname[10],name[10]; //name为定位城市名,cityname为要插入城市信息的城市名float x,y,x1,y1; //x1,y1是定位城市位置坐标,x,y是要插入城市信息的城市位置坐标int flag;printf("请选择插入方式(0 按城市名插入, 1 按城市位置坐标插入):");scanf("%d",&flag);switch(flag){case 0:p=L;printf("请输入在那个城市名后插入城市信息:");scanf("%s",name);getchar();while((p!=NULL)&&(strcmp(p->CityName,name)!=0))p=p->next;if(p==NULL){printf("没有找到城市名为%s 的城市,插入位置不当!\n",name);}else{printf("在城市%s 后插入一个城市信息:\n城市名经度纬度\n",name);scanf("%s%f%f",cityname,&x,&y);q=(Node*)malloc(sizeof(Node));strcpy(q->CityName,cityname);q->CityPoistion[0]=x;q->CityPoistion[1]=y;q->next=p->next;p->next=q;}break;case 1:p=L;printf("请输入在哪个城市位置坐标后插入城市信息:");scanf("%f%f",&x1,&y1);getchar();while((p!=NULL)&&(p->CityPoistion[0]!=x1)&&(p->CityPoistion[1]!=y1))p=p->next;if(p==NULL){printf("没有找到满足坐标为(%.2f , %.2f)的城市,插入位置不当!\n",x1,y1);}else{printf("在城市坐标为(%.2f , %.2f)的城市后面插入一个城市信息\n城市名经度纬度\n",x1,y1);q=(Node*)malloc(sizeof(Node));strcpy(q->CityName,cityname);q->CityPoistion[0]=x;q->CityPoistion[1]=y;q->next=p->next;p->next=q;}break;}return 1;}//删除一个城市信息int DeleteCity(LinkList L){Node *p,*q;char name[10]; //name是要删除城市信息的城市名float x1,y1; //x,y是要删除城市信息的城市位置坐标int flag;printf("请选择删除方式(0 按城市名删除, 1 按城市坐标删除): ");scanf("%d",&flag);switch(flag){case 0:p=L;q=p->next;printf("请输入要删除城市信息的城市名:");scanf("%s",name);while(q!=NULL && strcmp(q->CityName,name)!=0){q=q->next;p=p->next;}if(q==NULL){printf("没有找到城市名为%s 的城市,删除不成功!\n",name);}else{p->next=q->next;printf("删除了城市%s 的信息.\n",q->CityName);free(q);}break;case 1:p=L;printf("请输入要删除城市信息的城市位置坐标:");scanf("%f%f",&x1,&y1);while((q!=NULL)&&(q->CityPoistion[0]!=x1)&&(q->CityPoistion[1]!=y1)){q=q->next;p=p->next;}if(q==NULL){printf("没有找到满足坐标为(%.2f , %.2f)的城市,删除不成功!\n",x1,y1);}else{printf("删除了城市%s 的信息.\n",q->CityName);p->next=q->next;free(q);}break;}return 1;}//查找一个城市信息int FindCity(LinkList L){Node *p;char name[10]; //name是要查找城市信息的城市名float x1,y1; //x,y是要查找城市信息的城市位置坐标int flag;printf("请选择查找方式(0 按城市名查找, 1 按城市位置坐标查找):");scanf("%d",&flag);switch(flag){case 0:p=L->next;printf("请输入要查找城市信息的城市名:");scanf("%s",&name);while(p!=NULL&&strcmp(p->CityName,name)!=0)p=p->next;if(p==NULL){printf("没有找到城市名为%s 的城市!\n",name);}else{printf("城市名为%s 的城市位置坐标为}break;case 1:p=L->next;printf("请输入要查找城市信息的城市位置坐标:");scanf("%f%f",&x1,&y1);while((p!=NULL)&&(p->CityPoistion[0]!=x1)&&(p->CityPoistion[1]!=y1))p=p->next;if(p==NULL){printf("没有找到城市位置坐标为(%.2f , %.2f)的城市!\n",x1,y1);}elseprintf("城市位置坐标为(%.2f , %.2f)的是城市名为%s \n",p->CityPoistion[0],p->CityPoistion[1],p->CityName);break;}return 1;}//计算二维坐标两点间的距离float Length(float x1,float y1,float x2,float y2){float l;l=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));return l;}//以某点为中心找到所有小于某个距离的城市void SubDAround(LinkList L){Node * q;int n=0;float px,py,d;q=L->next;printf("请输入中心坐标点坐标以及距离:");scanf("%f%f%f",&px,&py,&d);printf("距中心坐标点(%.2f , %.2f) %.2f 的城市有:\n",px,py,d);while(q!=NULL){if(Length(px,py,q->CityPoistion[0],q->CityPoistion[1])<=d){printf("%s %.2f %.2f\n",q->CityName,q->CityPoistion[0],q->CityPoistion[1]);q=q->next;n++;}else}if(n==0) printf("没有任何城市符合条件!\n");}//显示所有城市信息void DisplayCity(LinkList L){Node * p;p=L->next;printf("城市名经度纬度\n");while(p!=NULL){printf("%s %.2f %.2f\n",p->CityName,p->CityPoistion[0],p->CityPoistion[1]);p=p->next;}}void main(){int k=1;LinkList CLL;InitList(&CLL);while(k){printf("\n\n\t\t\t城市信息管理系统\n\n");printf("\t\t\t1.建立一个城市信息链表\n");printf("\t\t\t2.查找一个城市信息\n");printf("\t\t\t3.插入一个城市信息\n");printf("\t\t\t4.删除一个城市信息\n");printf("\t\t\t5.显示所有城市信息\n");printf("\t\t\t6.距某点小于某距离的所有城市信息\n");printf("\t\t\t0.退出\n");printf("请选择操作项目:");scanf("%d",&k);system("cls");switch(k){case 1:CreateCity(CLL);system("pause");break;case 2:FindCity(CLL);system("pause");break;case 3:InsertCity(CLL);system("pause");break;case 4:DeleteCity(CLL);system("pause");break;case 5:DisplayCity(CLL);system("pause");break;case 6:SubDAround(CLL);system("pause");break;case 0:break;}system("cls");}5.编译、运行,结果如下:开始界面:建立城市城市信息链表:显示建立城市信息链表后的内容:按城市名查找城市信息,而且查找成功:按城市名查找城市信息,但查找不成功:按城市坐标查找城市信息,而且查找成功:按城市名查找城市信息,但查找不成功:按城市名在某个城市后面插入一个城市信息,而且插入成功:按城市名在某个城市后面插入一个城市信息,但插入不成功:按城市坐标在某个城市后面插入一个城市信息,而且插入成功:按城市坐标在某个城市后面插入一个城市信息,但插入不成功:显示插入城市信息后城市链表的内容:按城市名删除一个城市信息,而且删除成功:按城市名删除一个城市信息,但删除不成功:按城市坐标删除一个城市信息,而且删除成功:按城市坐标删除一个城市信息,但删除不成功:显示删除一些城市信息后城市链表的内容:寻找以某点中心小于某个距离的所有城市信息,而且寻找成功:寻找以某点中心小于某个距离的所有城市信息,但寻找不成功:选择退出后的页面:四、结论1、实验结果实现了在城市链表中利用城市名和位置坐标进行有关查找、插入、删除、更新基本要求的操作。

城市链表课程设计

城市链表课程设计

湖南商学院《城市链表》课程设计(实习)报告题目姓名: 彭应品学号: 080910135专业: 电子信息工程班级: 电信0804指导教师: 李姣燕职称: 讲师计算机与电子工程学院2011年12月课程设计(实习)评审表课程设计(实习)作品验收表注:1. 除“验收情况”栏外,其余各栏均由学生在作品验收前填写。

2. “验收情况”栏由验收小组按实际验收的情况如实填写。

目录1 课程设计任务与要求 (1)1.2 问题分析 (1)2系统总体设计 (1)2.1 总体设计思想、设计方案的选择 (1)2.2 系统模块设计 (1)3 系统详细设计 (2)3.1 系统子程序及功能设计 (2)3.3 函数主要调用关系图 (3)4 系统详细设计 (3)4.1 数据类型定义 (3)4.2 系统主要子程序设计 (3)5 系统实现与测试 (6)5.1 建立城市链表 (6)5.2 浏览城市链表 (6)5.3城市链表的查找 (6)5.4 城市链表的插入 (7)5.6 城市链表的更新 (7)5.7 查看给定范围内的城市 (7)5.8文件的载入与保存 (8)5.9系统设置 (8)6软件使用说明书 (8)7 课程设计总结 (9)参考文献 (9)1 课程设计任务与要求1.1 课程设计任务将城市信息存在单链表里,对其实现常见的链表操作1.2 问题分析由若干个城市的信息,存入一个带头节点的单链表。

节点中的城市信息包括城市名,城市坐标,城市面积,城市人口等。

要求能够利用城市名和位置坐标进行有关的查找,插入,删除,更新等操作。

2系统总体设计为了实现上述需求可以从以下几个方面着手进行设计。

2.1 总体设计思想、设计方案的选择本系统主要采用链表结构类型来存储数据,其中节点由四个部分组成:城市名称,城市坐标,城市人口和城市面积。

2.2 系统模块设计本系统共设计了9个主要的子功能,各功能的描叙如下所述:(1)建立城市链表,可以一次性的输入多条城市的信息,建立城市信息表。

链表基本操作实验报告

链表基本操作实验报告

实验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流程图。

六、C语言版原代码# include<stdio.h># include<stdlib.h>/* 定义ElemType 为int类型*/typedef int ElemType;# define TRUE 1# define FALSE 0# define NULL 0# define flag -1/*单链表的结点类型*/typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkedList;/*初始化单链表*/LinkedList LinkedListInit(){LinkedList L;L=(LinkedList)malloc(sizeof(LNode));L->next=NULL;return L;}/*清空单链表*/void LinkedListClear(LinkedList L){L->next=NULL;printf("链表已经清空\n");}/*检查单链表是否为空*/int LinkedListEmpty(LinkedList L){if(L->next==NULL) return TRUE;else return FALSE;}/*遍历单链表*/void LinkedListTraverse(LinkedList L) {LinkedList p;p=L->next;if(p==NULL) printf("单链表为空表\n");else{printf("链表中的元素为:\n");while(p!=NULL){printf("%d ",p->data); p=p->next;}}printf("\n");}int LinkedListLength (LinkedList L){LinkedList p;int j;p=L->next;j=0;while(p!=NULL){j++;p=p->next;}return j;}LinkedList LinkedListGet(LinkedList L,int i) {LinkedList p;int j;p=L->next;j=1;while(p!=NULL&&j<i){p=p->next;j++;}if(j==i) return p;else return NULL;}int LinkedListLocate(LinkedList L,ElemType x) {LinkedList p;int j;p=L->next;j=1;while(p!=NULL&&p->data!=x){p=p->next;j++;}if(p) return j;else return 0;}void LinkedListInsert(LinkedList L,int i,ElemType x) {LinkedList p,s;int j;j=1;p=L;while(p&&j<i){p=p->next;j++;}if(p==NULL||j>i)printf("插入位置不正确\n");else{s=(LNode *)malloc(sizeof(LNode));s->data=x;s->next=p->next;p->next=s;printf("%d 已插入到链表中\n",x);}}void LinkedListDel(LinkedList L,int i) {LinkedList p,q;int j;j=1;p=L;while(p->next&&j<i){p=p->next;j++;}if(p->next==NULL)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;free(q);printf("第%d 个元素已从链表中删除\n",i);}}LinkedList LinkedListCreat(){LinkedList L=LinkedListInit(),p,r;ElemType x;r=L;printf("请依次输入链表中的元素,输入-1结束\n"); scanf("%d",&x);while(x!=flag){p=(LinkedList)malloc(sizeof(LNode));p->data=x;r->next=p;r=p;scanf("%d",&x);}r->next=NULL;return L;}int scan(){int d;printf("请选择要进行的操作\n");printf("-------------------------------------------------------\n"); printf("1.初始化 2.清空 3.求链表长度 4.检查链表是否为空\n"); printf("-------------------------------------------------------\n"); printf("5.遍历链表 6.从链表中查找元素\n");printf("-------------------------------------------------------\n"); printf("7.从链表中查找与给定元素值相同的元素在顺序表中的位置\n"); printf("-------------------------------------------------------\n"); printf("8.向链表中插入元素 9.从链表中删除元素 10创建线性表\n"); printf("-------------------------------------------------------\n"); printf("其他键退出。

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

链表顺序表实验报告--数据结构与算法分析
顺序表:
1.顺序表的定义
(1) 顺序存储方法
即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。
(2) 顺序表(Sequential List)
用顺序存储方法存储的线性表简称为顺序表(Sequential List)。
2. 结点ai的存储地址
不失一般性,设线性表中所有结点的类型相同,则每个结点所占用存储空间大小亦相同。假设表中每个结点占用c个存储单元,其中第一个单元的存储地址则是该结点的存储地址,并设表中开始结点a1的存储地址(简称为基地址)是LOC(a1),那么结点ai的存储地址LOC(ai)可通过下式计算:
程序流程图
3.源程序清单:
//顺序表实现城市数据库
#include <iostream>
#include <string>
#include "stdlib.h"
#include <iomanip>
#include <fstream>
using namespace std;
#define LIST_INIT_SIZE 100
}
*q =e;
L.length++;
cout<<"插入成功"<<endl;
return;
}
cout<<"插入位置非法!"<<endl;
}
//按名字删除元素,并由e返回其值
void ListDelete_Name(SqList &L, string name, CityData &e)
{
if(L.length > 0)

数据结构课程设计实验1_城市链表

数据结构课程设计实验1_城市链表

数据结构课程设计实验报告实验一链表部分选题为:2.4.3—城市链表1、需求分析(1)创建一个带有头结点的单链表。

(2)结点中应包含城市名和城市的位置坐标。

(3)对城市链表能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。

(4)能够对每次操作后的链表动态显示。

2、概要设计为了实现以上功能,可以从以下3个方面着手设计。

(1)主界面设计为了实现城市链表相关操作功能的管理,设计一个含有多个菜单项的主控菜单子程序以系统的各项子功能,方便用户使用本程序。

本系统主控菜单运行界面如下所示。

(2)存储结构设计本系统主要采用链表结构类型来表示存储在“城市链表”中的信息。

其中链表结点由4个分量组成:城市名name、城市的横坐标posx、城市的纵坐标posy、指向下一个结点的指针next。

(3)系统功能设计本程序设计了9个功能子菜单,其描述如下:①建立城市链表。

由函数creatLink()实现。

该功能实现城市结点的输入以及连接。

②插入链表记录。

由函数insert()实现。

该功能实现按坐标由小到大的顺序将结点插入到链表中。

③查询链表记录。

由searchName()函数和searchPos()函数实现。

其中searchName()实现按照城市名查询的操作,searchPos()实现按照城市坐标查询的操作。

④删除链表记录。

由delName()函数和delPos()函数实现。

其中delName()函数实现按照城市名删除的操作,delPos()函数实现按照城市坐标删除的操作。

⑤ 显示链表记录。

由printList ()函数实现。

该功能实现格式化的链表输出操作,可以显示修改后的链表状态。

⑥ 更新链表信息。

由update ()函数实现。

该功能实现按照城市名更新城市的坐标信息。

⑦ 返回城市坐标。

由getPos ()函数实现。

该功能实现给定一个已存储的城市,返回其坐标信息的操作。

⑧ 查看与坐标P 距离小于等于D 的城市。

由getCity ()函数实现。

链表实验报告总结

链表实验报告总结

篇一:链表实验报告数据结构实验报告姓名;方钢学号:20105567 专业:电子商务班级: 10-1班指导教师:实验时间:实验地点:新区实验楼4楼(实验题目)单链表实验1.实验内容和要求1.1实验要求①本次实验中的链表结构均为带头结点的单链表;②链表结构定义,算法实现放入库文件“linklist.h”;运算和变量命名直观易懂,并有相应的注释1.2实验内容&lt;1&gt;求链表中第i个结点的指针(函数),若不存在,则返回null。

&lt;2&gt;在第i 个结点前插入值为x的结点。

&lt;3&gt;删除链表中第i个元素结点。

&lt;4&gt;在一个递增有序的链表l中插入一个值为x的元素,并保持其递增有序特性。

&lt;5&gt;将单链表l中的奇数项和偶数项结点分解开(元素值为奇数、偶数),申请2个头结点,把分开的奇数项和偶数项分别链接到这2个头结点上,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。

&lt;6&gt;求两个递增有序链表l1和l2中的公共元素,并以同样方式连接成链表l3。

2.实验目的2.1 理解线性表的链式存储结构。

2.2熟练掌握单链表结构及有关算法的设计。

2.3根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

3.数据结构设计&lt;1&gt;求链表中第i个结点的指针(函数),若不存在,则返回null。

实验代码node *l,*p;int i; createnode(*&amp;l); //尾插法创建一个链表,cout&lt;&lt;链表包含:&lt;&lt;endl;p=l-&gt;next; while(p){cout&lt;&lt;p-&gt;data&lt;&lt;,;p=p-&gt;next; }cout&lt;&lt;endl;cout&lt;&lt;请输入待求元素序号:;cin&gt;&gt;i; locatenode (l, i, &amp;p );if(p!=null)cout&lt;&lt;序号&lt;&lt;i&lt;&lt;的元素值为:&lt;&lt;p-&gt;data&lt;&lt;endl;elsecout&lt;&lt;null&lt;&lt;endl;destroylist(l); //销毁链表,释放heap内存_crtdumpmemoryleaks(); //debug 模式下检测是否内存泄漏测试截图&lt;2&gt;在第i个结点前插入值为x的结点。

数据结构实验报告1讲解

数据结构实验报告1讲解

实验目的:1、学会将信息存入带头结点的单链表中。

2、能够对节点中的信息进行查找、插入、删除和更新等操作。

3、学会对单链表的信息进行灵活运用,能够结合到实际运用中。

实验内容:【问题描述】:将若干城市的信息,存入一个带头结点的单链表。

结点中的城市信息包括:城市名,城市的位置坐标。

要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。

【基本要求】(1)给定一个城市名,返回其位置坐标;(2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。

【测试数据】由学生依据软件工程的测试技术自己确定。

注意测试边界数据。

实验步骤:(一)需求分析1、本演示程序中,需要建立一个新的城市链表,链表建成后根据计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中的运算命令和输入相应的数据并输出结果;2、程序执行的命令包括:1)建立城市链表;2)查找城市;3)添加城市;4)删除城市;5)城市更新;6)输出链表;7)城市搜索;8)退出链表。

3、测试数据:城市名:wuhan 坐标:(23,12)人口:939 面积:352城市名:beijing 坐标:(73,32)人口:637 面积:673城市名:shanghai 坐标:(43,22)人口:876 面积:342 (二)概要设计1、数据类型定义:单链表的存储结构typedef struct LNode{ ElemType data;struct LNode *next;}LNode,*LinkList;typedef struct{char name[20];int x;int y;float population;float area;}LinkList;创建链表:LinkList Create()销毁链表:void destroyLinkList(LinkList &L)插入城市:Insert(LinkList L,LinkList Elem)打印城市链表:PrintL(LinkList L)打印城市信息:PrintP(LinkList P)按城市名查找:LinkList SearchName(LinkList L,char name[]) 按城市位置查找:LinkList SearchPosition(LinkList L,int X,int Y) 按城市名删除:LinkList DelName(LinkList L,char name[])按城市位置删除:LinkList DelPosition(LinkList L,int X,int Y) 按城市名更新:LinkList ChangeName(LinkList L,char name[]) 按城市位置更新:LinkList ChangePosition(LinkList L,int X,int Y)城市搜索:Search(LinkList L,int X,int Y,float r)2、本程序还有8个模块:主程序模块:void main(){switch()case 1:建立城市链表模块;case 2:查找城市模块;case 3:添加城市模块;case 4:删除城市模块;case 5:城市更新模块;case 6:输出链表模块;case 7:城市搜索模块;case 0:退出;}各模块关系如下(三)详细设计1、定义元素的类型、结点类型和指针类型typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList; //结点类型,指针类型Status LinkList Create(LinkList &L,ElemType e){ //分配由L指向的元素为e、后继为空的结点时,则创建链表//若分配失败,则销毁链表LL=(LinkList)malloc(sizeof(LNode));if(!L){destroyLinkList(L);}L->data=e;L->next=NULL;}void destroyLinkList(LinkList &L){ //空间分配失败后,对链表L进行销毁LinkList P;P=L->next;L->next=P->next;delete P;P=L->next;L=NULL;}2、根据单链表的基本操作的特点,实现链表元素的查找、增加、删除。

实验链表实验报告

实验链表实验报告

实验链表实验报告一、实验目的本次实验的主要目的是深入理解链表这种数据结构的概念、特点和操作方法,并通过实际编程实现来提高对链表的应用能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验原理链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

与数组不同,链表的内存分配是动态的,并且可以方便地进行插入和删除操作,而不需要移动大量的元素。

链表分为单向链表、双向链表和循环链表等多种类型。

在本次实验中,我们主要实现单向链表。

单向链表的节点结构通常包含数据域和指针域。

数据域用于存储节点的数据,指针域用于指向下一个节点。

通过遍历链表的指针,可以访问链表中的每个节点。

四、实验内容1、链表节点的定义```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```2、链表的创建```cppListNode createList(){ListNode head = NULL;ListNode tail = NULL;int num;cout <<"请输入链表中的数字(输入-1 结束):";cin >> num;while (num!=-1) {ListNode newNode = new ListNode(num);if (head == NULL) {head = newNode;tail = newNode;} else {tail>next = newNode;tail = newNode;}cin >> num;}return head;}```3、链表的遍历```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {cout << curr>data <<"";curr = curr>next;}cout << endl;}```4、链表的插入```cppvoid insertNode(ListNode& head, int position, int value) {ListNode newNode = new ListNode(value);if (position == 0) {newNode>next = head;head = newNode;return;}ListNode curr = head;int count = 0;while (curr!= NULL && count < position 1) {curr = curr>next;count++;}if (curr == NULL) {cout <<"插入位置超出链表长度" << endl; return;}newNode>next = curr>next;curr>next = newNode;}```5、链表的删除```cppvoid deleteNode(ListNode& head, int position) {if (head == NULL) {cout <<"链表为空,无法删除" << endl; return;}if (position == 0) {ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;ListNode prev = NULL;int count = 0;while (curr!= NULL && count < position) {prev = curr;curr = curr>next;count++;}if (curr == NULL) {cout <<"删除位置超出链表长度" << endl; return;}prev>next = curr>next;delete curr;}```五、实验结果通过对上述链表操作函数的调用,我们成功地创建、遍历、插入和删除了链表中的节点。

链表实验报告总结

链表实验报告总结

链表实验报告总结篇一:顺序表,链表总结实验报告实验报告实验目的:学生管理系统(顺序表)实验要求:1.建表2.求表长3.插入4.查找5.删除6.列表7.退出源程序:#include#include#include#define MaxSize 1000typedef struct{char xh[40];char xm[40];int cj;}DataType; //学生的结构typedef struct {DataType data[MaxSize]; //定义表的数据类型int length; //数据元素分别放置在data[0]到data[length-1]当中} SqList; //表的结构void liebiao(SqList *L)//{int k,n;char q;printf("请输入,输入学生的个数:\n");fflush(stdin);scanf("%d",&n);for(k=0;k {printf("请输入学生学号\n");scanf("%s",L->data[k].xh);printf("请输入学生名字\n");scanf("%s",L->data[k].xm);printf("请输入学生成绩\n");scanf("%d",&L->data[k].cj); 建立表格}L->length=n;}void qb(SqList *L) //全部输出{int k,w;for(k=0;klength;k++){w=k+1;printf("第%d位学生:",w);printf("%s %s%d\n",L->data[k].xh,L->data[k].xm,L->d ata[k].cj);}}int cr(SqList *L,DataType *xs,int i) //插入信息{int j;if(L->length==MaxSize){printf("没有!");return 0;else if((iL->length)){printf("程序溢出,不符合");return 0;}else{for(j=L->length-1;j>=i;j--){strcpy(L->data[j+1].xh,L->data[j].xh); strcpy(L->data[j+1].xm,L->data[j].xm);L->data[j+1].cj=L->data[j].cj;}strcpy(L->data[i].xh,xs->xh);strcpy(L->data[i].xm,xs->xm);L->data[i].cj=xs->cj;L->length=L->length+1;}return 0;}int cz(SqList *L) //查找信息char xh[40];char xm[40];int cj;int i=0,u;printf(" 1、按学号查询\n"); printf(" 1、按姓名查询\n"); printf(" 1、按成绩查询\n"); printf("请选择:");fflush(stdin);scanf("%d",&u);if (u==1){printf("请输入要查找学生的学号:");scanf("%s",xh);for(i=0;ilength;i++){篇二:单链表的实验报告辽宁工程技术大学上机实验报告篇三:单链表实验报告实验一线性表基本操作的编程实现--线性表在链表存储下的主要操作实现班级:T523-1 姓名:王娟学号:33完成日期: 地点:5502学时:2学时一、需求分析【实验目的】通过本次实验,对课堂上线性表的知识进行巩固,进一步熟悉线性表的链接存储及相应的基本操作;并熟练掌握VC++ 6.0操作平台,学会调试程序,以及编写电子实验报告【实验要求】编写线性表的基本操作,有构造线性表,线性表的遍历,插入,删除,查找,求表长等基本功能,在此基础上能够加入DOS下的图形界面以及学会文件的操作等功能,为以后的学习打下基础。

城市链表实验报告汇总

城市链表实验报告汇总

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;while(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;}}该算法主要用到了勾股定理,考虑到不需要实际数值,只需要大小比较,所以只用横坐标差的平方+纵坐标差的平方 <= 距离的平方判定。

链表的基本操作实验报告

链表的基本操作实验报告

链表的基本操作实验报告链表的基本操作实验报告引言:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表相较于数组拥有更灵活的操作,能够动态地增删节点。

本实验旨在通过实际操作链表,加深对链表基本操作的理解和掌握。

实验目的:1. 理解链表的基本概念和结构;2. 学会链表的插入、删除和遍历操作;3. 掌握链表的相关算法。

实验过程:1. 创建链表首先,我们需要创建一个链表。

链表可以是单链表、双链表或循环链表,本次实验我们选择创建一个单链表。

创建链表的过程如下:(1)定义一个链表的节点结构,包含数据和指向下一个节点的指针;(2)创建头节点,并将头节点的指针指向NULL,表示链表为空。

2. 插入节点链表的插入操作可以在链表的任意位置插入节点。

我们可以选择在链表的头部、尾部或指定位置插入节点。

下面以在链表头部插入节点为例,介绍插入节点的过程:(1)创建一个新节点,设置新节点的数据;(2)将新节点的指针指向原头节点;(3)将头节点的指针指向新节点,完成插入操作。

3. 删除节点链表的删除操作可以删除链表中的任意节点。

同样,我们可以选择删除链表的头部、尾部或指定位置的节点。

以下是删除链表头部节点的步骤:(1)将头节点的指针指向下一个节点,跳过原头节点;(2)释放原头节点的内存空间。

4. 遍历链表链表的遍历操作用于访问链表中的每个节点。

通过遍历链表,我们可以获取链表中的所有数据或执行特定的操作。

链表的遍历操作如下:(1)从链表的头节点开始,依次访问每个节点;(2)对每个节点执行相应的操作,如打印节点的数据。

实验结果:通过以上实验过程,我们成功地创建了一个链表,并实现了链表的插入、删除和遍历操作。

链表的基本操作能够灵活地处理数据,适用于各种场景。

链表的插入和删除操作可以在O(1)时间内完成,相较于数组的插入和删除操作具有更高的效率。

实验总结:链表作为一种常见的数据结构,具有灵活性和高效性的特点。

数据结构课程设计实验1 城市链表

数据结构课程设计实验1 城市链表

数据结构课程设计实验1 城市链表城市链表是数据结构课程设计实验1的主题之一,该实验旨在让学生通过设计和实现一个城市链表来加深对数据结构的理解和应用能力。

在这个实验中,学生需要使用合适的数据结构和算法来表示和操作城市信息,以便能够方便地进行城市的增删改查等操作。

一、实验目的本实验的目的是让学生掌握以下内容:1. 理解链表这种数据结构的定义和基本操作;2. 掌握链表的插入、删除、查找等操作的实现方法;3. 熟悉链表的遍历和修改操作;4. 能够设计和实现一个城市链表,实现城市信息的增删改查等功能。

二、实验要求1. 设计一个城市链表的数据结构,包括城市名称、人口数量、GDP等信息;2. 实现城市链表的创建、插入、删除、查找等操作;3. 实现城市链表的遍历和修改操作;4. 实现城市链表的保存和读取功能,将城市信息保存到文件中;5. 编写测试程序,测试城市链表的各项功能是否正确实现。

三、实验设计1. 数据结构设计城市链表的数据结构可以使用单向链表或者双向链表来实现。

每一个节点包含城市名称、人口数量、GDP等信息,可以使用结构体来定义节点的数据类型。

2. 城市链表操作的实现a. 创建链表:通过读取文件或者手动输入的方式创建一个空的城市链表。

b. 插入节点:实现在链表的指定位置插入一个新的城市节点。

c. 删除节点:实现删除链表中指定位置的城市节点。

d. 查找节点:实现根据城市名称查找链表中对应的城市节点。

e. 遍历链表:实现遍历链表,输出链表中的所有城市信息。

f. 修改节点:实现修改链表中指定位置的城市节点的信息。

g. 保存和读取:将链表中的城市信息保存到文件中,并能够从文件中读取城市信息。

3. 测试程序设计编写一个测试程序,对城市链表的各项功能进行测试。

包括创建链表、插入节点、删除节点、查找节点、遍历链表、修改节点、保存和读取等功能的测试。

四、实验步骤1. 设计链表的数据结构,定义节点的数据类型和链表的操作函数。

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

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

数据结构与算法分析课程设计报告课题名称: 使用一个链表和顺序表构建城市数据库提交文档组号: 2 编程学生姓名及学号:测试学生姓名及学号:报告学生姓名及学号:指导教师姓名:指导教师评阅成绩:指导教师评阅意见:..提交报告时间: 2013 年 11 月日实验一:Implement a city database using unordered lists and link lists1.实验的目的和要求:<1>采用C++的ASCII码文件和模块函数实现;<2>熟练掌握数组列表和链表列表的实现;<3>熟练掌握计算机系统的基本操作方法,了解如何编译、运行一个C++程序;<4>上机调试程序,掌握查错、排错使程序能正确运行。

2. 实验的环境:1、硬件环境:索尼笔记本电脑,Intel(R) Core(TM) i7-3632M ,8GB内存可;2、软件环境:Windows 8 下的Microsoft Visual Studio 20082.算法描述:数据结构与算法分析的背景:数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课称,而且已成为其他理工专业的热门选修课。

数据结构是一门专业选技术基础科。

一方面,它要求我们学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术;另一方面,数据结构的学习过程也是复杂程序设计的训练过程,要求我们编写的程序结构清楚和正确易读,复合软件工程的规范,并培养我们的数据抽象能力。

本次课程设计就是对数据结构中的顺序表和链表的操作的应用。

顺序表:1.顺序表的定义(1) 顺序存储方法即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。

(2) 顺序表(Sequential List)用顺序存储方法存储的线性表简称为顺序表(Sequential List)。

城市链表实验报告

城市链表实验报告

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;while(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;}}该算法主要用到了勾股定理,考虑到不需要实际数值,只需要大小比较,所以只用横坐标差的平方+纵坐标差的平方 <= 距离的平方判定。

链表-实验报告

链表-实验报告

实验2 链表实验概述:一、实验目的本次实习的主要目的是为了使学生熟练掌握链表的基本操作以及在链式存储结构上的实现,包括创建、插入、删除、查找、以及合并等操作。

二、实验要求掌握链表存储方式,熟悉链式存储结构。

三、实验步骤用链表结构实现对多项式初始化、创建、插入、删除等运算。

步骤:输入第一个多项式:7x+2x3输入第二个多项式:8x+9x5输出第一个多项式输出第二个多项式输出两个多项式相加的结果:15x+2x3+9x5实验结果如图:四、实验环境(使用的软件和设备)(1)实习器材:多媒体计算机。

(2)实习地点:校内多媒体机房。

(3)实习软件: Win-TC实验内容:【实验过程】(实验步骤、记录、数据、分析)实验过程(提示)输入第一个多项式:7x+2x3输入第二个多项式:8x+9x5输出第一个多项式输出第二个多项式输出两个多项式相加的结果:15x+2x3+9x5【结果实验记录】(图形或图像)1.说明掌握情况#include<stdio.h>#include<stdlib.h>typedef struct{int sat1,sat2,sat3,sat4;}ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;LinkList InitList(){ LinkList L;L=(LinkList)malloc(sizeof(LNode)); L->next=NULL;return(L);}void InsLNode(LinkList L,ElemType x){ LinkList s,p;s=(LinkList)malloc(sizeof(LNode));s->data=x;p=L;while(p->next)p=p->next;s->next=NULL;p->next=s;}void AddPolyn(LinkList La,LinkList Lb){int sum;int a,b;LinkList pa,pb;pa=La->next;pb=Lb->next;a=pa->data.sat1;b=pb->data.sat1;sum=a+b;printf(" %dx%d exp",sum,pa->data.sat2);printf("+");printf(" %dx%d exp+",pa->data.sat3,pa->data.sat4); printf(" %dx%d exp\n",pb->data.sat3,pb->data.sat4);}void Print(LinkList L){ LinkList p;p=L->next;printf(" %dx%d exp",p->data.sat1,p->data.sat2); printf("+");printf(" %dx%d exp",p->data.sat3,p->data.sat4);}main() {LinkList La,Lb;ElemType c,b;int a,i;La=InitList();Lb= InitList();printf("Please input polynomial La:\n");scanf("%d %d",&c.sat1,&c.sat2);scanf("%d %d",&c.sat3,&c.sat4);InsLNode(La,c);printf("Please input polynomial Lb:\n");scanf("%d %d",&b.sat1,&b.sat2);scanf("%d %d",&b.sat3,&b.sat4);InsLNode(Lb,b);printf("polynomial La:");printf("\n");Print(La);printf("\n");printf("polynomial Lb:");printf("\n");Print(Lb);printf("\n");printf("La+Lb:");printf("\n");AddPolyn(La,Lb);printf("\n");getch();}2.裁图说明实验结果【心得体会、问题和建议】成绩:指导教师签名批阅日期:。

链表的基本操作实验报告

链表的基本操作实验报告

《数据结构》实验报告学号1445203105 姓名王胜博班级软件5班成绩实验名称实验三链表的基本操作是否原创是一、实验要求编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。

二、实验目的通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。

和实验2对比,掌握线性结构两种不同存储方式的区别。

三、设计思想用函数执行各个功能,随机插入元素四、主要源代码#include<stdio.h>#include<stdlib.h>#include<time.h>typedef int ElemType;typedef struct Node{ElemType data;struct Node *next;}Node, *LinkList;void InitList(LinkList *L){*L=(LinkList)malloc(sizeof(Node));if(!(*L))printf("存储分配失败\n");(*L)->next=NULL;}void DestroyList(LinkList L){LinkList p;while(L){p=L->next;free(L);L=p;}}int ListLength(LinkList L){LinkList p;int i=0;p=L->next;while(p){i++;p=p->next;}return i;}int GetElem(LinkList L,int i,ElemType &e){ LinkList p;p=L->next;int j=1;while(p&&j<i){p=p->next;++j;}e=p->data;return e;}int GetElemLo(LinkList L,int i,ElemType &e){ LinkList p;p=L->next;int j=1;while(p->data!=i&&j<=ListLength(L)){p=p->next;++j;}e=j;return e;}void FindPre(LinkList L,int x){LinkList p;p=L;if(p->next->data==x){printf("第一个元素没有前驱\n");}else{while(p->next){if(p->next->data==x){printf("%d的前驱结点是:%d\n",x,p->data);break;}else{p=p->next;}}}}void FindNext(LinkList L,int x){LinkList p;p=L->next;while(p){if(p->data==x){printf("%d的后继结点是:%d\n",x,p->next->data);break;}else{p=p->next;}if(p->next==NULL){printf("最后一个元素没有后继\n");break;}}}void LinkInset_L(LinkList &L,int i,ElemType e){ LinkList p;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1)printf("i小于1或者i大于表长加1\n");LinkList s;s=(LinkList)malloc(sizeof (Node));s->data=e;s->next=p->next;p->next=s;}void ListDelete_L(LinkList &L,int i,ElemType &e){ LinkList p,q;p=L;int j=0;while(p->next && j<i-1){p=p->next;++j;}if(!p->next ||j>i-1)printf("删除位置不合理\n");q=p->next;p->next=q->next;e=q->data;free(q);printf("已删除的元素是:%d\n",e);}void visit(ElemType e){printf("%d,",e);}void ListTraverse(LinkList L){LinkList p=L->next;while(p){visit(p->data);p=p->next;}printf("\n");}void CreatListTail(LinkList *L,int n){LinkList p,r;int i;srand(time(0));*L=(LinkList)malloc(sizeof(Node));r=*L;for(i=0;i<n;i++){p=(Node *)malloc(sizeof(Node));p->data=rand()%100+1;r->next=p;r=p;}r->next=NULL;}int main(){LinkList L;int opp;printf("可执行的操作有:\n");printf("1.初始化或重置链表\n");printf("2.随机插入元素\n");printf("3.显示链表中数据元素个数\n");printf("4.输出所输入的链表元素\n");printf("5.所指位序的元素值\n");printf("6.链表已存在元素的位序\n");printf("7.请输入元素,求直接前驱\n");printf("8.请输入元素,求直接后继\n");printf("9.在第i个位置插入元素\n");printf("10.删除第i个元素\n");printf("11.销毁链表\n");printf("12.退出\n");printf("\n");printf("请输入你的选择:\n");do{scanf("%d",&opp);switch(opp){case 1:{InitList(&L);printf("链表已初始化\n");printf("下一步操作:");break;}case 2:{int n;printf("输入插入元素个数:");scanf("%d",&n);CreatListTail(&L,n);printf("下一步操作:");break;}case 3:{printf("链表中元素的个数是:%d\n",ListLength(L));printf("下一步操作:");break;}case 4:{ListTraverse(L);printf("下一步操作:");break;}case 5:{int m,e;printf("输入要取元素的位置:");scanf("%d",&m);if(m>ListLength(L)){printf("输入有误\n");}else{GetElem(L,m,e);printf("该元素是:%d\n",e);}printf("下一步操作:");break;}case 6:{int i,e;printf("输入要取的元素:");scanf("%d",&i);GetElemLo(L,i,e);printf("该元素的位置是:%d\n",e);printf("下一步操作:");break;}case 7:{int x;printf("要求哪个元素的前驱?");scanf("%d",&x);FindPre(L,x);printf("下一步操作:");break;}case 8:{int x;printf("要求哪个元素的后继?");scanf("%d",&x);FindNext(L,x);printf("下一步操作:");break;}case 9:{int i,e;printf("在哪个位置插入元素?");scanf("%d",&i);if(i>ListLength(L))printf("输入有误\n");else{printf("插入的新元素是:");scanf("%d",&e);LinkInset_L(L,i,e);printf("新链表:");ListTraverse(L);}printf("下一步操作:");break;}case 10:{int i,e;printf("要删除哪个位置的元素?");scanf("%d",&i);if(i>ListLength(L))printf("输入有误\n");else{ListDelete_L(L,i,e);printf("新链表:");ListTraverse(L);}printf("下一步操作:");break;}case 11:{DestroyList(L);printf("链表已销毁!\n");printf("下一步操作:");break;}case 12:{printf("谢谢使用\n");break;}default:{printf("输入错误,请重新输入\n");break;}}}while(opp!=12);return 0;}五、调试与测试数据六、实验总结。

数据结构城市链表

数据结构城市链表

数据结构实验报告___09___级__x____班_xxxxx___年___xx___月__xx___日姓名__xxxxx___ 学号_xxxxxxx___ 得分_____________1.实验题目将若干城市的信息,存入一个带头结点的单链表。

结点中的城市信息包括:城市名,城市的位置坐标。

要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。

2.需求分析本演示程序用VC编写,完成城市链表的生成,插入、删除,更新等操作。

①输入的形式和输入值的范围:先创建一个城市链表需要输入五个城市的名称及城市的位置坐标;再输入你需要对链表的操作功能号1输出城市链表信息、2查找、3插入、4删除、5修改、6输出与坐标P距离小于D的城市、0退出程序.查找城市时输入城市的名称;插入城市信息时输入城西的名称及它的位置坐标;删除链表中的城市需输入城市的名称;修改城市链表是需输入旧的城市名和新的城市名及新的位置坐标;操作6应输入中心城市的坐标及一个距离范围。

在所有输入中,操作功能号是整数,城市名是单个的字母,位置坐标及距离是浮点型的数字。

②输出的形式:黑框界面出现时就提示出入5个城市的数据域,之后每次操作都会输出包含各个操作的功能表以供选择,输出城市链表是会输出城市名及位置坐标,其它的操作每一步都会输出相应的提示信息。

③程序所能达到的功能:完成城市链表的生成、插入、删除、查找及更新操作④测试数据:A.创建城市链表操作中依次输入e 1.0 2.0←d 2.0 2.5←c 4.5 3.2←b 5.42.6←a 7.4 5.2生成一个城市链表B.查找操作中输入城市名 c 返回这个城市的位置坐标4.5 3.2C.插入操作中依次输入新的城市名及位置坐标f,7.4,3.5,返回插入成功提示D.删除操作中输入需删除的城市名 f ,返回删除成功提示E.更新操作依次输入e,g,2.8,5.7 返回更新成功提示F.查找距离操作中依次输入中心坐标及距离3.8,6.4,2.66 返回链表中符合要求的城市信息g,2.8,5.73.概要设计1)为了实现上述程序功能,需要定义单链表的抽象数据类型:ADT LinkList {数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}数据关系:R={<ai,ai+1>|ai,ai+1 ∈D}基本操作:City CreateList()操作结果:构造一个城市链表L,录入五个城市信息.search()初始条件:城市链表已存在操作结果:查找是否有与输入值一致的城市名,若存在,返回城市的位置坐标;Insert()初始条件:城市链表已存在操作结果:将新的城市信息插入到链表中Delete()初始条件:城市链表已存在操作结果:删除链表需要删除的城市信息distance()初始条件:城市链表已存在操作结果:输出给定的一个距离范围内的所有城市信息alter()初始条件:城市链表已存在操作结果:修改链表中的城市信息print()初始条件:城市链表已存在操作结果:打印出城市链表中的所有城市信息begin()操作结果:在屏幕上显示操作功能号2)本程序包含8个函数:①主函数main()②创建城市链表函数City CreateList()③显示操作功能函数void begin()④显示单链表城市信息函数void print()⑤插入一个城市函数void Insert()⑥删除一个城市信息函数void Delete()⑦查找城市坐标函数void search()⑧修改城市链表函数void alter()⑧查找一个固定距离范围内的城市void distance()各函数间关系如下:4.详细设计#include<stdio.h>#include<malloc.h>#include<math.h>#include <stdlib.h>#include <string.h>typedef int status;typedef struct data{char Cname;float x;float y;}data;typedef struct CityNode{data data;struct CityNode *next;}CityNode,*City;City L;City CreateList(){//创建城市链表int i;City p;L=(City )malloc(sizeof(CityNode));L->next=NULL;printf("请输入5个城市的数据域:\n");for(i=0;i<5;i++){p=(City)malloc(sizeof(CityNode));scanf("%c %f %f",&p->ame,&p->data.x,&p->data.y);getchar();p->next=L->next;L->next=p;}return L;}void search(){//查找城市坐标char name;City p;p=L;printf("请输入需要查找的城市名:\n");scanf("%c",&name);printf("该城市的坐标为:\n");while(p){if(p->ame==name)printf("%f,%f",p->data.x,p->data.y);p=p->next;}}void Insert(){//插入新的城市City p=L->next;City s=(City)malloc(sizeof(CityNode));printf("请输入要插入的城市名及它的坐标");scanf("%c,%f,%f",&s->ame,&s->data.x,&s->data.y);s->next=p->next;p->next=s;printf("新城市%c插入成功\n",s->ame);}void Delete(){//删除城市City q,p=L->next;int j=0;char z;printf("请输入要删除的城市名:\n");scanf("%c",&z);while(p->ame!=z){q=p;p=p->next;}q->next=p->next;free(p);printf("删除成功!\n");}void distance(){//距离范围内的城市float s,d;float x1,y1,x2,y2;City p;p=L->next;printf("请输入中心坐标x1,y1:\n");scanf("%f,%f",&x1,&y1);printf("请输入与中心城市的距离范围d:\n");scanf("%f",&d);while(p){x2=p->data.x;y2=p->data.y;s=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));if(s<=d){printf("与(%f,%f)的中心城市的距离小于等于%f的城市有:\n",x1,y1,d); printf("%c,%f,%f",p->ame,x2,y2);}p=p->next;}}void alter(){//修改城市节点char a,b;float m,n;int k=0;City p=L;printf("请输入旧的城市名:");scanf("%c",&a);while(p->ame!=a){p=p->next;}printf("请输入新的城市名:\n");scanf(" %c",&b);printf("请输入新的城市坐标:\n");scanf("%f,%f",&m,&n);p->ame=b;p->data.x=m;p->data.y=n;}void print(){//输出城市链表int i;City a;char name[10];float x[10];float y[10];a=L->next;i=0;while(a){name[i]=a->ame;x[i]=a->data.x;y[i]=a->data.y;a=a->next;printf("%c (%f,%f)\n",name[i],x[i],y[i]);i++;}}void begin(){int i;do{printf("\n");printf("--------------------------------------------\n");printf(" 请选择需要操作的功能:\n");printf(" 1->输出城市链表信息\n");printf(" 2->查找\n");printf(" 3->插入\n");printf(" 4->删除\n");printf(" 5->修改\n");printf(" 6->与坐标P距离小于D的城市\n");printf(" 0->退出程序\n");printf("--------------------------------------------\n");printf("\n");printf("请输入您选择的功能号:");scanf("%d",&i);getchar();if(i>0)switch(i){case 1:print();break;case 2:search();break;case 3:Insert();break;case 4:Delete();break;case 5:alter();break;case 6:distance();break;case 0:break;}printf("\n");if(i<0)printf("您输入的数值不正确,请重新输入!\n");}while(i!=0);}void main(){CreateList();begin();}5.调试分析a.是如何解决的以及对设计与实现的回顾讨论和分析;调试过程中遇到的问题有在写调用函数是函数的形参的类型与实参的类型不一致我经常在很多地方符号丢失改进设想;直接将数值在调用的函数里定义、输入及输出避免在主函数里传实参值,这样就不易出错。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2014-2015学年第一学期实验报告课程名称:算法与数据结构实验名称:城市链表一、实验目的本次实验的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。

同时,通过本次实验帮助学生复习高级语言的使用方法。

二、实验内容(一)城市链表:将若干城市的信息,存入一个带头结点的单链表。

结点中的城市信息包括:城市名,城市的位置坐标。

要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。

(二) 约瑟夫环m 的初值为 20;密码:3,1,7,2,6,8,4(正确的结果应为 6,1,4,7,2,3,5)。

三、实验环境VS2010 、四、实验结果(一)城市链表:(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。

五、附录城市链表:问题分析该实验要求对链表实现创建,遍历,插入,删除,查询等操作,故使用单链表。

设计方案该程序大致分为以下几个模块:1.创建城市链表模块,即在空链表中插入新元素。

故创建城市链表中包涵插入模块。

2.返回位置坐标模块。

3.计算距离模块4.插入模块。

5.更新城市信息模块6.删除信息模块。

算法根据中心城市坐标,返回在距离内的所有城市:void FindCityDistance(citylist *L){l f,%.2lf\n",L->x,L->y);}L=L->next;}}该算法主要用到了勾股定理,考虑到不需要实际数值,只需要大小比较,所以只用横坐标差的平方+纵坐标差的平方 <= 距离的平方判定。

因中心城市本身也在判定范围之内,所以添加了判定条件横纵坐标差的和不能为零。

主程序中循环条件判定:for( ; ; ){printf("请选择您的操作\n");printf("1.创建城市链表\n");printf("2.根据名字查询城市\n");printf("3.插入\n");printf("4.删除\n");printf("5.更新城市信息\n");printf("6.根据离中心坐标距离查看城市\n");printf("7.退出系统\n");scanf("%d",&choice);switch(choice){printf("3.插入\n");printf("4.删除\n");printf("5.更新城市信息\n");printf("6.根据离中心坐标距离查看城市\n");printf("7.退出系统\n");printf("-----------------------------------\n");int choice;scanf("%d",&choice);switch(choice){case 1:Create_sqCity(L);getchar();break;case 2:Get_sqCityCoord(L);break;case 3:Insert_sqCity(L);break;case 4:Delete_sqCity(L);break;case 5:Update_sqCity(L);break;case 6:FindCityDistance(L);break;case 7:break;}if(choice == 7)break;}}仿真结果2.查询城市信息3 添加城市4 删除城市5 更新城市6 根据距离输出城市调试心得错误分析:实验中出现的第一个问题是声明变量,从键盘中读入数据是显示变量未初始化,调试后发现是scanf的问题,以后的实验中应注意scanf中读入信息后是存到了地址里。

算法复杂度的分析:所有程序除了InitList_SqCity 复杂度为O(1),其余均为O(n)。

收获对数据结构这门课地应用有了一定地了解,知道对线性表插入、删除等操作的实现,加深对课本地理解。

附录约瑟夫环:问题分析该实验要求循环连续查找信息,并删除节点,故使用单项循环链表。

设计方案1.建立单循环链表2.产生Joseph环3.输出顺序表算法构成单链表void Creat_JoephLink(int num){Node *head,*q,*L;L=(Node*)malloc(sizeof(Node));//申请第一个数的节点head=L;L->num=1;printf("输入第一个人的值:"); //输入第一个人的值scanf("%d",&(L->value));int i;for(i=2;i<=num;i++){q=(Node*)malloc(sizeof(Node));L->next=q;L=q;printf("输入第%d个人的值:",i); //输入每个人的值scanf("%d",&(L->value));L->num=i;}L->next=head;L=head;//构成单向循环链表}查找并删除节点Status Delete_Node(Node *L){for (j=1;j<=num;j++){for(i=1;i<m;i++){//i做循环变量L=L->next;}m=L->value;//将当前值设为m值printf("%d ",L->num);//输出当前节点信息//删除当前节点L->num=L->next->num;L->value=L->next->value;q=L->next;L->next=L->next->next;free(q);}}源程序代码typedef struct Node{int value;Node *next;int num;}Node;void Creat_JoephLink(int num){Node *head,*q,*L;L=(Node*)malloc(sizeof(Node));//申请第一个数的节点head=L;L->num=1;printf("输入第一个人的值:"); //输入第一个人的值scanf("%d",&(L->value));int i;for(i=2;i<=num;i++){q=(Node*)malloc(sizeof(Node));L->next=q;L=q;printf("输入第%d个人的值:",i); //输入每个人的值scanf("%d",&(L->value));L->num=i;}L->next=head;L=head;//构成单向循环链表int m;int j;printf("输入初始值m的大小");scanf("%d",&m);printf("结果是:\n");for (j=1;j<=num;j++){for(i=1;i<m;i++){//i做循环变量L=L->next;}m=L->value;//将当前值设为m值printf("%d ",L->num);//输出当前节点信息//删除当前节点L->num=L->next->num;L->value=L->next->value;q=L->next;L->next=L->next->next;free(q);}}int main(){int num;printf("输入人数:"); /*输入测试人的数量*/ scanf("%d",&num);Creat_JoephLink(num);}运行结果调试心得错误分析查找到第m个节点删除时出错,显示有未处理的异常,是因为节点赋值的时候有问题。

收获从开始构建循环链表然后实现约瑟夫环功能的过程中,中途也遇见一些问题,但都逐一克服,整个过程进展不是很顺利,都是不停的调试,实验之后,我还对数据结构这门课有了一定的认识。

在解决一个具体问题时,常常需要从具体问题中抽象出一个模型,也就是抽象数据类型,然后设计一个解决这个模型的算法。

再通过其算法编出程序,进行调试、调整直至得到最终解答。

相关文档
最新文档