双链表及链表应用实验

双链表及链表应用实验
双链表及链表应用实验

循环链表、双链表及链表应用实验

实验报告

实验目的

(1)理解单循环链表及双循环链表的特点。

(2)掌握这两种结构的算法设计。

(3)运用链表存储数据并设计有关算法。

(4)理解头结点、头指针概念以及设置头结点的优点

实验运行环境

Visual C++

实验任务

为使实验程序简洁直观, 同样是将实验程序中将所需要的函数以调用库函数的形式给出, 并假设将库函数放在程序文件"linklist.h"中, 同时假设该库函数文件中定义了链表结构中的指针类型为link, 结点类型为node, 双链表中结点的类型为dunode, 其中有data、next和prior等字段, data的类型为int, 而next和prior分别为指示其下一个和前一个结点的指针, 类型为dulink(即dunode *)。类似地, 定义了部分常用运算, 如构建链表、显示链表等。各运算的名称较为直观, 并有相应的注释, 因而易于理解和实现。读者在上机实验时, 需要自己设计出所涉及到的库函数, 或者将函数放在实验程序中, 以方便实验程序的调试。

实验要求

1.求链表中第i个结点的指针(函数),若不存在,则返回NULL。

2.在第i个结点前插入值为x的结点。

3.删除链表中第i个元素结点。

4.在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。5.将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以

便对照求解结果。

6.求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。

实验内容

第一题:

依次访问无头结点的单循环链表的各结点。

实验测试数据基本要求:

第一组数据:链表元素为(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60)

