1. 程式人生 > >【資料結構】迴圈連結串列和非迴圈單鏈表的區別

【資料結構】迴圈連結串列和非迴圈單鏈表的區別

注意:這裡的迴圈連結串列是以尾指標為起始。

非迴圈單鏈表判斷結束的標誌為指標為空。而迴圈連結串列判斷結束的標誌是指標不是頭節點。

在插入操作中,非迴圈單鏈表判斷迴圈結束是指標為空。若迴圈結束後,發現指標變為空,說明要求插入的位置不合理:位置大於Length+1。

bool  insert(LinkList *L, int target, int data)
{
	if (target < 1)
	{
		cout << "insert erro" << endl;
		return false;
	}
	else
	{
		int now = 1;
		LinkList p = *L;

		while (now < target&&p != NULL)
		{
			now++;
			p = p->next;
		}
		if (p == NULL)
		{
			cout << "insert erro" << endl;
			return false;
		}

		LinkList s = (LinkList)malloc(sizeof(Node));
		s->data = data;
		s->next = p->next;
		p->next = s;

		return true;

	}



	return true;
}

帶有尾指標的迴圈連結串列:由於判斷連結串列空的條件指標等於頭指標。如果用非迴圈連結串列的迴圈條件,會導致錯誤:假設使用單鏈表的方法插入,初始時候連結串列空,要插入第一個節點時,因為連結串列空和位置就是為1,的原因,迴圈結束。又進行了是否為空的判斷,空就提示錯誤。此時,由於連結串列是空的,指標指向頭指標,而判斷空的條件為指標指向頭指標即為空,所以不允許插入操作。這個是有問題的。

於是我們做出了改進:指標的下一位指標指向頭指標或者j==目標地址就結束迴圈。但是迴圈以後的判斷條件改為了如果j!=目標地址。

原因如下:此時,迴圈因為指標的下一位是頭指標而結束迴圈的情況只有4種

1.表空,目標地址為1,此時j為1

2.表空,目標地址大於1,此時j為1

3.目標地址為Length+1,此時j==length+1

4.目標地址大於Length+1,此時j==length+1

其中合理的情況為1和3。所以當j!=location時,不合理。

bool insert(LinkList *L, int location, int data)
{
	//位置問題
	if (location < 1)
	{
		cout << "erro" << endl;
		return false;
	}

	LinkList p = *L;
	int j = 1;
	p = p->next;//指向頭指標


	//注意與非迴圈連結串列的判斷區別
	while (p->next!= (*L)->next&&j < location)
	{
		p = p->next;
		j++;
	}

	//位置大於實際長度
	//迴圈連結串列的時候,當p所指的連結串列為空,是可以插入的。
	//但是非迴圈連結串列,當p所指的地址為空,不可以插入。
	if (j!=location)
	{
		cout << "erro" << endl;
		return false;
	}

	LinkList temp = p->next;
	LinkList s = (LinkList)malloc(sizeof(Node));
	s->data = data;
	p->next = s;
	s->next = temp;
	if (p == *L)
	{
		*L = s;
	}
}

相關推薦

資料結構迴圈連結串列迴圈單鏈區別

注意:這裡的迴圈連結串列是以尾指標為起始。非迴圈單鏈表判斷結束的標誌為指標為空。而迴圈連結串列判斷結束的標誌是指標不是頭節點。在插入操作中,非迴圈單鏈表判斷迴圈結束是指標為空。若迴圈結束後,發現指標變為空,說明要求插入的位置不合理:位置大於Length+1。bool ins

資料結構--1.連結串列的基本操作雜湊定義

C實現連結串列的基本操作 初始化 插入 刪除  雜湊表的定義  //連結串列的基本操作 初始化 插入 刪除 雜湊表的定義 #include<iostream> using namespace std; typedef struct Node { int

資料結構環形連結串列

