6数据结构实验报告JAVA-链表
试析用Java实现链表数据结构

Jv aa采用 了单 根式 的分 级 结 构 ,所 有 对 象都 是 从 根类
O jc统一继承的。在 C + ,可在任何 地方启 动一个新 的继 bet +中 承树 ,所 以往往最后看 到的是 “ 一片森林 ” 。在 Jv ,只会 aa中
) P bi l k o egte t0 { u l n n d enx ci
中存放数据 的地方 。与 C + + 不同 ,Jv aa自动管理栈和堆 ,不需 要程序员 在编程 中实 现。Jv a a的 自动 内存管 理在减 少编程工 作的同时 ,大大减少了运行态错误 。
来说 显得特别重 要 ,比如违 例控制 ,而且也 能在程序 设计 时
获 得 更 大 的 灵 活性 。
}
在c+ + 基础上 的一种极大进步 ,c + + 是需要程序员 自己写析构 函数来 释放 内存 的 ,复杂且 容易忘 记而 导致 内存泄露 。Jv aa
语言对 内存 的分配管理是通过 J M内部机制决 定的 。垃圾 回 V
p bi O jc g tbet0 { u l bet e jc c O rtr b; e noj u
} p bi v i stb O jc o j { u l od e j( bet b) c O
收意 味着在 Jv aa中出现内存漏洞 的情况会少得 多 ,使许多编
程问题 消弥于无形之中。
tioj b; hs b =oj .
J p bi v i ste t( n n d e t { u l od e x 1 k o en x) c n i
2 链 表 的 Jv aa实现
链表是一种重要 的数据结构 ,链表是 由结点 ( oe N d)组 成 的 ,结点包 括两部 分 :数据 域 ( aafe)和指 针域 (on r Dti d l P it e
链表的实验报告

front->next=alist.front->next;
cout<<"复制构造函数"<<endl;
}
//touchafa
template<class T>
linklist<T>::linklist(T a[],int n)
{
front=new Node<T>;
front->next=NULL;
找到要插入的结点的前一个结点新结点的指针域指向p然后p前面的结点指向这个新的结点这样这个新的结点就插入到了链表里面3代码的时间复杂度
数据结构实验报告
1.
2.
2.1
2.2
2.3
算法一:
template<class T>
linklist<T>::linklist(T a[],int n)
{
front=new Node<T>;
T x=q->data;
delete q;
return x;
}
[1]算法功能:删除链表中的某个元素
[2]思想:删除就是先找到要删除的元素的前面的元素,然后前面的这个结点直接指向这个结点的下一个结点,然后再把这个指针删除。
[3]时间复杂度:O(n)
[4]代码逻辑:
1.从第一个结点开始,查找第i-1个元素,设为P指向该结点,如果查找失败则抛出异常
front->next=NULL;
for(int i=n-1;i>=0;i--)
{
Node<T>*s=new Node<T>;
s->data=a[i];
数据结构实验报告之链表(终极版本)

五、 用户使用说明
1、 本程序的运行环境为 Microsofe VC++ 6.0,执行文件为:***.c。 2、 进入界面后只需汇编、建立、执行即可得出结果。
六、测试结果: 1:70 3:75 2:85 4:90 ********************** ********************** ********************** ********************** 8:50 5:60 7:76 6:80 ********************** ********************** ********************** ********************** 8:50 5:60 1:70 3:75 7:76 6:80 2:85 4:90 ********************** ********************** ********************** ********************** ********************** ********************** ********************** ********************** Press any key to continue
} a=a->next; } }
4. 编写函数实现链表 a 和链表 b 的合并:
list *merge(list *a,list *b)
{
list *rt=NULL,*n=NULL,*now=NULL; while (a&&b) { n=(list *)malloc(sizeof(node)); n->next=NULL; if (a->score<=b->score) { n->id=a->id; n->score=a->score; a=a->next; } else { n->id=b->id; n->score=b->score; b=b->next ; } if (!rt) { rt=now=n; } else{ now->next=n; now=n; } } while (a) { n=(list *)malloc(sizeof(node)); n->next=NULL; n->id=a->id; n->score=a->score; now->next=n; now=n; a=a->next ; } while (b) { n=(list *)malloc(sizeof(node));
Java数据结构实验报告

Java数据结构实验报告《Java数据结构实验报告》摘要:本实验报告旨在介绍Java数据结构的相关知识,并通过实验验证其在实际应用中的效果。
通过对Java数据结构的学习和实验,我们可以更好地理解和掌握数据结构在软件开发中的重要性和应用方法。
1. 引言数据结构是计算机科学中的重要概念,它是指一组数据的组织方式和存储结构,是程序设计中最基本的概念之一。
Java作为一种广泛应用的编程语言,具有强大的数据结构支持,包括数组、链表、栈、队列、树等。
本实验报告将重点介绍Java数据结构的使用和实验结果。
2. 实验目的本实验旨在通过实际操作,掌握Java数据结构的基本概念、使用方法和实际应用。
具体包括以下几个方面:- 了解Java数据结构的基本概念和分类;- 掌握Java数据结构的常见操作和实现方法;- 通过实验验证Java数据结构在实际应用中的效果。
3. 实验内容本实验主要包括以下几个方面的内容:- 数组:学习数组的定义、初始化、访问和操作方法,并通过实验验证其效果;- 链表:学习链表的定义、插入、删除和遍历方法,并通过实验验证其效果;- 栈和队列:学习栈和队列的定义、操作方法,并通过实验验证其效果;- 树:学习树的定义、遍历和搜索方法,并通过实验验证其效果。
4. 实验结果通过实验,我们成功地掌握了Java数据结构的基本概念和操作方法,并验证了其在实际应用中的效果。
具体包括以下几个方面的结果:- 数组:我们成功地实现了数组的初始化、访问和操作,并验证了其在存储和检索数据方面的效果;- 链表:我们成功地实现了链表的插入、删除和遍历,并验证了其在数据组织和操作方面的效果;- 栈和队列:我们成功地实现了栈和队列的操作,并验证了其在数据存储和处理方面的效果;- 树:我们成功地实现了树的遍历和搜索,并验证了其在数据组织和检索方面的效果。
5. 结论通过本实验,我们对Java数据结构有了更深入的理解和掌握,了解了其在实际应用中的重要性和作用。
数据结构链表实验报告

实验报告填写说明(实验项目名称、实验项目类型必须与实验教学大纲保持一致)1.实验环境:实验用的软、硬件环境。
2.实验目的:根据实验教学大纲,写出实验的要求和目的。
3.实验原理:简要说明本实验项目所涉及的理论知识。
4.实验方案:这是实验报告极其重要的容。
对于验证性验,要写清楚操作方法,需要经过哪几个步骤来实现其操作。
对于设计性和综合性实验,还应写出设计思路和设计方法。
对于创新性实验,还应注明其创新点。
5.实验过程:写明执行实验方案的实验过程。
6.实验结论:根据实验过程中得到的结果,做出结论。
7.实验小结:本次实验的体会和建议。
8.指导教师评语及成绩:指导教师依据学生的实际报告内容,给出本次实验报告的评价和成绩。
1 实验环境:VC++6.02 实验目的 :掌握单链表的基本操作在链式存储结构上的实现。
3实验原理:(1)#define MAXSIZE 5 //链表的最大长度typedef struct{ElemType data;int cur;}component,SLinkList[MAXSIZE];(2)动态分配的物理结构,每个结点值域指向其直接后继结点,指针为数据元素之间逻辑关系的映象。
4实验方案:根据链表的结构编写主函数,调用链表的构造空表算法,查找算法,插入算法以及删除算法,验证算法的正确性。
5实验过程:(1).编写算法以及主函数(2).编译运行出错,查找错误(3).改正错误,重新编译运行,没有错误(4).输入测试数据,验证结果,得出结论(5).保存结果,写入实验报告中6实验结论附录1:源程序。
数据结构顺序表链表试验报告

数据结构顺序表链表试验报告数据结构试验报告一、引言数据结构是计算机科学中非常重要的一个概念,它用于组织和存储数据,以便能够高效地进行检索和操作。
顺序表和链表是两种常见的数据结构,它们在实际应用中都有各自的优势和局限性。
本报告将对顺序表和链表进行试验比较,以评估它们在不同场景下的性能和适合性。
二、实验目的本次试验的目的是比较顺序表和链表在插入、删除和查找操作上的性能差异,并分析其时间复杂度和空间复杂度。
通过实验结果,可以对不同场景下选择合适的数据结构提供参考。
三、实验内容1. 顺序表实验a. 创建一个包含100个元素的顺序表;b. 在表尾插入一个元素;c. 在表头插入一个元素;d. 在表的中间位置插入一个元素;e. 删除表尾的一个元素;f. 删除表头的一个元素;g. 删除表的中间位置的一个元素;h. 查找一个元素;i. 遍历整个顺序表。
2. 链表实验a. 创建一个包含100个节点的链表;b. 在链表尾部插入一个节点;c. 在链表头部插入一个节点;d. 在链表的中间位置插入一个节点;e. 删除链表尾部的一个节点;f. 删除链表头部的一个节点;g. 删除链表的中间位置的一个节点;h. 查找一个节点;i. 遍历整个链表。
四、实验结果与分析1. 顺序表实验结果a. 在表尾插入一个元素的平均时间为0.1ms;b. 在表头插入一个元素的平均时间为0.2ms;c. 在表的中间位置插入一个元素的平均时间为0.5ms;d. 删除表尾的一个元素的平均时间为0.1ms;e. 删除表头的一个元素的平均时间为0.2ms;f. 删除表的中间位置的一个元素的平均时间为0.5ms;g. 查找一个元素的平均时间为1ms;h. 遍历整个顺序表的平均时间为10ms。
2. 链表实验结果a. 在链表尾部插入一个节点的平均时间为0.2ms;b. 在链表头部插入一个节点的平均时间为0.1ms;c. 在链表的中间位置插入一个节点的平均时间为0.5ms;d. 删除链表尾部的一个节点的平均时间为0.2ms;e. 删除链表头部的一个节点的平均时间为0.1ms;f. 删除链表的中间位置的一个节点的平均时间为0.5ms;g. 查找一个节点的平均时间为2ms;h. 遍历整个链表的平均时间为5ms。
基于java数据结构实验 链表实验报告

实验报告PersonNode cur=head.next;while(cur!=null) {length++;cur=cur.next;}return length;}2 双向链表的实现3 public static void reverselist(PersonNode head) {if(head.next==null||head.next.next==null)//表为空或者只有一个节点return;PersonNode cur=head.next;PersonNode next=null;PersonNode reverseHead=new PersonNode(0, "");while(cur!=null) {next=cur.next;cur.next=reverseHead.next;reverseHead.next=cur;cur=next;}head.next=reverseHead.next;}4运行结果单链表的测试及结果:双链表的测试及结果:附:源程序:package linkedList;public class SingleLinkedListDemo {public static void main(String[] args) {PersonNode person1= new PersonNode(1, "lihua");PersonNode person2= new PersonNode(2, "wangfan");PersonNode person3= new PersonNode(3, "wangxi");PersonNode person4= new PersonNode(3, "xiaohu");SingleLinkedList singlelist = new SingleLinkedList();singlelist.add(person1);// singlelist.add(person2);singlelist.add(person3);// singlelist.add(person4);System.out.println("链表为:");singlelist.list();System.out.println("倒数第2个节点为:");singlelist.daoshu(singlelist.getHead(), 2);singlelist.addbyorder(person2);System.out.println("插入后:");singlelist.list();singlelist.update(person4);System.out.println("修改后:");singlelist.list();singlelist.del(2);System.out.println("删除后:");singlelist.list();System.out.println("单链表的长度为"+SingleLinkedList.getlength(singlelist.getHead()));singlelist.reverselist(singlelist.getHead());System.out.println("反转后:");singlelist.list();// TODO Auto-generated method stub}}class PersonNode{public int no;public String name;public PersonNode next;public PersonNode(int no, String name) {super();this.no = no; = name;}public String toString() {return"PersonNode [no="+no+",name="+name+"]";}}class SingleLinkedList{private PersonNode head = new PersonNode(0,"");public PersonNode getHead() {return head;}public void daoshu(PersonNode head,int k) { if(head.next==null)return;int size=getlength(head);PersonNode temp = head.next;int x=0;while(temp!=null) {x++;if(x==size-k+1) {System.out.println(temp);break;}temp=temp.next;}}public void reverselist(PersonNode head) {if(head.next==null||head.next.next==null)return;PersonNode reversehead = new PersonNode(0, "");PersonNode cur = head.next;PersonNode nextnode = null;while(cur!=null) {nextnode=cur.next;cur.next=reversehead.next;reversehead.next=cur;cur=nextnode;}head.next=reversehead.next;}//插入到队尾public void add(PersonNode personnode) {PersonNode temp = head;//找到队尾while(true) {if(temp.next==null)break;temp=temp.next;}temp.next=personnode;}public void list() {if(head.next==null) {System.out.println("链表为空");return;}PersonNode temp=head.next;while(true) {if(temp==null)break;System.out.println(temp);temp=temp.next;}}public void addbyorder(PersonNode newn) { if(head.next==null) {System.out.println("表为空");return;}PersonNode temp=head.next;boolean flag=false;while(true) {if(temp.next==null) {break;}if(temp.next.no==newn.no) {System.out.println("要插入的节点已存在");break;}if(temp.next.no>newn.no) {flag=true;break;}temp=temp.next;}if(flag) {newn.next=temp.next;temp.next=newn;}}public void update(PersonNode newn) {if(head.next==null) {System.out.println("表为空");return;}PersonNode temp = head.next;boolean flag=false;while(true) {if(temp==null)break;if(temp.no==newn.no) {flag=true;break;}temp=temp.next;}if(flag) {=;}else {System.out.printf("没有找到编号为%d的节点,不能修改"+newn.no);}}public void del(int no) {PersonNode temp = head;boolean flag=false;while(true) {if(temp.next==null)break;if(temp.next.no==no) {flag=true;break;}temp=temp.next;}if(flag) {temp.next=temp.next.next;}else {System.out.printf("要删除的节点%d不存在" +no);}}public static int getlength(PersonNode head) {if(head.next==null)return 0;PersonNode temp=head.next;int length=0;while(temp!=null) {length++;temp=temp.next;}return length;}}。
数据结构实验报告-顺序表链表的实现参考模板

课程名称:数据结构任课教师:实验题目:线性表的基本操作实验环境: Visual C++ 6.0实验目的:1、掌握线性表的定义;2、掌握线性表的基本操作,如建立、查找、插入和删除等。
实验内容:定义一个包含学生信息(学号,姓名,成绩)的的顺表序和链表,使其具有如下功能:(1)根据指定学生个数,逐个输入学生信息;(2)逐个显示学生表中所有学生的相关信息;(3)根据姓名进行查找,返回此学生的学号和成绩;(4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);(5)给定一个学生信息,插入到表中指定的位置;int createStLink(struct Node *head,struct Node *stu){struct Node *p6,*p7,*p8;p7=head;p6=stu;if(head==NULL){head=p6;p6->next=NULL;}else{ //如果链表为空则在头结点创建信息while(p6->num > p7->num && p7->next!=NULL){p8=p7;p7=p7->next;}if(p6->num<=p7->num){if(head==p7)head=p6;elsep8->next=p6;p6->next=p7;}else{p7->next=p6;p6->next=NULL;}}N++;return 1;}int main(){struct Node *H,*stud;char M;int num1;H=initlist();(6)删除指定位置的学生记录;(7) 统计表中学生个数。
实验提示:学生信息的定义:typedef struct {char no[8]; //8位学号char name[20]; //姓名int price; //成绩}Student;顺序表的定义typedef struct {Student *elem; //指向数据元素的基地址int length; //线性表的当前长度}SqList;链表的定义:typedef struct LNode{Student data; //数据域struct LNode *next; //指针域}LNode,*LinkList;实验要求:(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Scanner sc = new Scanner(System.in);// 构造用于输入的对象 for (int x=sc.nextInt(); x!=0; x=sc.nextInt())// 输入 n 个元素的值
⑶ 链表插入操作的基本步骤:先确定要插入的位置,如果插入位置合法,则再生成新 的结点,最后通过修改链将新结点插入到指定的位置上。
⑷ 链表删除操作的基本步骤:先确定要删除的结点位置,如果位置合法,则再通过修 改链使被删结点从链表中“卸下”,最后释放被删结点的空间。 【核心算法描述】
⑴ 用头插法创建带头结点的单链表操作算法
立链表的过程是一个结点“逐个插入” 的过程。先建立一个只含头结点的空单链表,然后 依次生成新结点,再不断地将其插入到链表的头部或尾部,分别称其为“头插法”和“尾插 法”。
⑵ 链表查找操作的基本步骤:因链表是一种"顺序存取"的结构,则要在带头结点的链 表中查找到第 i 个 元素,必须从头结点开始沿着后继指针依次"点数",直到点到第 i 个结 点为止,如果查找成功,则用 e 返回第 i 个元素值。头结点可看成是第 0 个结点。
实验二 链表
一、实验目的
熟练掌握线性表在链式存储结构上的基本操作。
二、实验平台 操作系统:Windows7 或 Windows XP 开发环境:JAVA
三、实验内容及要求
建立单链表,并在单链表上实现插入、删除和查找操作 四、实验的软硬件环境要求
硬件环境要求: PC 机(单机)
使用的软件名称、版本号以及模块: Netbeans 6.5 以上或 Eclipse、MyEclipse 等编程环境下 。
this(data, null); } //带两个参数时的构造函数 public Node(Object data, Node next) {
this.data = data; this.next = next; }
…… }
【核心算法提示】 ⑴ 链表建立操作的基本步骤:链表是一个动态的结构,它不需要予分配空间,因此建
二、源程序及注释
元素值。 (3)删除单链表中第 i 个元素,并输出删除后的单链表中各元素值。 (4)在单链表中查找第 i 个元素,如果查找成功,则显示该元素的值,否则显示该元
素不存在。 2. 实验相关原理: 线性表的链式储结构是用一组任意的存储单元依次存放线性表中的元素,这组存储单元
可以是连续的,也可以是不连续的。为反映出各元素在线性表中的前后逻辑关系,对每个数 据元素来说,除了存储其本身数据值之外,还需增加一个或多个指针域,每个指针域的值称 为指针,又称作链,它用来指示它在线性表中的前驱或后继的存储地址。这两个部分的的一 起组成一个数据元素的存储映像,称为结点,若干个结点链接成链表。如果一个结点中只含 一个指针的链表,则称单链表。单链表中结点类描述如下:
Node s = new Node(x); // 生成新结点 s.setNext(p.getNext());// 插入单链表中 p.setNext(s); }
⑷ 在当前带头结点的单链表上的删除操作算法
void remove(int i) throws Exception { Node p = head;// 初始化 p 为头结点,j 为计数器 int j = -1; while (p.getNext() != null && j < i - 1) {// 寻找 i 个结点的前驱 p = p.getNext(); ++j;// 计数器的值增 1 } if (j > i - 1 || p.getNext() == null) { // i 小于 0 或者大于表长减 1 throw new Exception("删除位置不合理");// 输出异常 } p.setNext(p.getNext().getNext());// 删除结点
五、知识准备 前期要求熟练掌握了 Java 语言的编程规则、方法和单链表的基本操作算法。
六、验证性实验 1.实验要求 编程实现如下功能: (1)根据输入的一系列整数,以 0 标志结束,用头插法建立单链表,并输出单链表中
各元素值,观察输入的内容与输出的内容是否一致。 (2)在单链表的第 i 个元素之前插入一个值为 x 的元素,并输出插入后的单链表中各
throw new Exception("第" + i + "个元素不存在");// 抛出异常 } return p.getData(); // 返回结点 p 的数据域的值 }
⑶ 在当前带头结点的单链表上的插入操作算法
void insert(int i, Object x) throws Exception { Node p = head;// 初始化 p 为头结点,j 为计数器 int j = -1; while (p != null && j < i - 1) {// 寻找 i 个结点的前驱 p = p.getNext(); ++j;// 计数器的值增 1 } if (j > i - 1 || p == null) // i 不合法 throw new Exception("插入位置不合理");// 输出异常
}
【实验报告】
《数据结构与算法》实验报告二
学院:
班级:
学号:
姓名:
日期:
程序名:
一、上机实验的问题和要求:
编程实现如下功能: (1)根据输入的一系列整数,以 0 标志结束,用头插法建立单链表,并输出单链表中 各元素值,观察输入的内容与输出的内容是否一致。 (2)在单链表的第 i 个元素之前插入一个值为 x 的元素,并输出插入后的单链表中各 元素值。 (3)删除单链表中第 i 个元素,并输出删除后的单链表中各元素值。 (4)在单链表中查找第 i 个元素,如果查找成功,则显示该元素的值,否则显示该元 素不存在。
insert(0, x);// 生成新结点,插入到表头 }
⑵ 在当前带头结点的单链表上的查找操作算法
Object get(int i) throws Exception { Node p = head.getNext();// 初始化,p 指向首结点,j 为计数器 int j = 0; while (p != null && j < i) {// 从首结点开始向后查找,直到 p 指向第 i 个结点或 p 为空 p = p.getNext();// 指向后继结点 ++j;// 计数器的值增 1 } if (j > i || p == null) { // i 小于 0 或者大于表长减 1
class Node { private Object data; // 存放结点值 private Node next; // 后继结点的引用 // 无参数时的构造函数 public Node() {
this(null, null); } //带一个参数时的构造函数 public Node(Object data) {