第二组数据:链表元素为(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

实验准备:

p=head; //因为没有首位,所以输入一点,令为首位

do{/*访问节点的语句*/;p=p->next;}

while(p!=head); //只让循环进行一次,避免进入死循环,所以用p!=head

//作为判断条件

第二题:

设计算法以判断一个带头结点的单循环链表是否满足这样的条件:其中每个结点的元素值与其序号的差的绝对值不大于3。若成立, 返回TRUE, 否则返回FALSE。

实验测试数据基本要求:

第一组数据:链表元素为

(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 18)第二组数据:链表元素为

(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 20, 18)

实验准备:

If((p->data-i<=3)&&( p->data-i>=-3))return TRUE;

//判断每个结点的元素值与其序号的差的绝对值是否不大于3

else return FALSE;

第三题:

利用递增有序的单循环链表表示集合, 分别求两个链表表示的集合的交、并集所构成的链表。

实验测试数据基本要求:

第一组

第一个链表元素为(1, 3, 6, 10, 15, 16, 17, 18, 19, 20)

第二个链表元素为(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 20, 30)

第二组

第一个链表元素为(1, 3, 6, 10, 15, 16, 17, 18, 19, 20)

第二个链表元素为(2, 4, 5, 7, 8, 9, 12, 22)

第三组

第一个链表元素为()

第二个链表元素为(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

实验准备:

C=x^y,node*px,*py; //建立一个表C 和指针px py

px->data==py->data;px=px->next;py=py->next;//如果px指向的数据

//等于py指向的数据,px 和px 就同时向后继续px->data>py->data;py=py->next;// 如果px指向的元素如果大于py,根据递增

//有序,则只需py向后搜索比当前py指向的数据大的

//数据来和当前px指向的数据判断是否相等px->datadata;px=px->next; // 如果px指向的元素如果小于py,根据递

//增有序,则只需px向后搜索比当前px指向的数据大

//的数据来和当前py指向的数据判断是否相等

x=xUy;

//取表x,将y与x元素做同样比较py->data!=px->data;将py->data插入x表;

第四题:

编写算法以构造带头结点的双循环链表。

实验测试数据基本要求:

第一组数据:链表元素为(1,2,3,4,5,6,7,8,9,10)

第二组数据:链表元素为(10,30,40,55,60,70,88,99,100)

实验准备:

struct dnode{elementtype data;dnode*prior,*next;};

//先建立空表head=new dnode;指针指向null;p指向当前节点;

//然后进行尾插入;p->next=s;s->prior=p;p=head;首尾相接;

第五题:

编写算法以判断一个带头结点的双循环链表是否是对称的, 若成立, 返回TRUE, 否则返回FALSE。

实验测试数据基本要求:

第一组数据:链表元素为(1, 2, 3, 4, 5, 4, 3, 2, 1)

第二组数据:链表元素为(1, 2, 3, 4, 5, 5, 4, 3, 2, 1)

第三组数据:链表元素为(1, 2, 3, 4, 5, 6, 3, 2, 1)

第四组数据:链表元素为(1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1)

实验准备:

{px=head->next;py=head->prior;//指针px指向后一数据,

//指针py指向头元素的前一数据

while(px!=py) //如果指针px和py指向的不是同一数

//以此来作为结束循环的条件

{

if(px->data!=py->data) //只要有任意px和py指向数据不相等,return false; //则该链表是不对称的

px=px->next;py=py->prior;} //只要任意px和py指向

//数据未出现不相等,则继续向后查找

return ture;

实验程序

#include

#include

struct Node

{

int data1;

Node *next1;

};

struct Dnode

{

int data2;

Dnode *prior,*next2;

};

class list

{

private:

Node*head1,*rear1;

public:

list();

void first(); //第一题函数

bool second(); //第二题函数

void third_1(list &L1,list &L2); //第三题函数——交集void third_2(list &L1,list &L2); //第三题函数——并集void creat(); //创建单链表

};

class double_list

{

private:

Dnode*head2,*rear2;

public:

double_list();

void fourth(); //第四题函数

bool fifth(); //第五题函数

void creat_d(); //创建双链表

};

list::list()

{

head1=new Node;

head1->next1=NULL;

rear1=head1;

}

void list::creat() //创建单链表函数

{

Node*u;

int x;

cout<<"请输入单循环链表的数据,输入-1完成输入"<

cin>>x;

while(x!=-1)

{

u=new Node;

u->data1=x;

rear1->next1=u;

rear1=u;

cin>>x;

}

rear1->next1=head1;

}

double_list::double_list()

{

head2=new Dnode;

head2->next2=NULL;

head2->prior=NULL;

rear2=head2;

}

void double_list::creat_d() //创建双链表函数

{

Dnode*u;

int x;

cout<<"请输入双循环链表的数据,输入-1完成输入"<

cin>>x;

while(x!=-1)

{

u=new Dnode;

u->data2=x;

rear2->next2=u;

u->prior=rear2;

rear2=u;

cin>>x;

}

rear2->next2=head2;

head2->prior=rear2;

}

void list::first() //第一题函数:访问无头结点的单循环链表的各结点

{

Node*u=head1;

head1=u->next1;

rear1->next1=head1;

delete u;

Node*p=head1;

do

{

cout<data1<<'\t';

p=p->next1;

}while(p!=head1);

cout<

}

bool list::second() //第二题函数:判断一个带头结点的单循环链表是否满足{ //每个结点的元素值与其序号的差的绝对值不大于3Node*p=head1->next1;

bool n=true;

for(int i=1;p!=head1&&n!=false;i++,p=p->next1)

{

if(i-p->data1<=3||p->data1-i<=3)n=true;

else n=false;

}

return n;

}

void list::third_1(list &L1,list &L2) //第三题函数——交集:利用递增有序的单循环链{ //表表示集合,分别求两个链表表示的集合的交、并集所构成的链表Node*pa,*pb,*u;

pa=L1.head1->next1;

pb=L2.head1->next1;

while(pa!=L1.head1&&pb!=L2.head1)

{

if(pa->data1data1)pa=pa->next1;

else if(pa->data1>pb->data1)pb=pb->next1;

else

{

u=new Node;

u->data1=pa->data1;

rear1->next1=u;

rear1=u;

pa=pa->next1;

pb=pb->next1;

cout<data1<<'\t';

}

rear1->next1=head1;

}

}

void list::third_2(list &L1,list &L2) //第三题函数—并集:利用递增有序的单循环链, { //表表示集合分别求两个链表表示的集合的交、并集所

//构成的链表

Node*pa,*pb,*u;

pa=L1.head1->next1;

pb=L2.head1->next1;

while(pa!=L1.head1&&pb!=L2.head1)

{

if(pa->data1data1)

{

u=new Node;

u->data1=pa->data1;

rear1->next1=u;

rear1=u;

pa=pa->next1;

cout<data1<<'\t';

}

else if(pa->data1>pb->data1)

{

u=new Node;

u->data1=pb->data1;

rear1->next1=u;

rear1=u;

pb=pb->next1;

cout<data1<<'\t';

}

else

{

u=new Node;

u->data1=pa->data1;

rear1->next1=u;

rear1=u;

pa=pa->next1;

pb=pb->next1;

cout<data1<<'\t';

}

rear1->next1=head1;

}

if(pa==L1.head1)

{

for(;pb!=L2.head1;pb=pb->next1)

{

u=new Node;

u->data1=pb->data1;

rear1->next1=u;

rear1=u;

cout<data1<<'\t';

}

rear1->next1=head1;

}

else

for(;pa!=L1.head1;pa=pa->next1)

{

u=new Node;

u->data1=pa->data1;

rear1->next1=u;

rear1=u;

cout<data1<<'\t';

}

rear1->next1=head1;

}

