当前位置:文档之家› 实验二 链表的实现和应用

实验二 链表的实现和应用

实验二 链表的实现和应用
实验二 链表的实现和应用

实验二链表的实现和应用

一、实验目的

掌握线性表的链式存储结构设计与基本操作的实现

二、实验内容与要求

⑴定义线性表的链式存储表示;

⑵基于所设计的存储结构实现线性表的基本操作;

⑶编写一个主程序对所实现的线性表进行测试;

⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A

和B的并集C,并用线性表L3代表集合C;②设线性表L1和L2中的数据元素

为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性

表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。

三、数据结构设计

在主函数中实现函数的调用,从而实现线性表的插入、删除、创建、显示等。四、测试结果

通过输入不同的数字(1~6)实现不同的操作,在两个线性表结合时,线性表二在

源程序中已给出的,通过操作可以得到非单调递减的有序数列

五、心得体会

在写程序的过程中要注意分析,参照其他标准程序,多上机运行一点点的改正错误,这样才会有所提高。

MAIN.C 方丽平信计1203班1130112321 最后修改时间2014/3/31

#include

#include

#define maxsize 1024

typedef int datatype;

typedef struct node

{

datatype data;

struct node * next;

}linkList;

int main()

{

linkList * CREATE();

int INSERT(linkList *head, int value, int position);

int DELETE(linkList *head, int position);

int DISPLAY(linkList *head);

linkList * COMBINE(linkList *head1, linkList *head2);

linkList * head1;

linkList * head2;

linkList * head3;

linkList * head;

linkList * p1,* p2,* s1,* s2,* r1,* r2;

int position, value, i;

head1 = malloc(sizeof(linkList));

r1 = head1;

head2 = malloc(sizeof(linkList));

r2 = head2;

for(i = 0; i< 20; i++)

{

s1 = malloc(sizeof(linkList));

s1 ->data = i;

r1 ->next = s1;

r1 = s1;

s2 = malloc(sizeof(linkList));

s2 ->data = i + 2;

r2 ->next = s2;

r2 = s2;

}

r2 -> next = NULL;

r1 -> next = NULL;

while(1)

{

printf("the program \n");

printf("can realize to create,insert,delete,display,etc\n"); printf("1:create the ranked list\n");

printf("2:insert a data\n");

printf("3:delete a data\n");

printf("4:display all the data\n");

printf("5:Combine two link lists of operation\n");

printf("6:return,end of the program\n");

printf("selection of operation\n");

scanf("%d",&i);

while ( i < 1 || i > 6 )

{

printf("please input again\n");

scanf("%d",&i);

}

switch(i)

{

case 1:

head = CREATE();

break;

case 2:

/*INSERT(p);*/

printf("Please input insert place\n");

scanf("%d",&position);

printf("Please input insert value\n");

scanf("%d",&value);

INSERT(head, value, position);

break;

case 3:

printf("Please input delete position\n");

scanf("%d",&value);

DELETE(head, position);

break;

case 4:

DISPLAY(head);

break;

case 5:

printf("The list 1:\n");

DISPLAY(head1);

printf("The list 2:\n");

DISPLAY(head2);

printf("The combine list:\n");

head3 = COMBINE(head1, head2);

DISPLAY(head3);

break;

case 6:

exit(0);

break;

}

}

}

linkList * CREATE()

{

int value;

linkList * head,* s,* r;

head = malloc(sizeof(linkList));

r = head;

printf("input the data of the number,input 55 over!");

scanf("%d",&value);

do{

s = malloc(sizeof(linkList));

s ->data = value;

r ->next = s;

r = s;

printf("input the data of the number");

scanf("%d",&value);

}while(value != 55);

r -> next = NULL;

return head;

}

int INSERT(linkList *head,int value, int position)

