1. 程式人生 > >資料結構實驗報告單鏈表的基本操作

資料結構實驗報告單鏈表的基本操作

一.知識點

單鏈表:

部分成員方法:
建構函式、getsetaddremovegetSizecontainsmerge
最基本的動作:

從左到右移動指標p=p.next

帶頭節點的單鏈表類

public class SheadLinkedList<AnyType extends Comparable<?super AnyType>>{

       private int theSize;  //表的大小

       private Node<AnyType> headNode;  //頭節點      

       ……成員方法

}

add

1、idx=0

1、重新修改操作

2、idx=theSize-1

2、OK

3、空表

3、重新修改操作

remove

1、空表無法進行刪除操作

2、idx=0

3、表中只有一個元素

4、idx=theSize-1


二.錯誤

錯誤1

public void add(int idx,AnyType x){
Node<AnyType> newNode=new Node<AnyType>(x);
if(headNode==null||idx==0){
newNode.next=headNode;
headNode=newNode;
theSize++;
}
else{
Node<AnyType> p=getNode(idx-1);//如果此處寫成idx就會把第一個元素弄成null


newNode.next=p.next;
p.next=newNode;
theSize++;
}
}

錯誤2單鏈表中的最小元素移到最前面

public boolean move(){
if(headNode==null) 
return false;
Node<AnyType> p=headNode;
AnyType x=p.data;
for(int i=0;i<theSize;i++){
if(getNode(i).data.compareTo(headNode.data)<0){
AnyType val=headNode.data;
headNode.data=getNode(i).data;
getNode(i).data=val;*


//getNode(i+1).data=x;錯誤

                                val=getNode(i).data;錯誤*
p=p.next;
}
}
return true;
}

三.實現操作

1、定義單鏈表型別並動態建立單鏈表;

2、實現單鏈表的取元素操作、插入操作和刪除操作;

3、實現輸出單鏈表中各元素值的操作;

4、將單鏈表中的最小元素移到最前面。

四.實驗程式碼