void double_list::fourth() //第四题函数:构造带头结点的双循环链表

{

rear2->next2=head2;

head2->prior=rear2;

Dnode*p=head2->next2;

while(p!=head2)

{

cout<data2<<'\t';

p=p->next2;

}

cout<

}

bool double_list::fifth() //第五题函数:判断一个带头结点的双循环链表是否是对称

{

Dnode*pa,*pb;

bool n=true;

pa=head2->next2;

pb=head2->prior;

while(pa!=pb&&pa->next2!=pb)

{

if(pa->data2!=pb->data2)

{n=false; break;}

pa=pa->next2;

pb=pb->prior;

}

if(pa->next2==pb&&pa->data2!=pb->data2)n=false;

return n;

}

int main()

{

list L_1,L_2,L_3;

double_list D_1,D_2,D_3;

int choice;

cout<<" 数据结构实验二——循环链表、双链表及链表应用实验"<

cout<

cout<<"第1题:依次访问无头结点的单循环链表的各结点"<

cout<<"第2题:判断一个带头结点的单循环链表是否满足: "<

cout<<" 其中每个结点的元素值与其序号的差的绝对值不大于3"<

cout<<"第3题:利用递增有序的单循环链表表示集合求两个链表表示的集合的交、并集所构成的链表"<

cout<<"第4题:构造带头结点的双循环链表"<

cout<<"第5题:判断一个带头结点的双循环链表是否是对称"<

cout<<"退出程序:0"<

cout<

cout<<"请选择一道题"<

cin>>choice;

switch(choice)

{

case 1:

{L_1.creat();L_1.first();

break;}

case 2:

{L_1.creat();if(L_1.second())cout<<"true"<

else cout<<"false"<

break;}

case 3:

{L_1.creat();L_2.creat();L_3.third_1(L_1,L_2);

break;}

case 4:

{L_1.creat();L_2.creat();L_3.third_2(L_1,L_2);

break;}

case 5:

{D_1.creat_d();D_1.fourth();

break;}

case 6:

{D_1.creat_d();if(D_1.fifth())cout<<"true"<

cout<<"false"<

case 0:

{cout<

break;}

default:

{cout<<"输入错误,请重新输入"<

}

return 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)实验目的 (2)实验任务 (3)需求分析 二、概要设计: (1)抽象数据类型定义 (2)主程序流程 (3) 模块关系 三、详细设计 (1)数据类型及存储结构 (2)模块设计 四、调试分析 (1)调试分析 (2)算法时空分析 (3)经验体会 五、使用说明 (1)程序使用说明 六、测试结果 (1)运行测试结果截图 七、附录 (1)源代码

一、问题定义及需求分析 (1)实验目的 设计一个能演示集合的并、交、差运算程序。 (2)实验任务 1)采用顺序表或链表等数据结构。 2)集合的元素限定为数字和小写英文字母。 (3)需求分析: 输入形式为:外部输入字符串; 输入值限定范围为:数字和小写英文字母; 输出形式为:字符集; 程序功能:计算两个集合的交、并、差以及重新输入集合功能; 二、概要设计: (1)抽象数据类型定义: 线性表 (2)主程序流程: 调用主菜单函数初始化两个线性表作为集合给两个集合输入数据输出集合数据元素信息另初始化两个线性表创建选择功能菜单界面通过不同选项调用不同功能函数在每个功能函数里面加结束选择功能,实现循环调用功能菜单 计算完毕退出程序; (3)模块关系: 主菜单 差运算并运算交运算新建集合结束/返回 结束 三、详细设计 抽象数据类型定义: typedef struct{ ElemType *elem; int length; int listsize;

C++一元多项式合并实验报告

实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。 一、问题描述 一元多项式相加是通过键盘输入两个形如P 0+P 1 X1+P 2 X2+···+PnX n的多项式,经过程序运算后在屏幕上输出它 们的相加和。 二、数据结构设计 分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可将它抽象成一个由“系数—指数对”构成线性表,由于对多项式中系数为0的子项可以不记录他的数值,对于这样的情况就不再付出存储空间来存放它了。基于这样的分析,可以采取一个带有头结点的单链表来表示一个一元多项式。具体数据结构定义为: typedef struct node { float ce; //系数域 float ex; //指数域 struct node *next; //指针域 }lnode,*linklist; 三功能(函数)设计 1、输入并建立多项式的功能模块 此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关的节点,当遇到输入结束标志时结束输入,而转去执行程序下面的部分。 屏幕提示: input ce & ex and end with 0: ce=1 ex=2 ce=0 ex=0 //输入结束标志 input ce & ex and end with 0: ce=2 ex=2 ce=0 ex=0 //输入结束标志 输入后程序将分别建立两个链表来描述两个一元多项式: A=X^2 B=2X^2 这两个多项式的相加的结果应该为: C=3X^2 2、多项式相加的功能模块 此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。可以采用以下方法进行设计: 开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。 if(a->ex==b->ex) //判断指数是否相等 {s->ce=a->ce+b->ce; if(s->ce!=0) s->ex=a->ex; else delete s; a=a->next; b=b->next; }

单链表实验报告

计算机与信息技术学院综合性、设计性实验报告 一、实验目的 (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)

链表实验报告

链表实验报告

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

《数据结构》实验报告二 系别:嵌入式系统工程系班级:嵌入式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); //删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表

数据结构树的实现实验报告

数据结构设计性实验报告 课程名称_____ ____ 题目名称 学生学院 专业班级 学号 学生姓名 指导教师 2010 年 7 月 6 日

抽象数据类型:树的实现 一.需求分析 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,直观来看,树是以分支关系定义的内部结构。树的结构在客观世界广泛存在,如人类社会的族谱和各种社会组织机构都可以用树来形象表示。树在计算机领域中也得广泛应用,如在编译程序中,可用树来表示源程序的语法结构,又如在数据库系统中,树形结构也是信息的重要组织形式之一。 二.实验目的 对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。进而达到熟练地运用本课程中的基础知识及技术的目的。 三.实验环境 1、硬件:PC机 2、软件:Microsoft Visual C++ 6.0 四.设计说明 本程序采用树的二叉链表(孩子指针-兄弟指针-双亲指针)存储表示,以下是树的结构定义和基本操作: ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R: 若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2) 若D-{root}≠NULL,则存在D-{root}的一个划分D1,D2,D3, …,Dm(m>0),对于任意j ≠k(1≤j,k≤m)有Dj∩Dk=NULL,且对任意的i(1≤i≤m),唯一存在数据元素xi∈Di有∈H; (3) 对应于D-{root}的划分,H-{,…,}有唯一的一个划分H1,H2,…,Hm(m>0),对任意j≠k(1≤j,k≤m)有Hj∩Hk=NULL,且对任意i(1≤i≤m),Hi是Di 上的二元关系,(Di,{Hi})是一棵符合本定义的树,称为根root的子树。 基本操作P: InitTree(&T); 操作结果:构造空树T。 DestroyTree(&T); 初始条件:树T存在。 操作结果:销毁树T。 CreateTree(&T,definition); 初始条件:definition给出树T的定义。 操作结果:按definition构造树T。 ClearTree(&T);

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)