{

int j = 1;

linkList *p,*s,*n;

s = malloc(sizeof(linkList));

s ->data = value;

p = head;

printf("Note:if the position is greater than the length of the table will be put in the final");

while(j < position)

{

if( (p -> next) != NULL )

{

p = p -> next;

}

j ++;

n = p -> next;

s -> next =n;

p -> next = s;

return 0;

}

int DELETE(linkList *head, int position)

{

int j;

linkList *p;

linkList *s;

p = head;

printf("Note:if the position is greater than the length of the table will be delete nothing!");

for(j = 1;j < position; j ++)

{

if( (p -> next) != NULL )

{

p = p -> next;

}else{

return 0;

}

}

s = p -> next;

if((s -> next) != NULL)

{

(*p).next = (*s).next;

}

s = NULL;

return 0;

}

int DISPLAY(linkList *head)

{

linkList *p;

int i;

i = 0;

p = head -> next;

while(p != NULL)

printf("%5d",(*p).data);

p = p -> next;

i ++;

if(i % 5 == 0)

printf("\n");

}

return 0;

}

linkList * COMBINE(linkList *head1, linkList *head2) {

linkList *head,*r;

linkList *p1, *p2,*s;

head = malloc(sizeof(linkList));

r = head;

p1 = malloc(sizeof(linkList));

p2 = malloc(sizeof(linkList));

p1 = head1 -> next;

p2 = head2 -> next;

do{

s = malloc(sizeof(linkList));

if( (p1 != NULL) && (p2 != NULL) )

{

if(p1 -> data < p2 -> data )

{

s -> data = p1 -> data;

p1 = p1 ->next;

}else

{

s -> data = p2 -> data;

p2 = p2 ->next;

}

}else if( (p1 != NULL) && (p2 == NULL) )

{

s -> data = p1 -> data;

p1 = p1 ->next;

}else if( (p2 != NULL) && (p1 == NULL) )

{

s -> data = p2 -> data;

p2 = p2 ->next;

}

r ->next = s;

r = s;

}while( (p1 != NULL) || (p2 != NULL) );

return head;

}

实验一 顺序表与链表 成品

实验一顺序表与链表 一、实验目的 1、掌握线性表中元素的前驱、后续的概念。 2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。 3、对线性表相应算法的时间复杂度进行分析。 4、理解顺序表、链表数据结构的特点(优缺点)。 二、实验预习 说明以下概念 1、线性表:线性表是最常用且最简单的一种数据结构。一个线性表是n个数据元素的有限 序列。 2、顺序表:线性表的顺序存储结构或顺序映像,通常,称这种存储结构的线性表为顺序表。 3、链表:指针域中存储的信息称作指针或链。N个接点连接成一个链表,故又称线性链表。 三、实验内容和要求 1、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。 ●#include ●#include ●#define ERROR 0 ●#define OK 1 ● ●#define INIT_SIZE 5 /*初始分配的顺序表长度*/ ●#define INCREM 5 /*溢出时,顺序表长度的增量*/ ●typedef int ElemType; /*定义表元素的类型*/ ●typedef struct Sqlist{ ●ElemType *slist; /*存储空间的基地址*/ ●int length; /*顺序表的当前长度*/ ●int listsize; /*当前分配的存储空间*/ ●}Sqlist; ● ●int InitList_sq(Sqlist *L); /* 构造一个空的线性表L */ ●int CreateList_sq(Sqlist *L,int n); /* 不断地插入元素 */ ●int ListInsert_sq(Sqlist *L,int i,ElemType e);/* 在L中第i个位置之前插 入一个数据元素e,L的长度加1 */ ●int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/ ●int ListDelete_sq(Sqlist *L,int i); /*删除第i个元素*/

数据结构实验集合的并交差运算实验报告记录

数据结构实验集合的并交差运算实验报告记录

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

实验报告 实验课程:数据结构 实验项目:实验一集合的并交差运算专业:计算机科学与技术 班级: 姓名: 学号: 指导教师:

