6数据结构实验报告JAVA-链表
- 格式:pdf
- 大小:120.61 KB
- 文档页数:4
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。
实验报告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) 程序要添加适当的注释,程序的书写要采用缩进格式。
实验报告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;}}。
实验链表实验报告一、实验目的本次实验的主要目的是深入理解链表这种数据结构的概念、特点和操作方法,并通过实际编程实现来提高对链表的应用能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
与数组不同,链表的内存分配是动态的,并且可以方便地进行插入和删除操作,而不需要移动大量的元素。
链表分为单向链表、双向链表和循环链表等多种类型。
在本次实验中,我们主要实现单向链表。
单向链表的节点结构通常包含数据域和指针域。
数据域用于存储节点的数据,指针域用于指向下一个节点。
通过遍历链表的指针,可以访问链表中的每个节点。
四、实验内容1、链表节点的定义```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```2、链表的创建```cppListNode createList(){ListNode head = NULL;ListNode tail = NULL;int num;cout <<"请输入链表中的数字(输入-1 结束):";cin >> num;while (num!=-1) {ListNode newNode = new ListNode(num);if (head == NULL) {head = newNode;tail = newNode;} else {tail>next = newNode;tail = newNode;}cin >> num;}return head;}```3、链表的遍历```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {cout << curr>data <<"";curr = curr>next;}cout << endl;}```4、链表的插入```cppvoid insertNode(ListNode& head, int position, int value) {ListNode newNode = new ListNode(value);if (position == 0) {newNode>next = head;head = newNode;return;}ListNode curr = head;int count = 0;while (curr!= NULL && count < position 1) {curr = curr>next;count++;}if (curr == NULL) {cout <<"插入位置超出链表长度" << endl; return;}newNode>next = curr>next;curr>next = newNode;}```5、链表的删除```cppvoid deleteNode(ListNode& head, int position) {if (head == NULL) {cout <<"链表为空,无法删除" << endl; return;}if (position == 0) {ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;ListNode prev = NULL;int count = 0;while (curr!= NULL && count < position) {prev = curr;curr = curr>next;count++;}if (curr == NULL) {cout <<"删除位置超出链表长度" << endl; return;}prev>next = curr>next;delete curr;}```五、实验结果通过对上述链表操作函数的调用,我们成功地创建、遍历、插入和删除了链表中的节点。