数据结构实验报告 有序表合并

实验有序表合并姓名:窦晓磊班级:软件工程142 学号:1413032042 试验时间:2015.10.11

1.问题描述 把两个有序表归并为一个有序表。 2.数据结构设计 链表结点的结构为: Typedef struct Node{ T data; Node *next; }; 3.算法设计 (1)表的输入和输出。 设计一个输入输出函数Node *CreateList()。 Step1:设计指针。 Node *q, //工作指针,存储head *Head, //头指针 *p; //工作指针,存储数据 int size, //用于存储有序表元素的个数 n; //元素的输入 Step2:利用指针进行输入。 q=Head=new Node; //建立头结点 利用循环输入 for(int i=1;i<=n;i++) { p=new Node; //建立结点 cin>>n; //输入元素 p->data=n; //将输入的元素赋值给链表 Head->next=p; //尾指针后移 Head=p; //指向下一个结点 Head=p; } Head->next=NULL; //设置尾指针 Head=q; Step3:输出。 for(p=Head->next;p!=NULL;p=p->next) cout<data; Return Head; //返回Head所指的链表 (2)合并算法 1’初始化 Step1:设置工作指针pa、pb,分别指向两个有序表LA、LB的首元结点。 Node *pa,*pb; //工作指针pa,pb pa=LA->next;pb=LB->next; Step2:生成新表LC的头结点,工作指针pc指向LC。 Node *pc;