package exp1;
import java.util.Scanner;
class   Node<AnyType>{
	AnyType data;
	Node<AnyType> next;
	public Node(){
		this.data=null;
		this.next=null;
	}
	public Node(AnyType d){
		this.data=d;
		this.next=null;
	}
public Node(AnyType d,Node<AnyType> n){
	this.data=d;
	this.next=n;
}
}
public class MyLinkedList<AnyType extends Comparable<?super AnyType>>{
	private static int theSize;
	private Node<AnyType> headNode;
	public MyLinkedList(){
		Node<AnyType> p=new Node<AnyType>();
		p.next=null;
		headNode=p;
		theSize=0;
	}
	//取元素
	public AnyType get(int idx){
		return getNode(idx).data;
	}
	private Node<AnyType> getNode(int idx){
		if(idx<0||idx>(theSize))
                 throw new IndexOutOfBoundsException("getNode index: " + idx + "; size: " + theSize );//丟擲異常
		Node<AnyType> p=headNode;  ;   //指向頭節點
		for(int i=0;i<idx;i++){
			p=p.next;
		}
		return p;
	}
	public boolean add(AnyType x){
		add(theSize,x);
		
		return true;
	}
	public void add(int idx,AnyType x){
		Node<AnyType> newNode=new Node<AnyType>(x);
		if(headNode==null||idx==0){
			newNode.next=headNode;
			headNode=newNode;
			theSize++;
		}
		else{
			Node<AnyType> p=getNode(idx-1);
			newNode.next=p.next;
			p.next=newNode;
			theSize++;
		}
	}
	//刪除
	public boolean remove(AnyType idx){
		if(headNode==null)
			return false;
		else{
		    remove(idx);
		    return true;
		    }
		    
	}
	public void remove(int idx){
		if(headNode.next==null||idx==0){
			Node<AnyType> p=headNode;
			headNode=p.next;
			theSize--;
		}
		else{
			Node<AnyType> p=getNode(idx-1);
			Node<AnyType> q;
			q=p.next;
			p.next=q.next;
			theSize--;	
		}
	}
	//將單鏈表中的最小元素移到最前面
	public boolean move(){
		if(headNode==null) 
			return false;
		Node<AnyType> p=headNode;
		@SuppressWarnings("unused")
		AnyType x=p.data;
		for(int i=0;i<theSize;i++){
			if(getNode(i).data.compareTo(headNode.data)<0){
				AnyType val=headNode.data;
				headNode.data=getNode(i).data;
				getNode(i).data=val;
//				getNode(i+1).data=x;
				p=p.next;
			}
		}
		return true;
	}
	@SuppressWarnings("unchecked")
	public boolean reverse(){
	   if(headNode == null || headNode.next == null){  
			    System.out.println("逆置的單鏈表至少有2個結點");  
			    return false;  
			  }  
			  else{  
			    Node p = headNode.next;  
			    headNode.next = null;  
			    Node q = null;  
			    while(p != null){  
			      q = p;  
			      p = p.next;  
			      q.next = headNode;  
			      headNode = q;  
			    }  
			   System.out.print(q) ;
			    return true;
			  }  
	}
	@SuppressWarnings("static-access")
	public  static void main(String args[]){
		//從鍵盤上依次輸入21、75、30、18、42、56,順序或逆序建立單鏈表,並輸出單鏈表中的各元素值;
		MyLinkedList<Integer> s1=new MyLinkedList <Integer>();
		Scanner sc=new Scanner(System.in);
		System.out.println("請輸入表的大小:");
		int m=sc.nextInt();
		int num =0;
		System.out.println("你所新增的元素為:");
		for(int i=0;i<m;i++){
			 num=sc.nextInt();
			s1.add(num);
			}
		int idx,val;
		System.out.println("請輸入要插入的點的位置和值:");
		idx=sc.nextInt();
		val=sc.nextInt();
		s1.add(idx,val);
		System.out.println("連結串列的順序是:");
		for(int i=0;i<s1.theSize;i++)
		{
			System.out.print(s1.get(i)+"    ");
		}
		theSize++;
		System.out.println();
		System.out.println("請輸入要刪除的位置:");
		idx=sc.nextInt();
		System.out.println("連結串列的順序是:");
		s1.remove(idx);
		theSize--;
		for(int i=0;i<s1.theSize;i++)
			{
				System.out.print(s1.get(i)+"    ");
			}
		System.out.println();
		System.out.println("單鏈表中的最小元素移到最前面後:");
	  s1.move();
	  for(int i=0;i<s1.theSize;i++)
		{
			System.out.print(s1.get(i)+"    ");
		}
	  System.out.println();
	  System.out.println("單鏈表長度:"+theSize);
		System.out.println("就地逆置單鏈表後:");
	  s1. reverse();
	  theSize++;
	  for(int i=0;i<s1.theSize;i++)
		{
			System.out.print(s1.get(i)+"    ");
		}
	}
	
}


相關推薦

資料結構實驗報告單鏈基本操作

一.知識點 單鏈表: 部分成員方法:建構函式、get、set、add、remove、getSize、contains、merge最基本的動作: 從左到右移動指標p=p.next 帶頭節點的單鏈表類 public class SheadLinkedList<An

資料結構實驗單鏈學生資訊

#include<iostream> #include<stdlib.h> using namespace std; class Student {private: struct Node {char name[20]; char age[4]; int nu

資料結構之雙鏈基本操作