目录一、问题定义及需求分析 (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;

(完整版)数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1 .实验目的 (1 )掌握使用Visual C++ 6.0 上机调试程序的基本方法; (2 )掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2 .实验要求 (1 )认真阅读和掌握和本实验相关的教材内容。 (2 )认真阅读和掌握本章相关内容的程序。 (3 )上机运行程序。 (4 )保存和打印出程序的运行结果,并结合程序进行分析。 (5 )按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>// 头文件 #include// 库头文件------ 动态分配内存空间 typedef int elemtype;// 定义数据域的类型 typedef struct linknode// 定义结点类型 { elemtype data;// 定义数据域 struct linknode *next;// 定义结点指针 }nodetype; 2)创建单链表

nodetype *create()// 建立单链表,由用户输入各结点data 域之值, // 以0 表示输入结束 { elemtype d;// 定义数据元素d nodetype *h=NULL,*s,*t;// 定义结点指针 int i=1; cout<<" 建立一个单链表"<> d; if(d==0) break;// 以0 表示输入结束 if(i==1)// 建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));// 表示指针h h->data=d;h->next=NULL;t=h;//h 是头指针 } else// 建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t 始终指向生成的单链表的最后一个节点

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)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

链表实验报告

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)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10;

template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp

#include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) {

长沙理工大学数据结构链表的实现及应用实验报告

实 验 报 告 年级 班号 学号 姓名 实验名称: 第一次实验:简单学生管理系统 实验日期 2016年11月25日 计算机科学与技术系 2016年制

一、实验环境 Windows32位系统Microsoft Visual C++ 二、实验目的 掌握链表的使用 三、实验内容 用单向链表实现的简单学生管理系统 四、数据结构与算法思想描述 对单链表的增删查改 五、程序清单 /* 函数信息: 菜单选项 void Menu(); 初始化链表 void InitLink(node *head); 输出单个学生信息 void SingleShow(node *p); 尾插法 node* AddLink(node *p,char *num); 建立链表,并输入学生信息。 node *CreateLink(node *head); 查找学生信息,查找则返回查找位置前一个点 node *SearchLink(node *head, char *num); 增加学生信息,先进行查找,若已有则提示用户是否修改,否则增加void InsertLink(node *head, char *num); 修改学生信息,先进行查找,若已有则提示用户修改,否则退出 void ModifyLink(node *head, char *num); 删除学生信息 void DeleteLink(node *head, char *num); 显示所有学生信息 void Display(node *head) */ #include #include #include #include #include #define MAXM 50 //学生管理系统名字学号成绩的最大字节数 #define Tip "\t\tName\t\tNumber\t\tScore\n"

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

数据结构设计性实验报告 课程名称_____ ____ 题目名称 学生学院 专业班级 学号 学生姓名 指导教师 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);

数据结构实验报告2

数据结构实验报告 二.程序设计相关信息 (1)实验题目:编写一个程序algo2-3.cpp,实现双链表的各种基本运算,并在此基础上设计一个主程序完成如下功能: 1.初始化双链表h; 2.依次采用尾插法插入a,b,c,d,e元素; 3.输出双链表h; 4.输出双链表h长度; 5.输出双链表h是否为空; 6.判断双链表h的第3个元素; 7.输出元素‘a’的位置; 8.在第4个元素位置上插入‘f’元素; 9.输出双链表h; 10.删除L的第3个元素; 11.输出双链表h; 12.释放双链表h。 (2)实验目的:熟悉双链表的基本操作并掌握尾插法建表。 (3)算法描述或流程图

(4)源代码 #include #include