链表基本操作实验报告

实验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中的某一个结点

链表基本操作实验报告

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

用单链表实现集合的操作

《数据结构》课设计报告 2012—2013学年第一学期 课程名称数据结构 设计题目用单链表实现集合的操作 专业班级 姓名 学号 指导教师 一.实验目的

掌握单链表的算法,插入、删除、遍历等。 二.实验内容 (1)对集合中的元素用有序单链表进行存储; (2)实现交、并、差等基本运算时,不能另外申请存储空间; (3)充分利用单链表的有序性,要求算法有较好的时间性能。 三.设计与编码 集合是由互不相同的元素构成的一个整体,在集合中,元素之间可以没有任何关系,所以,集合也可以作为线性表的处理。用单链表实现集合的操作,需要注意集合中元素的唯一性,即在单链表中不存在值相同的结点。 (1)判断A和B是否相等。两个集合相等的条件是不仅长度相同,而且各个对应的元素也相等。由于用单链表表示集合,所以只要同步搜啊秒两个单链表,若从头至尾每个对应的元素都相等,则表明两个集合相等。 (2)求集合A和B的交集。根据集合的运算规则,集合A∩B中包含所有既属于集合A又属于集合B的元素,因此,需要查找单链表A和B中的相同元素并保留在单链表A中。由于用有序单链表表示集合,因此判断某元素是否在B中不需要遍历表B,而是从上次搜索到的位置开始,若在搜索过程中,遇到一个其值比该元素大的结点,便可断定该元素不在单链表中,为此,需要用两个指针p、q分别指向当前被比较的两个结点,会出现以下三种情况: 1、若p->data>q->data,说明还未找到,需在表B中继续查找; 2、若p->datadata,说明表B中无此值,处理表A中下一结点; 3、若p->data=q->data,,说明找到了公共元素。 (3)求集合A和B的并集,集合A∪B中包含所有或属于集合A或属于集合B 的元素。因此,对单链表B中的每一个元素x,在单链表A中进行查找,若存在和x不同的元素,则将该结点出入到单链表A中。 (4)求集合A和B的差集。根基集合的运算规则,集合A-B中包含所有属于集合A而不属于集合B的元素。因此,对单链表B中的每个元素x在单链表A中进行查找,若存在和x相同的结点,则将该结点从链表A中删除。 在主函数中,首先建立两个有序单链表表示集合A和B,然后依次调用相应函数实现集合的判等、交、并和差等运算,并输出运算结果。 代码: #include using namespace std; template struct Node{ T data; Node *next; }; template class LinkList{ public:

链表的合并 实验报告材料

课程设计报告 课程设计题目:两个链表的合并 专业:软件工程 班级: 姓名: 学号: 指导教师: 年月日

目录 1.课程设计的目的及要求 2.课程设计的容(分析和设计) 3.算法流程图 4.详细步骤 5.代码 6.显示结果 7.课程设计的总结

一.课程设计的目的及要求 1.目的:实现两个链表的合并 2.要求: (1)建立两个链表A和B,链表元素个数分别为m和n个。 (2)假设元素分别为(x1,x2,...xm),和(y1,y2, ...yn)。把它们合并成一个线形表C,使得:当m>=n时,C=x1,y1,x2,y2,...xn,yn, (x) 当n>m时,C=y1,x1,y2,x2,…ym,xm,…,yn 输出线形表C (3)用直接插入排序法对C进行升序排序,生成链表D,并输出链表D。 (4)能删除指定单链表中指定位子和指定值的元素。 二.课程设计的容(分析和设计) 1..分析 由题目的相关信息可以分析得:首先我们需要建立两个链表AB,A链表的元素个数为m,B链表的元素个数为n;在将A、B链表进行合并,根据m和n的大小关系决定链表C的元素顺序;再将C进行直接插入排序得到一个新的链表D;没次输入完一次链表信息,程序都会对相应的链表进行输入操作以此确保程序输入的数据是你想要输入的数据。同时当你合并好和排序好后都会进行输出操作。最后当排序好后你可以指定你所要删除数据的位置来删除你所要删除的数据。 2.设计 本次课程设计所需要用到的是关于链表的建立、合并以及直接插入排序的排序算法。需要先建立两个链表,再将其合并为一个无序链表,最后对这个无序链表进行直接插入排序并将其输出。难点在于将AB合并为链表C的操作以及对链表C进行直接插入排序的操作和根据用户的意愿可以对链表进行删除的操作。 三.算法流程图

单链表实验报告

单链表实验报告

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

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

基于单链表实现集合的并交差运算实验报告