/*刪除節點時,無須找到要刪除節點的前驅節點,直接對目標節點進行刪除操作。*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#define OK 1#define E

資料結構學習(二)——單鏈操作之頭插法和尾插法建立連結串列

連結串列也是線性表的一種,與順序表不同的是,它在記憶體中不是連續存放的。在C語言中,連結串列是通過指標相關實現的。而單鏈表是連結串列的其中一種,關於單鏈表就是其節點中有資料域和只有一個指向下個節點的指標域。建立單鏈表的方法有兩種,分別是頭插法和尾插法。 所謂頭插法,就是按節

資料結構演算法實現-順序基本操作

資料結構演算法實現 實現了高一凡的<<資料結構>>,書中的程式碼是基於VC6++ c++語言實現的,網上也可以找到TC版的c語言實現的原始碼,TC版的原始碼平臺是 Turbo C 2.0 ,編譯軟體相對較早,因此將採用CodeBlock

C 資料結構單鏈基本操作

C中的typedef C中的typedef關鍵字作用是為一種資料型別定義一個新名字,這樣做的目的有兩個,一是給變數定義一個易記且意義明確的新名字,如: typedef unsigned char BYTE; 把unsigned char型別自命名為BYTE。另一個目的是

資料結構單鏈-----基本操作

刪除指定位置的節點 void Erase(pList * pplist, pNode pos) { assert(pplist != NULL); assert(pos != NULL); if (*pplist == pos)//如果指向第一個節點

C++ 單鏈表基本操作分析與實現 連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結

連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表

資料結構實驗一線性基本操作實現及其應用

一.實驗名稱 線性表的基本操作實現及其應用 二.實驗目的 熟練掌握線性表的結構特點,掌握順序表的基本操作。 學會使用順序表解決實際問題。 三.實驗內容 建立 n 個元素的順序表(n 的大小和表裡資料自己確定),實現相關的操作:輸出,插入,刪

資料結構之連結串列(1):單鏈基本操作

1.前言 1.1宣告 文章中的文字可能存在語法錯誤以及標點錯誤,請諒解; 如果在文章中發現程式碼錯誤或其它問題請告知,感謝! 2.關於連結串列 2.1什麼是連結串列 連結串列可以看成一種在物理儲存單元上的非連續、非順序儲存的資料結構,該資

資料結構(c語言)——線性單鏈基本操作

#include <stdio.h> #include <stdlib.h> typedef int Element; typedef char(*Status)[10]; #define ERROR "error" #define OK "ok"

資料結構與演算法》-單鏈基本操作的C語言實現

最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。 所用教材《資料結構與演算法分析》by Mark Allen Weiss 《資料結構》(C語言

C++資料結構實驗報告:順序實現

一,順序表的作用 線性結構的基本特徵為: 1.集合中必存在唯一的一個“第一元素”2.集合中必存在唯一的一個 “最後元素”3.除最後一個元素之外,均有 唯一的後繼(後件) 4.除第一個元素之外,均有 唯一的前驅(前件) 由n(n≥0)個數據元素(結點)a1,a2,…,an組

資料結構實驗:線性操作(一元多項式的運算)

title: 線性表操作(一元多項式的運算) date: 2018-10-26 11:22:37 tags: 資料結構 categories: 資料結構 線性表操作(一元多項式的運算) 實驗目的 1、定義線性表的鏈式儲存 2、實現對線性表的一些基本操作和具體函式定義

資料結構C++之單鏈插入刪除操作

#include<iostream> using namespace std; typedef struct LNode { int data; struct LNode *next; }LNode; void createListR(LNode *C, in

單鏈基本操作的C語言實現(鏈式儲存結構

#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }

山大資料結構實驗報告

山東大學軟體學院 《資料結構、演算法與應用》實驗指導書   一、實驗要求 採用良好的程式設計風格;關鍵操作要有註釋。 程式能夠執行,顯示執行結果。   二、 開發工具   Microsoft Visual C++ Eclipse ID

資料結構之靜態單鏈

靜態連結串列L儲存 遊標 cur 5 2 3 4 0 6 7 .... 1 資料 data   A

單鏈 基本操作(元素遞增排序)

題目描述: 有一個帶頭節點的單鏈表L(至少有一個數據節點),設計一個演算法使其元素遞增有序排列。 解題思路: 由於單鏈表L中有一個以上的資料節點,首先構造一個只含有頭結點和首節點的有序單鏈表(只含有一個數據節點的單鏈表一定是有序的),然後掃描單鏈表L餘下的節點(由P指向),在有序單鏈表中

單鏈基本操作(刪除連結串列中最大元素)

題目描述: 設計一個演算法,刪除一個單鏈表L中元素值最大的節點(假設這樣的節點唯一) 解題思路: 在單鏈表中刪除一個節點先要找到它的前驅節點,用指標p掃描整個單鏈表,pre指向節點p的前驅節點,在掃描時用maxp指向data域值最大的節點,maxpre指向maxp所指節點的前驅節點,當連