当前位置:文档之家› 链表顺序表实验报告--数据结构与算法分析

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

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

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

数据结构与算法分析课程设计报告

课题名称: 使用一个链表和顺序表构建城市数据库

提交文档组号: 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.算法描述:

数据结构与算法分析的背景:

数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课称,而且已成为其他理工专业的热门选修课。

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

范,并培养我们的数据抽象能力。本次课程设计就是对数据结构中的顺序表和链表的操作的应用。

顺序表:

1.顺序表的定义

(1) 顺序存储方法

即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。

(2) 顺序表(Sequential List)

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

2.结点a

i

的存储地址

不失一般性,设线性表中所有结点的类型相同,则每个结点所占用存储空间大小亦相同。假设表中每个结点占用c个存储单元,其中第一个单元的存储地址则是该结点的存储地址,并设表中开始结

点a

1的存储地址(简称为基地址)是LOC(a

1

),那么

结点a

i 的存储地址LOC(a

i

)可通过下式计算:

LOC(a

i )= LOC(a

1

)+(i-1)*c 1

≤i≤n

注意:

在顺序表中,每个结点a

i

的存储地址是该结点在表中的位置i的线性函数。只要知道基地址和每个结点的大小,就可在相同时间内求出任一结点的存储地址。是一种随机存取结构。

顺序表上实现的基本运算:

表的初始化;求表长;取表中第i个结点;查找值为x

的结点;插入

(1)插入运算的逻辑描述

线性表的插入运算是指在表的第i(1≤i≤n+1)个位置上,插入一个新结点x,使长度为n的线性表:

(a

1,…,a

i-1

,a

i

,…a

n

变成长度为n+1的线性表:(a

1,…,a

i-1

,x,a

i

,…

a

n

注意:

①由于向量空间大小在声明时确定,当L->length≥List Size时,表空间已满,不可再做插入操作;

②当插入位置i的值为i>n或i<1时为非法位置,不可做正常插入操作;

(2)顺序表插入操作过程

在顺序表中,结点的物理顺序必须和结点的逻辑顺序保持一致,因此必须将表中位置为n ,

n-1,…,i上的结点,依次后移到位置n+1,n,…,i+1上,空出第i个位置,然后在该位置上插入新结点x。仅当插入位置i=n+1时,才无须移动结点,直接将x插入表的末尾。

(4)算法分析

①问题的规模

表的长度L->length(设值为n)是问题的规模。

②移动结点的次数由表长n和插入位置i决定

算法的时间主要花费在for循环中的结点后移语句上。该语句的执行次数是n-i+1。

当i=n+1:移动结点次数为0,即算法在最好时间复杂度是0(1)

当i=1:移动结点次数为n,即算法在最坏情况下时间复杂度是0(n)

③移动结点的平均次数E

(n)

is

链表:

1:一个单向链表的节点被分成两个部分。第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址。单向链表只可向一个方向遍历。

2:链表最基本的结构是在每个节点保存数据和到下一个节点的地址,在最后一个节点保存一个特殊的结束标记,另外在一个固定的位置保存指向第一个节点的指针,有的时候也会同时储存指向最后一个节点的指针。一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。但是也可以提前把一个节点的位置另

外保存起来,然后直接访问。当然如果只是访问数据就没必要了,不如在链表上储存指向实际数据的指针。这样一般是为了访问链表中的下一个或者前一个(需要储存反向的指针)节点。

3:在链表描述中,集合中的元素都放在链表的节点中进行描述。链表中的节点不是一个数组元素,因此不能通过公式来映射定位某个元素。取而代之的是,每个节点中都包含了下一个节点的位置信息,链表的表头包含了第一个节点的位置信息。

4.1:为了在集合中找到第k个元素,就必须从表头开始,遍历第1个到第k个节点。它的时间复杂度是O(k),平均时间复杂度为O(length)。

4.2:为了在集合中删除第k个元素,就要先找到第k-1和第k个节点,使第k-1个节点的下一个节点位置信息指向第k+1个节点,然后释放第k个节点所占的空间。它的时间复杂度是O(k),平均时间复杂度为O(length)。

4.3:插入和删除的过程很相似,首先要创建一个新的节点,然后找到第k-1个节点,在该节点的后面插入新的节点,并把第k-1个节点、新的节点的下一个节点位置信息进行适当设置。它的时间复杂度是O(k),平均时间复杂度为O(length)。

5:采用数组描述方法的集合仅需要能够保存所

有元素的空间以及保存集合最大尺寸所需要的空间。链表描述需要除集合元素本身的空间意外,还需要额外的空间,用例保存链接节点指向下一个节点位置的指针。但一般情况下,链表描述要比数值描述的空间利用率高得多。

6:虽然数组描述、链表描述插入和删除操作的平均时间复杂度均为O(length),但由于移动元素的操作比遍历元素的操作的开销要大得多,所以采用链表描述所实现的插入和删除操作要比数组描述执行得更快。而采用数组描述可以在常数时间内访问第k个元素,而在链表中,这种操作所需要的时间是O(k)。

顺序表:

Switch语句,case 语句;

ListInsert_Sq(L, 1,

GetCityData()); ListDelete_Name(L , GetName(), 单链表:

void

CreateList(LinkList

&L)

void

ClearList(LinkList &L) void Destroy(LinkList &L)

bool GetElem(LinkList

程序流程图

城市数据

插入城市读取已保打印所有按指定距按坐标查按名字查按坐标删按名字删保存数据随机生成城市坐城市名城市坐城市名指定

城市坐城市名保存记

数据长

打印 读取

插入成无此记查找成无此记删除成无此记删除成查找成无

此记输出

3.源程序清单:

//顺序表实现城市数据库

#include

#include

#include "stdlib.h"

#include

#include

using namespace std;

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

#define ElemType string

typedef struct

{

ElemType m_Name;

int m_X;

int m_Y;

}CityData;

typedef struct

{

CityData *elem;

int length; //当前表长

int listsize; //表总长,初始为100

}SqList;

void InitList_Sq(SqList &L)

{

L.elem = new CityData[LIST_INIT_SIZE];

if(!L.elem)

{

exit(0);

}

L.length = 0;

L.listsize = LIST_INIT_SIZE;

}

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)

{

return (L.length == 0)? false : true; }

int ListLength(SqList L)

{

return L.length;

}

//获取第i个元素(从1开始计数,下同)

void GetElem(SqList L, int i, CityData &e)

{

if(i<1 || i>L.length)

{

cout<<"错误的位置!"<

return ;

}

else

{

e = L.elem[i-1];

}

}

//查找节点e 返回位置

int LocateElem(SqList L, CityData e, bool (*compare)(CityData, CityData))

{

CityData *p;

p = L.elem;

int i = 0;

while(i

{

p++;

i++;

}

if(i < L.length)

{

return i+1;

}

else

{

return 0;

}

}

//在第i个元素后插入一个元素

void ListInsert_Sq(SqList &L, int i, CityData e) {

if(i>=1 && i<=L.length+1)

{

//如果存储空间不足,则以LISTINCREMENT为增量,扩展空间

if(L.length >= L.listsize)

{

CityData *base;

base = new CityData[L.listsize];

for(int count=0; count

{

base[count] = L.elem[count];

}

L.elem = new CityData[L.listsize + LISTINCREMENT];

for(int num=0; num

{

L.elem[num] = base[num];

}

delete []base;

L.listsize += LISTINCREMENT;

}

//将第i个元素之后的元素,依次向后移动一位,之后执行插入

CityData *q;

q = &(L.elem[i-1]);

CityData *p;

for(p = &(L.elem[L.length]); p>q; p--)

{

*p = *(p-1);

}

*q =e;

L.length++;

cout<<"插入成功"<

return;

}

cout<<"插入位置非法!"<

}

//按名字删除元素,并由e返回其值

void ListDelete_Name(SqList &L, string name, CityData &e)

{

if(L.length > 0)

{

CityData *p = &(L.elem[0]);

int count = 0;

while(p->m_Name!=name && count

{

count++;

p++;

}

//之后将此元素后的元素依次向前移动一位,下同

if(count < L.length)

{

e = *p;

CityData *q = L.elem + L.length -1;

for(; p<=q; p++)

{

*p = *(p+1);

}

L.length--;

cout<<"删除成功"<

}

else

{

cout<<"数据库中没有该记录"<

}

}

}

//按坐标删除元素,,并由e返回其值

void ListDelete_Coordinate(SqList &L, int X, int Y, CityData &e)

{

if(L.length > 0)

{

CityData *p = &(L.elem[0]);

int count = 0;

while(p->m_X!=X && p->m_Y!=Y && count

{

count++;

p++;

}

if(count < L.length)

{

e = *p;

CityData *q = L.elem + L.length -1;

for(; p<=q; p++)

{

*p = *(p+1);

}

L.length--;

cout<<"删除成功"<

}

else

{

cout<<"数据库中没有该记录"<

}

}

}

//读取文件中城市信息,更新表(会清除原有表中数据)void ListReadFile(SqList &L)

{

ClearList(L);

CityData citydata;

ifstream ifile;

ifile.open("City.txt", ios_base::in);

while(ifile>>citydata.m_Name>>citydata.m_X>>c itydata.m_Y)

{

ListInsert_Sq(L, 1, citydata);

}

ifile.close();

cout<<"读取完毕"<

}

//按名字检索城市

void ListSearch_Name(SqList L, string name, CityData &e)

{

if(L.length > 0)

{

CityData *p = L.elem;

int count = 0;

while(p->m_Name!=name && count

{

count++;

p++;

}

if(count < L.length)

{

e = *p;

cout<<"城市名 : "<m_Name<

cout<<"坐标 X : "<m_X<

cout<<"坐标 Y : "<m_Y<

}

else

{

cout<<"数据库中没有这个记录"<

}

}

}

//按坐标检索城市

void ListSearch_Coordinate(SqList L, int X, int Y, CityData &e)

{

if(L.length > 0)

{

CityData *p = L.elem;

int count = 0;

while(p->m_X!=X && p->m_Y!=Y && count

{

count++;

p++;

}

if(count < L.length)

{

e = *p;

cout<<"城市名 : "<m_Name<

cout<<"坐标 X : "<m_X<

cout<<"坐标 Y : "<m_Y<

}

else

{

cout<<"数据库中没有这个记录"<

}

}

}

//打印到指定点距离小于distance的城市

void Print(SqList L, int Y, int X, int distance) {

if(L.length == 0)

{

cout<<"空,你还没有读取记录,或者记录为空"<

return;

}

for(int i=0; i

{

int x = (L.elem[i].m_X>=X)? L.elem[i].m_X-X : X-L.elem[i].m_X;

int y = (L.elem[i].m_Y>=Y)? L.elem[i].m_Y-Y : Y-L.elem[i].m_Y;

int Distance = x*x+y*y;

int d = distance*distance;

if(Distance<=d)

{

cout<<"城市名: "<

cout<<"坐标X : "<

cout<<"坐标 Y : "<

}

i++;

}

}

//将表中城市信息保存到文件中(会清除文件中原有数据)void Preserve(SqList L)

{

ofstream ofile;

ofile.open("City.txt", ios_base::out);

for(int i=0; i

{

ofile<

"<

}

ofile.close();

cout<<"存档成功!"<

}

//打印出所有节点

void ListTraverse(SqList L)

{

if(L.length == 0)

{

cout<<"空,你还没有读取记录,或者记录为空"<

}

else

{

for(int i=0; i

{

4.运行结果:

对于需要比较不同算法性能优劣的题目,应设计并填写一张性能比较表格,列出不同算法在同一指标下的性能表现。但仅仅罗列出一堆数据是不够的,还应将数字转化为图象、曲线等,帮助读者更直观地理解测试结果。

对于需要利用某算法解决某问题的题目,应设计并填写一张测试用例表。每个测试用例至少应包括下列内容:

●测试输入:设计一组输入数据;

●测试目的:设计该输入的目的在于测试程序在

哪方面可能存在的漏洞;

●正确输出:对应该输入,若程序正确,应该输

出的内容;

●实际输出:该数据输入后,实际测试得到的输

出内容;

●错误原因:如果实际输出与正确输出不符,需

分析产生错误的可能原因;

●当前状态:分为“通过”(实际输出与正确输出

相符)、“已改正”(实际输出与正确输出不符,但现在已修改正确)、“待修改”(实际输出与正

确输出不符,且尚未改正)三种状态。

(举例):

序号功

测试项

描述/

输入/

操作

望结

真实

结果

1 插

据能否插

入并保

存一个

城市的

数据

输入1,

根据提

示输入

一个城

市的名

称,x坐

标,y坐

标,如

重庆,

1,1

能够

输入

一个

城市

的名

称,x

标,y

坐标

并保

城市

名称

和x,y

坐标

能输

入并

能够

保存

2 按

据按照城

市的名

字删除

城市的

所有数

输入2,

根据提

示输入

城市名

称,如

重庆

删除

这个

城市

名称

的所

有数

据,

同时

会计

算出

算法

的时

删除

了这

个城

市名

称的

所有

数据,

计算

出了

算法

的时

3 按

坐按照城

市的坐

输入3,

根据提

删除

了该

删除

了该

标删除城市的数据标删除

该城市

的所有

数据

示输入

城市的

x,y坐

标,如

1,1

x,y

坐标

的城

市的

所有

据,

计算

出算

法的

时间

x,y

坐标

的城

市的

所有

数据,

计算

出了

算法

的时

4 按

据按城市

名称查

找一个

城市,

并显示

该城市

的相关

信息

输入4,

根据提

示输入

城市名

称,如

重庆

显示

关于

这个

城市

的相

关信

息,

计算

出算

法的

时间

显示

了关

于这

个城

市的

相关

信息,

计算

出了

算法

的时

5 按

标按城市

坐标查

找一个

输入5,

根据提

示输入

显示

关于

这个

显示

了关

于这

查找城市的数据城市,

并显示

该城市

的相关

信息

城市坐

标,如

输入

1,1

城市

的相

关信

息,

计算

出算

法的

时间

个城

市的

相关

信息,

计算

出了

算法

的时

6 按

录按照规

定的距

离内显

示该距

离内的

数据

输入6,

根据提

示输入

距离5

显示

该距

离内

的数

显示

了该

距离

内的

数据

7 显

市显示当

前所有

城市的

数据

输入7 显示

当前

所有

城市

的数

显示

了当

前所

有城

市的

数据

的数据

8 读

据读取已

经存档

的所有

城市的

数据,

即刷新

表中的

数据

输入8 读取

了存

档的

所有

数据

读取

了存

档的

所有

数据

9 保

存存储数

输入9 存储

所有

所有

数据

存储

了所

有数

0 随

成随机生

成城市

名称和

坐标

先输入

0,再根

据要求

输入产

生的长

会随

机生

成相

应长

度的

数据

输入

7,会

显示

出随

机产

生的

相应

长度

的数据

测试结论各项功能已经基本实现,但其中有些部分太过繁杂,可以简化一些,尤其是进行下一项操作时,前面的操作会消失,这会带来许多不便,需要改进

备注:分为“通过”(实际输出与正确输出相符)、“已改正”(实际输出与正确输出不符,但现在已修改正确)、“待修改”(实际输出与正确输出不符,且尚未改正)三种状态。可在此说明错误原因

这一部分需根据题目类型设计提供相应的测试方法和结果(请勿粘贴测试结果图)。

5.实验运行情况分析(包括算法、运行结果、运行环境等问题的总体讨论)。

算法分析比较:顺序表和链表的使用各有优劣。

顺序表需要提前估计线性表的大小并且插入删除效率低需要移动大量结点,优点在于表中节点没有浪费存储空间,并且可以按位置随机访问,存储速度快;

链表优点在于插入删除效率高,无需提前估计表的大小(大小无需固定),表中元素个数没有限制,缺点在于访问结点需要从表头遍历查找并且每个节点除了储存元素还需要附加空间存储指针。

顺序表和链表时间性能比较:像取出线性表中第i 个元素这样的按位置随机访问的操作,使用顺序表更快一些;取前趋和后继结点的操作在顺序表中可以很容易调整当前的位置向前或向后,因此这两种操作的时间为O(1) ;

相比之下,单链表不能直接访问上述的元素,按位置访问只能从表头开始,直到找到那个特定的位置,所需要的平均时间为O( n ) 。给出指向链表中某个合适位置的指针后,插入和删除操作所需的时间仅为O( 1 ),而顺序表进行插入和删除操作需移动近乎表长一半的元素,需要的平均时间为O( n ) 。这在线性表中元素个数较多时,特别是当每个元素占用的空间较多时,移动元素的时间开销很大。对于许多

应用,插入和删除是最主要的操作,因此它们的时间效率是举足轻重的,仅就这个原因而言,链表经常比顺序表更好。

顺序表和链表空间性能比较:顺序表中每个元素的存储密度为 1 ,没有浪费空间;而链表的每个结点除了存放数据元素,还要附加一个指示元素之间逻辑关系的指针,如果数据域占据的空间较小,则链表的结构性开销就占去了整个存储空间的大部分,因而从结点的存储密度上讲,顺序表的存储空间利用率较高。

由于顺序表需要预分配一定长度的存储空间,如果事先不能明确知道线性表的大致长度,则有可能对存储空间预分配得过大,致使在程序执行过程中很大一部分的存储空间得不到充分利用,而造成浪费;若估计得过小,又将造成频繁地进行存储空间的再分配。而链表的显著优点之一就是其存储分配的灵活性,不需要为链表预分配空间,只要有可用的内存空间分配,链表中的元素个数就没有限制。

除了顺序表和链表之外,我们还可以使用二叉排序树算法,对于插入,删除操作的时间复杂度都是O(log(n))级的,即经过O(log(n))时间搜索到了需插入和删除的节点的位置,后经过O(1)级的时间就可以直接插入和删除,比有序顺序表的插入和删除O(n)(查找O(log(n)),移动节点O(n))快,而和无序顺序表插入O(1),删除O(n)比,因为是有序的,所以查找的速度要快很多。所以在有些操作中,我们可以用二叉排序树更能节省时间。

运行结果总结:对于使用顺序表和链表而言,在不同的情况下使用不同的算法更适合,虽然大部分操作都能够实现,包括插入城市数据,按名称查找,按坐标查找,按名称和坐标删除,打印所有数据,按指定距离显示城市数据,保存数据,但是有些不太齐全,比如随机生成部分,只有在打印的时候才会显示出来。而且在程序中,注释的部分数量少,程序都应该把重要的部分注释上其实现的功能。还有就是程序在进行下一项操作时,前面的所有操作记录会消失,程序有待改进。

运行环境:

1、硬件环境:联想笔记本电脑,Intel(R) Core(TM) i3-3632M ,4GB内存

2、软件环境:Windows 7 下的Microsoft Visual C++ 6.0

收获:通过此次程序的编码,测试,报告撰写,对于顺序表和链表的基本算法,两种算法的优缺点有了更清晰的了解,对其使用有了更为详尽的了解和操作技术。同时也掌握了时间函数和随机生成函数的使用。明白了团队合作的重要性。

城市链表实验报告

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

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

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间: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.C语言顺序表实验报告

实验报告要求 一、实验目的 二、实验内容 三、程序流程图 四、实验结果(要求检测所有情况的正确性,写出测试条件及相应的测试结果) 五、完成思考题 实验一顺序表的基本操作(2学时) 一、实验目的 了解顺序表的逻辑特征,掌握顺序表的描述方法、特点及有关的概念,掌握顺序表上的插入和删除等基本操作算法。 二、实验内容 在顺序表List []中,实现顺序表的基本操作,包括:初始化顺序表,在表中插入元素、删除元素。 基本要求: (1)顺序表的元素个数可随意设定; (2)可连续测试任意多个元素的插入、删除,(插 入、删除位置及要插入元素数值均从键盘输入); (3)任一操作结束后将顺序表中的内容输出; (4)可由用户选择退出程序。 三、实验要点及说明 顺序表又称为线性表的顺序存储结构,它是用一组地址连续的存储单元依次存放线性表的各个元素。 可按如下格式定义顺序表: #define MAXLEN 50 /* 定义顺序表最大元素个数50 */ typedef struct{ datatype List[MAXLEN];/* 定义顺序表List */ int Num; /* 定义顺序表表长*/ }Seqlist; 模块划分:(1)initiq( )函数:初始化顺序表 (2)insertq( )函数:实现插入功能 (3)deleteq( )函数:实现删除功能 (4)print( )函数:实现输出功能 四、参考源程序 #include #define MAXLEN 50 typedef int datatype; typedef struct{ datatype List[MAXLEN]; int Num; }Seqlist; void initiq(Seqlist *la ); int insertq(Seqlist *la,int n);

链表实验报告

链表实验报告

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

《数据结构》实验报告二 系别:嵌入式系统工程系班级:嵌入式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

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

. 实验一、单链表的插入和删除 一、目的 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 二、要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 三、程序源代码 #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); //删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表

实验报告一顺序表的操作

《数据结构》实验报告一 系别:班级: 学号:姓名: 日期:指导教师: 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 从键盘输入10个整数,产生顺序表,并输入结点值。 从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找不到,则显示“找不到”。 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。 从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 三、源程序及注释:

#include <> /*顺序表的定义:*/ #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; /*子函数的声明*/ void CreateList(SeqList * L,int n); /*创建顺序表函数*/ int LocateList(SeqList L,DataType x); /*查找顺序表*/ void InsertList(SeqList * L,DataType x,int i); /*在顺序表中插入结点x*/ void DeleteList(SeqList * L,int i);/*在顺序表中删除第i个结点*/ void PrintList(SeqList L,int n); /*打印顺序表中前n个结点*/ void main() { SeqList L; int n=10,x,i; /*欲建立的顺序表长度*/ =0;

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)

链表基本操作实验报告

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

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

大学数据结构实验报告 课程名称数据结构实验第(四)次实验实验名称链表的基本操作 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期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中的某一个结点

顺序表的查找、插入与删除实验报告

《数据结构》实验报告一 学院:班级: 学号:姓名: 日期:程序名 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include #include /*顺序表的定义:*/ #include #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; void main() { SeqList L; int i,x; int n=10; /*欲建立的顺序表长度*/ L.length=0; void CreateList(SeqList *L,int n); void PrintList(SeqList L,int n); int LocateList(SeqList L,DataType x); void InsertList(SeqList *L,DataType x,int i); void DeleteList(SeqList *L,int i);

链表基本操作实验报告

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

顺序表的应用数据结构实验报告记录

顺序表的应用数据结构实验报告记录

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

大学数据结构实验报告 课程名称数据结构实验第(三)次实验实验名称顺序表的应用 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期2018年9月30日一、实验目的 1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 (2)逐个显示学生表中所有学生的相关信息 (3)根据姓名进行查找,返回此学生的学号和成绩 (4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩) (5)给定一个学生信息,插入到表中指定的位置 (6)删除指定位置的学生记录 (7)统计表中学生个数 四、实验设计 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 for(count=0; count

单链表实验报告

单链表实验报告

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

计算机与信息技术学院综合性、设计性实验报告 专业:网络工程年级/班级:大二 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);

线性表逆置(顺序表)实验报告

实验一:线性表逆置(顺序表)实验报告 (一)问题的描述: 实现顺序表的逆置算法 (二)数据结构的设计: 顺序表是线性表的顺序存储形式,因此设计如下数据类型表示线性表: typedef struct { ElemType *elem; /* 存储空间基址*/ int length; /* 当前长度*/ int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ }SqList; (三)函数功能、参数说明及概要设计: 1.函数Status InitList(SqList *L) 功能说明:实现顺序表L的初始化 算法设计:为顺序表分配一块大小为LIST_INIT_SIZE的储存空间 2.函数int ListLength(SqList L) 功能说明:返回顺序表L长度 算法设计:返回顺序表中的length变量 3.函数Status ListInsert(SqList *L,int i,ElemType e) 功能说明:将元素e插入到顺序表L中的第i个节点 算法设计:判断顺序表是否已满,已满则加空间,未满则继续,将元素e插入到第i个元素之前,并将后面的元素依次往后移 4.函数Status ListTraverse(SqList L,void(*vi)(ElemType*)) 功能说明:依次对L的每个数据元素调用函数vi() 算法设计:依次对L的每个数据元素调用函数vi() 5.函数void Exchange(SqList *L) 功能说明:实现顺序表L的逆置 算法设计:用for循环将顺序表L中的第i个元素依次与第(i+length)个元素交换6.函数void print(ElemType *c) 功能说明:打印元素c 算法设计:打印元素c 2. (四)具体程序的实现

单链表操作实验报告

线性表 一、实验目的 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); $

数据结构实验报告-顺序表的创建、遍历及有序合并操作

数据结构实验报告-顺序表的创建、遍历及有序合并操作二、实验内容与步骤 实现顺序表的创建、遍历及有序合并操作,基本数据结构定义如下: typedef int ElemType; #define MAXSIZE 100 #define FALSE 0 #define TRUE 1 typedef struct {ElemType data[MAXSIZE]; int length; }seqlist; 创建顺序表,遍历顺序表 #include #include #define MAXSIZE 100 #define Icreament 20 #define FALSE 0

#define TRUE 1 typedef int ElemType; //用户自定义数据元素类型 // 顺序表结构体的定义 typedef struct { ElemType *elem; //顺序表的基地址 int length; //顺序表的当前长度 int listsize; //预设空间容量 }SqList; //线性表的顺序存储结构 SqList* InitList() //创建空的顺序表 { SqList* L = (SqList*)malloc(sizeof(SqList));//定义顺序表L if(!L) { printf("空间划分失败,程序退出\n"); return NULL; } L->elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if(!L->elem) { printf("空间划分失败,程序退出\n");

链表实验报告总结doc

链表实验报告总结篇一:顺序表,链表总结实验报告 实验报告 实验目的:学生管理系统(顺序表) 实验要求: 1.建表 2.求表长 3.插入 4.查找 5.删除 6.列表 7.退出 源程序: #include #include #include #define MaxSize 1000 typedef 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;

相关主题
文本预览
相关文档 最新文档