基于单链表实现集合的并交差运算实验报告 一实验题目: 基于单链表实现集合的并交差运算二实验要求: 2.2: 编写一个程序,实现顺序表的各种基本运算 (1) 初始化单链表h; (2) 依次采用尾插法插入a,b,c,d,e 元素; (3) 输出单链表h (4) 输出单链表h 的长度 (5) 判断单链表h 是否为空 (6) 输出单链表h 的第三个元素 (7) 输出元素在a 的位置 (8) 在第4 个元素位置上插入f 元素 (9) 输出单链表h (10) 删除L的第3个元素 (11) 输出单链表 (12) 释放单链表 2.2: 编写一个程序,采用单链表表示集合( 集合中不存在重复的元素), 并将其按照递增的方式排序,构成有序单链表,并求这样的两个集合的并交和差。三实验内容: 3.1 线性表的抽象数据类型: ADT List{ 数据对象;D= { a i |a i ElemSet ,i 1,2,...,n,n 0} 数据关系:R1={ a i 1,a i |a i 1,a i D,i 2,..., n} 基本操作: InitList(&L) 操作结果; 构造一个空的线性表L

DestroyList(&L) 初始条件:线性表L 已存在操作结果:销毁线性表L ClearList(&L) 初始条件:线性表L 已存在操作结果:将L 置为空表 ListEmpty(L) 初始条件:线性表已存在操作结果:若L为空表,则返回 TRUE否则返回FALSE ListLength(L) 初始条件:线性表已存在 操作结果:返回L 中数据元素的个数GetElem(L,i) 初始条件: 线性表已存在,1<=i<=ListLength(L) 操作结果:用e返回L中第i个数据元素的值LocateElem(L,i,e) 初始条件:线性表已存在,用循环遍历整个线性表,如果中的元素相同; 操作结果:用此时的i+1 返回该元素在线性表的位序 ListInsert(&L,i,e) 初始条件:线性表存在,1<=i<=ListLength(L)+1; 操作结果:在L 中第i 个位置之前插入新的数据元素,e,L ListDelete(&L,i,&e) 初始条件: 线性表L 已存在且非空, 1<=i<=ListLength(L) 操作结果:删除L的第i个数据元素,并用e返回其值, 1 }ADT List 3.2 存储结构的定义; typedef char ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LinkList; 3.3 基本操作实现 /* 单链表的初始化*/ void InitList(LinkList *&L) { L = (LinkList *)malloc(sizeof(LinkList)); L->next=NULL; } /* 向单链表中插入数据元素*/ bool ListInsert(LinkList *&L,int x,char e) { int j = 0; LinkList *p = L, *s; e 与线性表的长度加1。L 的长度减

实验报告03-两个有序链表的合并

实验目的及要求: 了解和掌握链表的特点; 掌握链表基本操作的实现; 掌握两个有序链表合并的算法 要求完成链表的初始化、插入、有序表合并、显示操作的实现。实验设备环境及要求: PC机一台,内存要求128M以上,VC++6.0集成开发环境。 实验内容与步骤: 1、在VC++6.0环境中新建一个工程和C++文件; 2、实现链表初始化、插入、有序合并算法,代码如下: #include #include typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; int InitList_L(LinkList &L){ L= (LinkList)malloc(sizeof(LNode)); L->next=NULL; return 1; } int ListInsert_L(LinkList &L,int i,ElemType e){ LinkList p; p=L; int j=0; while(p&&jnext; ++j; } if(!p||j>i-1) return 0; LinkList s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return 1; } void Disp_L(LinkList L){

LinkList p=L->next; if(!p) printf("此链表为空!"); while(p){ printf("%d",p->data); p=p->next; } printf("\n"); } void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ LinkList pa=La->next; LinkList pb=Lb->next; LinkList pc=Lc=La; while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; } else{ pc->next=pb;pc=pb;pb=pb->next; } } pc->next=pa?pa:pb; free(Lb); } void main(){ LinkList La,Lb,Lc; InitList_L(La); InitList_L(Lb); InitList_L(Lc); ListInsert_L(La,1,2); ListInsert_L(La,2,3); ListInsert_L(La,3,5); Disp_L(La); ListInsert_L(Lb,1,1); ListInsert_L(Lb,2,4); ListInsert_L(Lb,3,6); ListInsert_L(Lb,4,7); Disp_L(Lb); MergeList_L(La,Lb,Lc); printf("合并之后的链表为:\n"); Disp_L(Lc); }实验指导与数据处理:

相关文档
最新文档