typedef struct DNode { char data; struct DNode *next; struct DNode *prior; }DNode,DLinkList; void initlist(DLinkList *&h) { h=(DLinkList*)malloc(sizeof(DLinkList)) ; h->next=NULL; h->prior=NULL; } void destroylist(DLinkList *&h) { DLinkList *p=h,*q=p->next; while(q!=NULL) {free(p); p=q; q=p->next; } free(p); } int getelem(DLinkList *h,int i,char &e) {int j=0; DLinkList *p=h; while(jnext; } if(p==NULL) return 0; else { e=p->data; return 1; } } int listempty(DLinkList *h) { return(h->next==NULL&&h->prior==NULL); } int listlength(DLinkList *h) { DLinkList *p=h;int n=0; while(p->next!=NULL) {n++; p=p->next; } return (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 #include typedef struct LNode { int data; int length; struct LNode *next; struct LNode *prior; }DuLNode,*DuLinkList; void initlist(DuLNode **p){ *p=(DuLinkList)malloc(sizeof(DuLNode)); (*p)->next=(*p)->prior=NULL; } void create(DuLNode **p,int n){ DuLinkList q; printf("输入%d个双向链表的元素\n",n); for(int i=n;i>0;--i)//创建n个元素的双向链表。 { DuLinkList s; s=(DuLinkList)malloc(sizeof(DuLNode)); scanf("%d",&(s->data)); if(i==n) {*p=s; q=s; s->next=s->prior; s->prior=s->next; } else { q->next=s; s->next=*p; (*p)->prior=s; s->prior=q; q=s; } } (*p)->length=n; }

void Display(DuLinkList L,int n){ int i; for(i=0;inext; } } int main(int argc, char* argv[]) { DuLinkList L; initlist(&L); create(&L,3); Display(L,3); printf("双向链表的长度%d\t",L->length); return 0; }

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

实验有序表合并姓名:窦晓磊班级:软件工程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;

双向链表实验报告

13软工转本1 钱剑滨实验报告 双向链表实验报告 信息工程系 13软工转本1 日期 2016年03月12日 姓名钱剑滨学号 13131116 电话 一、实验内容 编写关于双向链表操作的C语言程序,要求包含双向链表的创建(生成)、输出(遍历)、查找、任意位置插入、有顺序插入、删除、等。 二、实验步骤 1.分析操作所需思路,熟练运用单链表的各种特点。 2.编写程序,利用函数特性进行操作。 3.运行程序,纠正错误,对预测结果进行验证。 4.分析总结单链表的优缺点,并可以做到熟练掌握双向链表的各种 操作。 三、设计概要 1.本实验包含了7个函数: a)主函数main() b)创建链表函数Listcreate() c)数据输出函数Listprint() d)查找数据函数Listlocate() e)无序插入函数Listinsert_discretion () f)有序插入函数Listinsert_order g)删除数据函数Listdelete() 2.明确函数的功能; a)Listcreate() 创建一个可控长度的斐波那契数列的双向链表。 b)Listprint() 将此链表中的数据全部输出。 c)Listlocate() 查找此链表中任意位置元素的值。 d)Listinsert_discretion ()向此链表的某个位置插入一组数据。 e)Listinsert_order() 向数列中插入一个数,使插入后的数列任 然有序 f)Listdelete() 将此链表的某个位置的一组数据删除。

四、程序设计 1.函数前包含的头文件名、结点类型定义、全局变量和函数声明 #include #include typedef struct number //定义结构体 { struct number *prior; int num; struct number *next; }number; number *head; //定义全局变量头节点 int k = 0; //k记录元素个数,防止溢出 /*函数声明*/ void Listcreate(); //建立链表 void Listprint(); //全体输出 void Listlocate(); //查找 void Listinsert_discretion(); //任意位置插入 void Listinsert_order(); //有顺序插入 void Listdelete(); //删除 2.主函数main() void main() { int select; printf("1、输入斐波那契数列的个数\n"); printf("2、全部输出数列\n"); printf("3、查找定位数列的元素\n"); printf("4、添加数列元素\n"); printf("5、插入顺序数列元素\n"); printf("6、删除数列元素\n"); printf("-------------------------------------\n"); while (1) { printf("请选择序号\n"); scanf("%d", &select); switch (select) { case 1: Listcreate(); break; //链表创建 case 2: Listprint(); break; //全链表输出 case 3: Listlocate(); break; //元素查找 case 4: Listinsert_discretion(); break; //任意位置插入

实验三四 链表的实现和应用

