【資料結構】迴圈連結串列和非迴圈單鏈表的區別
注意:這裡的迴圈連結串列是以尾指標為起始。
非迴圈單鏈表判斷結束的標誌為指標為空。而迴圈連結串列判斷結束的標誌是指標不是頭節點。
在插入操作中,非迴圈單鏈表判斷迴圈結束是指標為空。若迴圈結束後,發現指標變為空,說明要求插入的位置不合理:位置大於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