当前位置:
文档之家› 链表顺序表实验报告--数据结构与算法分析
链表顺序表实验报告--数据结构与算法分析
顺序表:
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)
链表顺序表实验报告--数据结构与算法分析
数据结构与算法分析课程设计报告
课题名称:使用一个链表和顺序表构建城市数据库
提交文档组号:2
编程学生姓名及学号:
测试学生姓名及学号:
报告学生姓名及学号:
指导 教 师 姓 名:
指导教师评阅成绩:
指导教师评阅意见:
.
.
提交报告时间: 2013 年 11 月 日
实验一:Implement a city database using unordered listsand link lists
return (L.length == 0)? false : true;
}
int ListLength(SqList L)
{
return L.length;
}
//获取第i个元素(从1开始计数,下同)
void GetElem(SqLiБайду номын сангаасt L, int i, CityData &e)
{
if(i<1 || i>L.length)
5:采用数组描述方法的集合仅需要能够保存所有元素的空间以及保存集合最大尺寸所需要的空间。链表描述需要除集合元素本身的空间意外,还需要额外的空间,用例保存链接节点指向下一个节点位置的指针。但一般情况下,链表描述要比数值描述的空间利用率高得多。
6:虽然数组描述、链表描述插入和删除操作的平均时间复杂度均为O(length),但由于移动元素的操作比遍历元素的操作的开销要大得多,所以采用链表描述所实现的插入和删除操作要比数组描述执行得更快。而采用数组描述可以在常数时间内访问第k个元素,而在链表中,这种操作所需要的时间是O(k)。
for(; p<=q; p++)
{
*p = *(p+1);
}
L.length--;
cout<<"删除成功"<<endl;
}
else
{
cout<<"数据库中没有该记录"<<endl;
}
}
}
//按坐标删除元素,,并由e返回其值
void ListDelete_Coordinate(SqList &L, int X, int Y, CityData &e)
1.实验的目的和要求:
<1>采用C++的ASCII码文件和模块函数实现;
<2>熟练掌握数组列表和链表列表的实现;
<3>熟练掌握计算机系统的基本操作方法,了解如何编译、运行一个C++程序;
<4>上机调试程序,掌握查错、排错使程序能正确运行。
2.实验的环境:
1、硬件环境:索尼笔记本电脑,Intel(R) Core(TM) i7-3632M,8GB内存可;
#define LISTINCREMENT 10
#define ElemType string
typedef struct
{
ElemType m_Name;
int m_X;
int m_Y;
}CityData;
typedef struct
{
CityData *elem;
int length;//当前表长
{
CityData *p = &(L.elem[0]);
int count = 0;
while(p->m_Name!=name && count<L.length)
{
count++;
p++;
}
//之后将此元素后的元素依次向前移动一位,下同
if(count < L.length)
{
e = *p;
CityData *q = L.elem + L.length -1;
p = L.elem;
int i = 0;
while(i<L.length && !(compare(*p, e)))
{
p++;
i++;
}
if(i < L.length)
{
return i+1;
}
else
{
return 0;
}
}
//在第i个元素后插入一个元素
void ListInsert_Sq(SqList &L, int i, CityData e)
② 当插入位置i的值为i>n或i<1时为非法位置,不可做正常插入操作;
(2) 顺序表插入操作过程
在顺序表中,结点的物理顺序必须和结点的逻辑顺序保持一致,因此必须将表中位置为n ,n-1,…,i上的结点,依次后移到位置n+1,n,…,i+1上,空出第i个位置,然后在该位置上插入新结点x。仅当插入位置i=n+1时,才无须移动结点,直接将x插入表的末尾。
}
void DestroyList(SqList &L)
{
L.length = 0;
L.listsize = 0;
free(L.elem);
L.elem = NULL;
}
void ClearList(SqList &L)
{
L.length = 0;
}
bool ListEmpty(SqList L)
{
{
base[count] = L.elem[count];
}
L.elem = new CityData[L.listsize + LISTINCREMENT];
for(int num=0; num<L.length; num++)
{
L.elem[num] = base[num];
}
delete []base;
{
cout<<"错误的位置!"<<endl;
return ;
}
else
{
e = L.elem[i-1];
}
}
//查找节点e 返回位置
int LocateElem(SqList L, CityData e, bool (*compare)(CityData, CityData))
{
CityData *p;
(1) 插入运算的逻辑描述
线性表的插入运算是指在表的第i(1≤i≤n+1)个位置上,插入一个新结点x,使长度为n的线性表:
(a1,…,ai-1,ai,…an)
变成长度为n+1的线性表:(a1,…,ai-1,x,ai,…an)
注意:
① 由于向量空间大小在声明时确定,当L->length≥List Size时,表空间已满,不可再做插入操作;
{
if(L.length > 0)
{
CityData *p = &(L.elem[0]);
int count = 0;
while(p->m_X!=X && p->m_Y!=Y && count<L.length)
{
count++;
p++;
}
if(count < L.length)
{
e = *p;
CityData *q = L.elem + L.length -1;
(4)算法分析
① 问题的规模
表的长度L->length(设值为n)是问题的规模。
② 移动结点的次数由表长n和插入位置i决定
算法的时间主要花费在for循环中的结点后移语句上。该语句的执行次数是n-i+1。
当i=n+1:移动结点次数为0,即算法在最好时间复杂度是0(1)