給定一個連結串列,判斷連結串列中是否有環。 思路分析: 判斷連結串列是否帶環,實際上歸屬於快慢指標問題,快指標先進環,慢指標後進環,然後快指標和慢指標最終會在環裡面相遇,如果不會相遇,則表示不是迴圈連結串列,也就是說到頭了,即不帶環。 具體程式碼如下: /**

資料結構雙向連結串列的實現

文章目錄 LinkList.h LinkLish.c LinkList.h #ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include <stdio.h>

資料結構複雜連結串列的複製

複雜連結串列的結構體 typedef struct ComplexNode { int data; struct ComplexNode *next; struct ComplexNode *r

資料結構靜態連結串列

資料結構之靜態連結串列實現 前言 靜態連結串列,是一種巧妙的資料結構實現方式。 靜態連結串列:         每個節點有一個資料域(data),用來存放有用的資料資訊;         還有一個下標域(cur),用來指示下一個元素的下標位置。 我們都知道鏈式線性表的

資料結構跳躍連結串列(Skip list)

普通的連結串列存在一個嚴重的缺陷: 需要順序掃描才能找到所需要的元素。而且查詢從連結串列的開頭開始,只有找到了所需要的元素,或者直到連結串列的末尾都沒有找到這個元素時才會停下來。將量表進行排序可以加速查詢的過程,但是仍然需要順序查詢。因此,很容易想到,連結串列最好可以跳過某

資料結構連結串列實現多項式運算

一元多項式的運算包括加法減法和乘法,而多項式的加法和乘法都可以依靠多項式的加法來實現,所以本文僅僅講解如何用連結串列實現一元多項式的加法。 數學上的一元多項式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … +

C/C++資料結構雙向連結串列操作

目錄 標頭檔案定義 測試檔案 雙向連結串列操作 像雙向連結串列的求長,判空,遍歷,查詢,檢索,之類的操作都和單鏈表一樣的。不過我還是在了文中。 標頭檔案定義 #ifndef _DOUBLELINKLIST_H_ #def

php實現資料結構單向連結串列

什麼是單向連結串列 連結串列是以鏈式儲存資料的結構,其不需要連續的儲存空間,連結串列中的資料以節點來表示,每個節點由元素(儲存資料)和指標(指向後繼節點)組成。 單向連結串列(也叫單鏈表)是連結串列中最簡單的一種形式,每個節點只包含一個元素和一個指標。它有一個表頭,並且除了最後一個節點外,所有節點都有其後

資料結構時間複雜度空間複雜度

衡量一個演算法的複雜度: 即演算法的時間複雜度和空間複雜度統稱為演算法的時間複雜度。 時間複雜度 計算一下下面程式的迴圈語句總共會執行多少次? void Test(int n) { int iConut = 0; for (int i = 0; i &l

資料結構--幾道棧佇列面試題

用兩個棧實現一個佇列 1、思路分析 拿到這道題,會有以下幾種思路: 思路一: 入隊時,將所有的元素壓入到s1中 出隊時,將s1中的所有元素倒入到s2中,然後讓s2中棧頂的元素出棧,然後將s2中所有的元素倒入到s1中 問題所在:我們不難發現,在這種解法

資料結構-時間複雜度空間複雜度

  在閱讀這篇文章之前,建議大家先對 【資料結構】-巨集觀認識進行閱讀,對資料結構有一個巨集觀的瞭解。我們使用時間複雜度和空間複雜度對演算法進行分析。 時間複雜度   演算法包含的計算量。   大O

C語言動態連結串列靜態連結串列的建立

動態連結串列和靜態連結串列 #include<stdio.h> #include<stdlib.h> #include<malloc.h> struct wep{

資料結構JavaScript——雙向連結串列、雙向迴圈連結串列

關於連結串列簡介、單鏈表、單向迴圈連結串列、JS中的使用以及擴充方法:  單鏈表、迴圈連結串列的JS實現 雙向連結串列:單向連結串列只能向著一個方向遍歷連結串列節點,而在節點指標域中增加了前向指標的雙向連結串列,則可以向著兩個方向遍歷節點。這使得雙向連結串列也可以在任何

資料結構分桶法平方分割

分桶法是把一排物品或者平面分成桶,每個桶分別維護自己內部的資訊,以達到高效計算的目的的方法,感覺就像分封制,國家太大了,中央政府管不下來,就分封了很多的小封國,這樣叫封國再管理自己,我們只需要管理封國就行了。 其中,平方分割是把排成一排的n個元素每根號n個分在

資料結構線性的鏈式儲存(二)迴圈連結串列

線性錶鏈式儲存的迴圈單鏈表 迴圈連結串列從任意一點出發,可以訪問全部節點。 一般為了便於操作,將連結串列的頭指標變為尾指標,指向尾節點,連結串列的頭節點則為尾指標的next。 程式碼收穫 用尾指標進行操作雖然省下迴圈,但是插入刪除等操作都需要移動尾指標導致

資料結構單鏈(無頭單向迴圈連結串列)各個介面的實現

順序表存在的問題: 中間/頭部的插入刪除,時間複雜度為O(N) 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗 增容一般是呈2倍的增長,勢必會有一定的空間浪費。 例如當前容量為100,滿了以後增容到200,如果再繼續插入了5個數據,後面沒有資料插入了,

資料結構雙向帶頭結點迴圈連結串列

在之前我們寫了不帶頭結點的單鏈表,但它在資料操作時也有繁瑣之處,而雙向帶頭結點迴圈連結串列則優化了單鏈表的操作,使連結串列更加方便。雙向帶頭結點迴圈連結串列在單鏈表的基礎上增加了以下幾點: (1)在資料結構上附加一個域,使它存放指向前一個結點的指標; (2)增加了一個頭結點,前驅指向連結串列

資料結構單向迴圈連結串列

寫的中間發現一個問題,我試了一下,final修飾的引用是指該引用只能指向一個物件不能更改指向其他物件,但是該引用調該物件的方法進行內部資訊修改是OK的 package 連結串列.迴圈連結串列; import java.util.NoSuchElement