当前位置:文档之家› 数据结构实验二 线性表的链式存储及其操作 - 副本

数据结构实验二 线性表的链式存储及其操作 - 副本

数据结构实验二 线性表的链式存储及其操作 - 副本
数据结构实验二 线性表的链式存储及其操作 - 副本

实验二线性表的链式存储及其操作

实验项目:线性表的链表实现:遍历、插入、删除、翻转

实验类型: 基础性

一【指导思想】

用链表存储线性表,实现线性表的基本操作。

二【实验目的及要求】

1、复习C语言的指针的定义、链表的使用;

2、理解线性表的属性;

3、实践线性表的链式实现方法以及相关的操作。

4、要求:提交实验报告,附源程序中填空的内容(10处)、打印运行结果涉及的知识点:

线性表的逻辑属性、运算

带表头的单链表的操作:定义、输入、输出、链表内容的翻转

元素/链表的操作:元素的插入、删除

三【实验内容】

实现链表的输入、输出、插入、删除、翻转等功能,教师提供主要源代码,其中有10处标出需要学生填空,使得整个程序能正确运行。

问题描述:用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。链表翻转是把数据逆序(变成降序),注意,头结点不动。翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错。

实验步骤:

读懂后面附带的源代码,在标注“填空”的位置填写适当的表达式或语句,使得程序完成指定功能。

测试要求:

1、连续插入5个实数;要求:插入的元素要分别位于表头、表中、表尾,以确

保该插入函数适合于各种情况;

2、翻转链表,确认成功后再翻转一次,恢复元素的升序序列;

3、删除3个数组元素,删除的元素要分别要位于表头、表中、表尾,以确保该

删除函数适合于各种情况;

4、删除一个不存在的元素,确认链表的内容没被改变。

//***************************************

//////

#include

#include "malloc.h"

#define null 0

struct node

{

float data;

struct node *next;

};

void insert(float aa,struct node *vq)