江南大学物联网工程学院上机报告
课程名称 班 级 数据结构 上机名称 姓 名 链表的实现和应 用 上机日期 学 号 2016.3.11 上机报告要求 1.上机名称 2.上机要求 3.上机环境 4.程序清单(写明运行结果) 5.上机体会
1.上机名称
链表的实现和应用
2.上机要求
⑴定义线性表的链式存储表示; ⑵基于所设计的存储结构实现线性表的基本操作; ⑶编写一个主程序对所实现的线性表进行测试; ⑷线性表的应用:①设线性表 L1和 L2分别代表集合 A 和 B,试设计算法求 A 和 B 的并集 C,并用线 性表 L3代表集合 C;②设线性表 L1和 L2中的数据元素为整数,且均已按值非递减有序排列,试 设计算法对 L1和 L2进行合并,用线性表 L3保存合并结果,要求 L3中的数据元素也按值非递减 有序排列。 ⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式 相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。
3.上机环境
Visual C++ 6.0
4.程序清单(写明运行结果)
(1) #include #include typedef int datatype; typedef struct node { datatype data; struct node *next; }LinkList; LinkList *CREATLISTF(LinkList *L,int n) { intnum,i; LinkList *head,*s,*r; head=L; r=head; head->next=NULL;

用单链表实现集合的操作

《数据结构》课设计报告 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:

《数据结构》实验报告

《数据结构》实验报告 实验序号:4 实验项目名称:栈的操作

附源程序清单: 1. #include #define MaxSize 100 using namespace std; typedef int ElemType; typedef struct { ElemType data[MaxSize]; int top; }SqStack; void InitStack(SqStack *st) //初始化栈 { st->top=-1; } int StackEmpty(SqStack *st) //判断栈为空{ return (st->top==-1); } bool Push(SqStack *st,ElemType x) //元素进栈{ if(st->top==MaxSize-1)

{ return false; } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } return true; } bool Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { return false; } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} return true; } //函数名:Pushs //功能:数组入栈 //参数:st栈名,a->数组名,i->数组个数 bool Pushs(SqStack *st,ElemType *a,int i) { int n=0; for(;n数组名,i->数组个数 bool Pops(SqStack *st,ElemType *a,int i) { int n=0; for(;n

链表的合并 实验报告材料

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

目录 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进行直接插入排序的操作和根据用户的意愿可以对链表进行删除的操作。 三.算法流程图

数据结构实验三——双链表的操作 初始化 插入 输出

数据结构实验报告 题目:双链表的操作 班级:

姓名: 学号: 一、实验要求和目的 1.理解双链表的基本操作 2.了解双链表的建立和输出 3.掌握双链表的插入、删除等实现方法 二、实验内容 编写一个程序,实现双链表的各种基本运算(假设双链表的元素类型为char),并在此基础上设计一个程序,完成如下功能: (1)初始化双链表h; (2)采用尾插法依次插入元素a,b,c,d,e; (3)输出双链表h; (4)输出双链表h长度; (5)判断双链表h是否为空; (6)输出双链表h的第3个元素; (7)输出元素a的位置; (8)在第4个位置上插入元素f; (9)输出双链表h; (10)删除h的第3个元素; (11)输出双链表h; (12)释放双链表h。 三、设计思想 本次实验主要考察了多双链表的基本操作,包括初始化链表,插入节点,删除节点,寻找元素的位置,判断链表是否为空,输出链表等。本次实验在逻辑上没有什么难度,首先是构造一个结构体,包括向前的指针和向后的指针,其次是构造函数来实现不同的功能,最后是在主函数中初始化链表,再调用构造函数。 四、主要源代码

#include #include typedef char datatype; typedef struct node { datatype data; struct node *prior; struct node *next; }linklist; void insert(linklist *L, datatype e) //采用尾插法插入元素{ linklist *p,*q; p=L; while(p->next!=NULL) p=p->next; q=(linklist *)malloc(sizeof(linklist)); q->data=e; q->prior=p; p->next=q; q->next=NULL; } void disp(linklist *L) //输出链表数据 { linklist *p; p=L->next; while(p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); } void length(linklist *L) //输出链表长度 { linklist *p; p=L; int i=0; while(p->next!=NULL) {

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

基于单链表实现集合的并交差运算实验报告 一实验题目: 基于单链表实现集合的并交差运算二实验要求: 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 的长度减

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