{

struct node *newnode,*p;

newnode=(struct node *)malloc(sizeof(struct node));

newnode->data=aa;

p=vq;

while ((p->next!=null)&&(p->next->data

/* 填空1 */

newnode->data=aa;

newnode->next=p->next;

/* 填空2 */

p->next=newnode;

vq->data=vq->data+1;

}

void dele(float aa,struct node *vq)

{

struct node *p,*q;

p=vq;

while ((p->next!=null)&&(p->next->data

/* 填空3 */

p++;

p=p->next;

if ((p->next==null)||(p->next->data!=aa))

printf("\n%5.1f is not in the link !",aa);

else if (p->next->data==aa)

{

q=p->next;

p->next=q->next;/* 填空4 */

free(q);/* 填空5 */

vq->data=vq->data-1;

}

}

void print(struct node *vq)

{

struct node *p;

printf("\nthe length of link is %4.0f",vq->data);

p=vq->next;

printf("\nthe link is:");

while (p!=NULL) /* 填空6 */

{

printf("%5.1f",p->data);

/* 填空7 */

p=p->next;

}

}

void reverse(struct node *vq)

{

struct node *q,*p;

p=vq->next;

vq->next=p->next;/* 填空8 */

while (p!=null)

{

q=p;

p=p->next;/* 填空9 */

q->next=p->next /* 填空10 */;

vq->next=q;

}

}

main()

{

int mark=1,op;

float aa;

struct node *vq;

vq=(struct node *)malloc(sizeof(struct node));

vq->data=0;

vq->next=null;

while (mark==1)

{

printf("\nWhich kind of operation will you select ? ");

printf("\ninsert---1, delete---2, print---3, reverse---4, exit---0 : ");

scanf("%d",&op);

switch (op)

{

case 0: mark=0;

break;

case 1: printf("\nPlease input the new element:");

scanf("%f",&aa);

insert(aa,vq);

print(vq);

break;

case 2: if (vq->data==0)

printf("\n the link is null !",aa);

else

{

printf("\nPlease input the deleted element:");

scanf("%f",&aa);

dele(aa,vq);

print(vq);

}

break;

case 3: print(vq);

break;

case 4: reverse(vq);

print(vq);

break;

default:printf(" input error!\n");

}

}

}

//////

//***************************************

以下是待填空的源代码,请同学们粘贴到系统中填空、运行、测试:

/* 链表操作:插入、删除、输出、翻转

用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。链表翻转是把数据逆序(变成降序),注意,头结点不动。翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错。*/

#include

#include "malloc.h"

#define null 0

struct node

{

float data;

struct node *next;

};

void insert(float aa,struct node *vq)

{

struct node *newnode,*p;

newnode=(struct node *)malloc(sizeof(struct node));

newnode->data=aa;

p=vq;

while ((p->next!=null)&&(p->next->data

newnode->next=p->next;

/* 填空2 */;

vq->data=vq->data+1;

}

void dele(float aa,struct node *vq)

{

struct node *p,*q;

p=vq;

while ((p->next!=null)&&(p->next->data

/* 填空3 */;

if ((p->next==null)||(p->next->data!=aa))

printf("\n%5.1f is not in the link !",aa);

else if (p->next->data==aa)

{

q=p->next;

p->next=/* 填空4 */;

free(/* 填空5 */);

vq->data=vq->data-1;

}

}

void print(struct node *vq)

{

struct node *p;

printf("\nthe length of link is %4.0f",vq->data);

p=vq->next;

printf("\nthe link is:");

while (/* 填空6 */)

{

printf("%5.1f",p->data);

/* 填空7 */;

}

}

void reverse(struct node *vq)

{

struct node *q,*p;

p=vq->next;

vq->next=/* 填空8 */;

while (p!=null)

{

q=p;

p=/* 填空9 */;

q->next= /* 填空10 */;

vq->next=q;

}

}

main()

{

int mark=1,op;

float aa;

struct node *vq;

vq=(struct node *)malloc(sizeof(struct node));

vq->data=0;

vq->next=null;

while (mark==1)

{

printf("\nWhich kind of operation will you select ? ");

printf("\ninsert---1, delete---2, print---3, reverse---4, exit---0 : ");

scanf("%d",&op);

switch (op)

{

case 0: mark=0;

break;

case 1: printf("\nPlease input the new element:");

scanf("%f",&aa);

insert(aa,vq);

print(vq);

break;

case 2: if (vq->data==0)

printf("\n the link is null !",aa);

else

{

printf("\nPlease input the deleted element:");

scanf("%f",&aa);

dele(aa,vq);

print(vq);

}

break;

case 3: print(vq);

break;

case 4: reverse(vq);

print(vq);

break;

default:printf(" input error!\n");

}

}

}

/*程序结束*/

线性表实验报告:针对链式或顺序存储的线性表实现指定的操作(二份)

、格式已经给出,请同学们参考书写。其中,第一项可补充,第二、三项不修改,第四项为可选项,第六项为参考程序,第五、七、八项需自己上机调试程序书写。注意:红色字体为提示内容,大家不要往实验报告上抄。 实验一:线性表的顺序存储结构的表示和实验 ——学生成绩管 理系统 一、实验目的:通过上机调试程序,充分理解和掌握有关线性表的定义、实现及操作。 二、实验环境 Win2003/win xp +Visual C++ 三、基本要求:利用顺序表来制作一个学生成绩表 1、建立头文件,包含数据类型定义和基本操作。 2、建立程序文件利用顺序表表完成一个班级的一个学期的所有课程的管理:能够增加、删除、修改学生的成绩记录。 四、简要的需求分析与概要设计(本项为可选项,选作时参考课

五、详细的算法描述: 六、实验步骤(以下为参考程序,已经调试运行通过)#include #include using namespace std; const int LISTINITSIZE=100; const int LISTINCREMENT=10; struct student { char no[20];

char name[20]; int english; int math; }; typedef student elemtype; struct sqlist { elemtype *elem; int length; int listsize; int incrementsize; }; //初始化顺序表l void initlist(sqlist &l,int maxsize=LISTINITSIZE,int incresize=LISTINCREMENT) { l.elem=new elemtype[maxsize]; l.length=0; l.listsize=maxsize; l.incrementsize=incresize;

数据结构实验答案1

重庆文理学院软件工程学院实验报告册 专业:_____软件工程__ _ 班级:_____软件工程2班__ _ 学号:_____201258014054 ___ 姓名:_____周贵宇___________ 课程名称:___ 数据结构 _ 指导教师:_____胡章平__________ 2013年 06 月 25 日

实验序号 1 实验名称实验一线性表基本操作实验地点S-C1303 实验日期2013年04月22日 实验内容1.编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。 2.编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。 3.编程序实现将单链表的数据逆置,即将原表的数据(a1,a2….an)变成 (an,…..a2,a1)。(单链表的数据域数据类型为一结构体,包括学生的部分信息:学号,姓名,年龄) 实验过程及步骤1. #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define ElemType int #define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/ typedef struct

{ ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/ int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/ }SeqList; #include "common.h" #include "seqlist.h" void px(SeqList *A,int j); void main() { SeqList *l; int p,q,r; int i; l=(SeqList*)malloc(sizeof(SeqList)); printf("请输入线性表的长度:"); scanf("%d",&r); l->last = r-1; printf("请输入线性表的各元素值:\n"); for(i=0; i<=l->last; i++) { scanf("%d",&l->elem[i]); } px(l,i); printf("请输入要插入的值:\n");

线性表的链式存储结构实验报告

实验报告 课程名称:数据结构与算法分析 实验名称:链表的实现与应用 实验日期:班级:数媒1401 姓名:范业嘉学号 08 一、实验目的 掌握线性表的链式存储结构设计与基本操作的实现。 二、实验内容与要求 ⑴定义线性表的链式存储表示; ⑵基于所设计的存储结构实现线性表的基本操作; ⑶编写一个主程序对所实现的线性表进行测试; ⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用 线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。 ⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。 三、数据结构设计 1.按所用指针的类型、个数、方法等的不同,又可分为: 线性链表(单链表) 静态链表 循环链表 双向链表 双向循环链表 2.用一组任意的存储单元存储线性表中数据元素,用指针来表示数据元素间的逻辑关系。 四、算法设计 1.定义一个链表 void creatlist(Linklist &L,int n) { int i; Linklist p,s; L=(Linklist)malloc(sizeof(Lnode)); p=L; L->next=NULL; for(i=0;idata); s->next=NULL; p->next=s; p=s; }

数据结构实验二11180

理工学院实验报告 系部计算机系班级学号 课程名称数据结构实验日期 实验名称链表的基本操作成绩 实验目的: (1)掌握线性表的链式存储结构的特点; (2)掌握线性表的基本操作:初始化、插入、删除、查找数据元素等运算在链式存储结构上的实现。 实验条件:计算机一台,vc++6.0 实验容与算法思想: 容: 建立一有序的链表,实现下列操作: 1.把元素x插入表中并保持链表的有序性; 2.查找值为x的元素,若找到将其删除; 3.输出表中各元素的值。 算法思想:先创建并初始化一个顺序表(void init_linklist(LinkList)),通过循环,输入一串数据void CreateFromTail(LinkList L);创建主函数;编写算法,完成子函数(查找locate,插入insList,删除DelList,输出output)模块;调用子函数,完成实验要求 运行结果:

附:源程序: #include #include #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct Node { ElemType data; struct Node* next; }Node,*LinkList; void init_linklist(LinkList *l) { *l=(LinkList)malloc(sizeof(Node)); (*l)->next=NULL; } void CreateFromTail(LinkList L) { Node *r, *s; char c; int flag =1; r=L; while(flag) { c=getchar(); if(c!='$') {

线性表的顺序储存结构

重庆交通大学 《算法与数据结构》课程 实验报告 班级:计算机科学与技术2014级2班 实验项目名称:线性表的顺序储存结构 实验项目性质: 实验所属课程:算法与数据结构 实验室(中心): B01407 指导教师:鲁云平 实验完成时间:2016 年 3 月21 日

一、实验目的 1、实现线性表的顺序存储结构 2、熟悉C++程序的基本结构,掌握程序中的头文件、实现文件和主文件之间的相互关系及各自的作用 3、熟悉顺序表的基本操作方式,掌握顺序表相关操作的具体实现 二、实验内容及要求 对顺序存储的线性表进行一些基本操作。主要包括: (1)插入:操作方式为在指定元素前插入、在指定元素之后插入、在指定位置完成插入 (2)删除:操作方式可分为删除指定元素、删除指定位置的元素等,尝试实现逻辑删除操作。 (3)显示数据 (4)查找:查询指定的元素(可根据某个数据成员完成查询操作)(5)定位操作:定位指定元素的序号

(6)更新:修改指定元素的数据 (7)数据文件的读写操作等。 其它操作可根据具体需要自行补充。 要求线性表采用类的定义,数据对象的类型自行定义。 三、实验设备及软件 VC6.0 四、设计方案 ㈠题目 线性表的顺序存储结构 ㈡设计的主要思路 1、新建SeqList.h头文件,定义SeqList模板类 2、设计类数据成员,包括:T *data(用于存放数组)、int maxSize(最大可容表项的项数)、int last(当前已存表项的最后位置) 3、设计类成员函数,主要包括: int search(T& x)const;//搜索x在表中位置,函数返回表项序号 int Locate(int i)const;//定位第i个表项,函数返回表项序号 bool getData(int i,T& x)const;//去第i个表项的值 void setData(int i,T& x)//用x修改第i个表项的值 bool Insert(int i,T& x);//插入x在第i个表项之后 bool Remove(int i,T& x); //删除第i个表项,通过x返回表项的值 bool IsEmpty();//判表空否,空则返回true;否则返回false bool IsFull();//判表满否,满则返回true;否则返回false void input(); //输入 void output();//输出

数据结构实验二

洛阳理工学院实验报告 系部计算机系班级学号姓名 课程名称数据结构实验日期 实验名称链表的基本操作成绩 实验目的: (1)掌握线性表的链式存储结构的特点; (2)掌握线性表的基本操作:初始化、插入、删除、查找数据元素等运算在链式存储结构上的实现。 实验条件:计算机一台,vc++6.0 实验内容与算法思想: 内容: 建立一有序的链表,实现下列操作: 1.把元素x插入表中并保持链表的有序性; 2.查找值为x的元素,若找到将其删除; 3.输出表中各元素的值。 算法思想:先创建并初始化一个顺序表(void init_linklist(LinkList)),通过循环,输入一串数据void CreateFromTail(LinkList L);创建主函数;编写算法,完成子函数(查找locate,插入insList,删除DelList,输出output)模块;调用子函数,完成实验要求 运行结果:

附:源程序: #include #include #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct Node { ElemType data; struct Node* next; }Node,*LinkList; void init_linklist(LinkList *l) { *l=(LinkList)malloc(sizeof(Node)); (*l)->next=NULL; } void CreateFromTail(LinkList L) { Node *r, *s; char c; int flag =1; r=L; while(flag) { c=getchar(); if(c!='$') {

实验二 线性表的链式存储结构

南昌航空大学实验报告 课程名称:数据结构实验名称:实验二线性表的链式存储结构 班级:学生姓名:冯华华学号:11046213 指导教师评定: XXX 签名: XXX 一、问题描述 1单链表的实现与操作。 2设计一个程序求出约瑟夫环的出列顺序。约瑟夫问题的一种描述是:编号为1,2,…, n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整 数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。 报m的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1 报数,如此下去,直到所有人全部出列为止。例如,n=7,7个人的密码依次为: 3,1,7,2,4,8,4,m的初值取6,则正确的出列顺序应为6,1,4,7,2,3,5。要求使用单向循环 链表模拟此出列过程。 二、程序分析 约瑟夫环的大小是变化的,因此相应的结点也是变化的,使用链式存储结构可以动态的 生成其中的结点,出列操作也非常简单。用单向循环链表模拟其出列顺序比较合适。 用结构指针描述每个人: struct Joseph {int num;/*环中某个人的序号*/ int secret;/环中某个人的密码*/ struct Joseph *next;/指向其下一个的指针*/}; 1)初始化约瑟夫环: 调用函数struct Joseph *creat()生成初始约瑟夫环。在该函数中使用head 指向 表头。输入序号为0时结束,指针p1指向的最后结束序号为0的结点没有加入到 链表中,p2 指向最后一个序号为非0 的结点(最后一个结点)。 2)报数出列: 调用函数voil sort(struct Joseph * head,int m),使用条件p1->next!=p1判断 单向链表非空,使用两个指针变量p1和p2,语句p2=p1;p1=p1->next;移动指针, 计算结点数(报数);结点p1出列时直接使用语句:p2->next=p1->next,取出该 结点中的密码作为新的循环终值。 三、调试过程及实验结果 最后程序运行结果如下所示: 输入数据:数据格式为序号,密码 输入0,0为结束 1,3↙<回车> 2,1↙<回车>

数据结构实验报告 实验一 线性表链式存储运算的算法实现

昆明理工大学信息工程与自动化学院学生实验报告 (201 —201 学年第一学期) 课程名称:数据结构开课实验室:年月日年级、专业、班学号姓名成绩 实验项目名称线性表链式存储运算的算法实现指导教师 教 师 评语教师签名: 年月日 一.实验内容: 线性表链式存储运算的算法实现,实现链表的建立、链表的数据插入、链表的数据删除、链表的数据输出。 二.实验目的: 1.掌握线性表链式存储结构的C语言描述及运算算法的实现; 2.分析算法的空间复杂度和插入和删除的时间复杂度; 3.总结比较线性表顺序存储存储与链式存储的各自特点。 三.主要程序代码分析: LinkList creatListR1() //用尾插入法建立带头结点的单链表 { char *ch=new char(); LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点*head ListNode *s,*r,*pp; r=head; //尾指针初值指向头结点 r->next=NULL; scanf("%s",ch); //读入第一个结点的值 while(strcmp(ch,"#")!=0) { //输入#结束

pp=LocateNode(head,ch); if(pp==NULL) { s=(ListNode *)malloc(sizeof(ListNode)); //生成新的结点*s strcpy(s->data,ch); r->next=s; //新结点插入表尾 r=s; //尾指针r指向新的表尾 r->next=NULL; } scanf("%s",ch); //读入下一个结点的值 } return head; //返回表头指针 } int Insert(ListNode *head) //链表的插入 { ListNode *in,*p,*q; int wh; in=(ListNode *)malloc(sizeof(ListNode));in->next=NULL; //生成新结点p=(ListNode *)malloc(sizeof(ListNode));p->next=NULL; q=(ListNode *)malloc(sizeof(ListNode));q->next=NULL; scanf("%s",in->data); //输入插入的数据 scanf("%d",&wh); //输入插入数据的位置 for(p=head;wh>0;p=p->next,wh--); q=p->next; p->next=in; in->next=q; } void DeleteList(LinkList head,char *key) //链表的删除 { ListNode *p,*r,*q=head; p=LocateNode(head,key); //按key值查找结点的 if(p==NULL) exit(0); //若没有找到结点,退出 while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next; r=q->next; q->next=r->next; free(r); //释放结点*r } 四.程序运行结果:

线性表的链式存储结构和实现

经济学院 实验报告 学院: 专业: 计算机 班级: 学号: 姓名: 信息工程学院计算机实验中心制

实验题目:线性表的链式存储结构和实现 实验室:机房4 设备编号: 09 完成日期: 2012.04.09 一、实验容 1.会定义线性表的链式存储结构。 2.熟悉对单链表的一些基本操作(建表、插入、删除等)和具体的函数定义。 二、实验目的 掌握链式存储结构的特点,掌握并实现单链表的常用的基本算法。 三、实验的容及完成情况 1. 需求分析 (1)线性表的抽象数据类型ADT的描述及实现。 本实验实现使用Visual c++6.0实现线性表链式存储结构的表示及操作。具体实现要求: (2)完成对线性表链式存储结构的表示和实现。 (3)实现对单链表的创建。 (4)实现对单链表的插入和删除操作。 2.概要设计 抽象数据类型线性表的定义:ADT LIST{ 抽象对象:D={ai|ai<-Elemset,i=1,2,…,n,n>=0} 数据关系:R1={

数据结构实验报告

姓名: 学号: 班级: 2010年12月15日

实验一线性表的应用 【实验目的】 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。、; 2、以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现; 4、通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的 应用和链表的建立等各种基本操作)。 【实验内容】 约瑟夫问题的实现:n只猴子要选猴王,所有的猴子按1,2,…,n编号围坐一圈,从第一号开始按1,2…,m报数,凡报到m号的猴子退出圈外,如此次循环报数,知道圈内剩下一只猴子时,这个猴子就是猴王。编写一个程序实现上述过程,n和m由键盘输入。【实验要求】 1、要求用顺序表和链表分别实现约瑟夫问题。 2、独立完成,严禁抄袭。 3、上的实验报告有如下部分组成: ①实验名称 ②实验目的 ③实验内容:问题描述:数据描述:算法描述:程序清单:测试数据 算法: #include #include typedef struct LPeople { int num; struct LPeople *next; }peo; void Joseph(int n,int m) //用循环链表实现 { int i,j; peo *p,*q,*head; head=p=q=(peo *)malloc(sizeof(peo)); p->num=0;p->next=head; for(i=1;inum=i;q->next=p;p->next=head; } q=p;p=p->next; i=0;j=1; while(i

数据结构线性表的链式存储结构

1.实验目的 掌握线性表的链式存储结构设计与基本操作的实现。 2.实验内容与要求 ⑴定义线性表的链式存储表示; ⑵基于所设计的存储结构实现线性表的基本操作; ⑶编写一个主程序对所实现的线性表进行测试; ⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。 ⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式相加;④执行两个多项式相减; 3.数据结构设计 逻辑结构:线性结构 存储结构:链式存储结构 4.算法设计 #include #include #include typedef struct LNode { int data; struct LNode *next; }LNode; typedef struct Pnode { float coef; int exp; struct Pnode *next; }Polynode; void menu() { printf("******************************* **************\n"); printf("* 作者:Dick *\n"); printf("* 信计1001 xxxxxxxxxx *\n"); printf("*********************MENU**** ***************\n"); printf("1 求A和B的并集C\n"); printf("2 对A和B进行合并,用线性表C保存合并结果(有序)\n"); printf("3 建立一元多项式(两个)\n"); printf("4 两个一元多项式相加\n"); printf("5 两个一元多项式相减\n"); printf("6 退出程序\n"); } void UnionList() { //先输入两个链表,然后判断是否为空,头结点还是要的。 int i; LNode *List1,*List2,*List3,*p,*q,*r; List1 = (LNode *)malloc( sizeof(LNode) ); List2 = (LNode *)malloc( sizeof(LNode) ); List3 = (LNode *)malloc( sizeof(LNode) ); List1->next = List2->next = List3->next = NULL; printf("请输入第一个链表的数据(1~100),以0结束\n"); p = q = r = (LNode *)malloc( sizeof(LNode) ); while(1)

线性表ADT的顺序存储与链式存储实验报告

实验报告 题目:完成线性表ADT的顺序存储和链式存储方式的实现 一、需求分析 1、本演示程序中,线性表的数据元素类型限定为整型 2、演示程序以用户和计算机的对话方式执行,即在计算机的终端上显示“提 示信息”之后由用户在键盘上键入演示程序规定的运算命令,相应的输出 结果显示在后面。 3、程序的执行命令包括: 创建、撤销、清空、插入、修改、删除、定位等线性表ADT各项基本操作二、概要设计 为实现上述功能,我们给出线性表的抽象数据类型定义,具体的有单向链,双向 链,顺序表等,同时对于上述功能的实现还采用有/无头结点两种方式来实现 1.线性表的抽象数据类型定义为 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={|ai-1,ai∈D,i=2,…,n} 基本操作: InitList(&L) 操作结果:构造一个空的线性表L DestroyList(&L) 初始条件:线性表L已存在。 操作结果:销毁线性表L。 ClearList(&L) 初始条件:线性表L已存在。 操作结果:将L重置为空表。 ListEmpty(L) 初始条件:线性表L已存在。 操作结果:若L为空表,则返回TRUE,否则返回FALSE。 ListLength(L) 初始条件:线性表L已存在。 操作结果:返回L中的i个数据元素的值。 GetElem(L,i,&e) 初始条件:线性表L已存在,1≤i≤ListLength(L)。 操作结果:用e返回L中第i个数据元素的值。 LocateElem(L,e,compare()) 初始条件:线性表L已存在,compare()是数据元素判定函数 操作结果:返回L中第一个与e满足compare()的数据元素的位序。 若这样的数据元素不存在,则返回值为0. PriorElem(L,cur_e,&pre_e) 初始条件:线性表已存在 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e 返回它的前驱,否则操作失败,pre_e无定义。

数据结构实验二-

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

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

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

数据结构实验二链表

云南大学数学与统计学实验教学中心 实 验 报 告 一、实验目的: 通过实验掌握线性链表的建立及基本操作,巩固课堂内容,练习其程序的设计与实现。 由于顺序存储结构的操作相对比较简单,而且在前期课程《高级语言程序设计》中使用得也多, 所以本次实验侧重于对线性链表存储结构上的操作及应用的实现。 二、实验内容: 本实验包含以下几个子问题: 1、 采用表尾挂入法建立一个以LA 为头指针的单链表: 2、 3、 就地逆转以LB 为头指针的单链表,即得到如下形式的单链表: 4、 将逆转后的LB 表接到LA 表之尾并构成循环链: LA 二、实验要求: 1. 每一个子问题用一个C 语言的函数来完成。 2. 对每一个子问题的结果用一个打印函数输出其结果以验证程序运行是否正确。 打印函数必须是公共的,即:用一个输出函数,既可以对单链表又可对循环链表实现,

打印输出。 3.用主函数调用各个子函数,以完成题目要求。 4.程序设计时应尽量考虑通用性,若改变题给数据仍能实现要求。 [实现提示]: .第3小题题中的“就地逆转”即只允许引入除LB外的两个工作指针来实现。 即可以以循环方式从链表首部起逐个地修改各个结点的指针:从NEXT(向后)指针改变为PRIOR(向前)的指针,并注意保存搜索时的指针。 三、实验环境 Windows win7 程序设计语言C 四、实验过程(请学生认真填写): 1. 实验设计的(各)流程图:

2. 程序设计的代码及解释(必须给出): /*----------------------------------LinkList-------------------------------------*/ /*基本要求---------------------------------------------------------------------*/ /*采用表尾挂入法建立一个以LA为头指针的单链表--------------*/ /*采用表首插入法建立一个以LB为头指针的单链表.---------------*/ /*就地逆转以LB为头指针的单链表,即得到如下形式的单链表.*/ /*将逆转后的LB表接到LA表之尾并构成循环链-------------------*/ /*每一个子问题用一个C语言的函数来完成--------------------------*/ /* 打印函数必须是公共的-------------------------------------------------*/ /*-------------------------------------Start-------------------------------------*/ /*--------------------------------------------------------------------------------*/ #include #include #include #define LIST_SIZE 10 /*--------------------------------------------------------------------------------*/ /*定义链表类型--------------------------------------------------------------*/ typedef struct LNode{ int data; struct LNode *next; }LinkList; /*--------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------*/ main(){ LinkList *InitialList1(); LinkList *InitialList2(); LinkList *reverse(LinkList *L); void connect(LinkList *L1,LinkList *L2); void putList(LinkList *L); LinkList *L1,*L2; L1=InitialList1(); L2=InitialList2(); printf("The original of list L1:\n"); putList(L1); printf("The original of list L2:\n");

线性表的顺序存储结构_实验报告样例

年南昌航空大学实验报告(用实验报告纸,手写) 课程名称:数据结构实验名称:实验一线性表的顺序存储结构 班级: 080611 学生姓名:赖凌学号: 08061101 指导教师评定:签名: 题目:有两张非递减有序的线性学生表A,B,采用顺序存储结构,两张表合并用c表存,要求C仍为非递减有序的,并删除C中值相同的表。 一、需求分析 ⒈本演示程序根据已有的6位学生的信息,实现两张表的合并及删除值相同元素的操作,不需要用户 重新输入学生的信息。 ⒉在演示过程序中,用户敲击键盘,即可观看演示结果。 ⒊程序执行的命令包括: (1)构造线性表A (2)构造线性表B (3)求两张表的并(4)删除C中值相同的元素 二、概要设计 ⒈为实现上述算法,需要线性表的抽象数据类型: ADT Stack { 数据对象:D={a i:|a i∈ElemSet,i=1…n,n≥0} 数据关系:R1={|a i-1,a i∈D,i=2,…n≥0} 基本操作: init(list *L) 操作结果:构造一个空的线性表L。 ListLength(List *L) 初始条件:线性表L已经存在 操作结果:返回L中数据元素的个数。 GetElem(List L, int i, ElemType *e) 初始条件:线性表L已经存在,1≤i≤ListLength(&L) 操作结果:用e返回L中第i个数据元素的值。 EqualList(ElemType *e1,ElemType *e2) 初始条件:数据元素e1,e2存在 操作结果:以e1,e2中的姓名项作为判定e1,e2是否相等的依据。 Less_EquaList(ElemType *e1,ElemType *e2) 初始条件:数据元素e1,e2存在 操作结果:以e1,e2中的姓名项(为字符串)的≤来判定e1,e2是否有≤的关系。 LocateElem(List *La,ElemType e,int type) 初始条件:线性表La已经存在 操作结果:判断La中是否有与e相同的元素。

实验3 线性表的链式存储

实验报告三线性表的链式存储 班级:姓名:学号:专业: 一、实验目的: (1)掌握单链表的基本操作的实现方法。 (2)掌握循环单链表的基本操作实现。 (3)掌握两有序链表的归并操作算法。 二、实验内容:(请采用模板类及模板函数实现) 1、线性表链式存储结构及基本操作算法实现 [实现提示] (同时可参见教材p64-p73页的ADT描述及算法实现及ppt)函数、类名称等可自定义,部分变量请加上学号后3位。也可自行对类中所定义的操作进行扩展。 所加载的库函数或常量定义: (1)单链表存储结构类的定义: (2)初始化带头结点空单链表构造函数实现 输入:无 前置条件:无 动作:初始化一个带头结点的空链表 输出:无 后置条件:头指针指向头结点。 (3)利用数组初始化带头结点的单链表构造函数实现 输入:已存储数据的数组及数组中元素的个数 前置条件:无 动作:利用头插或尾插法创建带头结点的单链表 输出:无 后置条件:头指针指向头结点,且数组中的元素为链表中各结点的数据成员。 (4)在带头结点单链表的第i个位置前插入元素e算法 输入:插入位置i,待插入元素e 前置条件:i的值要合法 动作:在带头结点的单链表中第i个位置之前插入元素e 输出:无 后置条件:单链表中增加了一个结点 (5)在带头结点单链表中删除第i个元素算法 输入:删除第i个结点,待存放删除结点值变量e 前置条件:单链表不空,i的值要合法 动作:在带头结点的单链表中删除第i个结点,并返回该结点的值(由e传出)。

输出:无 后置条件:单链表中减少了一个结点 (6)遍历单链表元素算法 输入:无 前置条件:单链表不空 动作:遍历输出单链表中的各元素。 输出:无 后置条件:无 (7)求单链表表长算法。 输入:无 前置条件:无 动作:求单链表中元素个数。 输出:返回元素个数 后置条件:无 (8)判单链表表空算法 输入:无 前置条件:无 动作:判表是否为空。 输出:为空时返回1,不为空时返回0 后置条件:无 (9)获得单链表中第i个结点的值算法 输入:无 前置条件:i不空,i合法 动作:找到第i个结点。 输出:返回第i个结点的元素值。 后置条件:无 (10)删除链表中所有结点算法(这里不是析构函数,但功能相同)输入:无 前置条件:单链表存在 动作:清除单链表中所有的结点。 输出:无 后置条件:头指针指向空

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