在順序表中想要插入或刪除乙個元素,需要移動大量的元素,這樣會嚴重影響演算法的效率。為了解決這個問題,我們引入了線性表的鏈式儲存結構,即鍊錶。
鍊錶有單向鍊錶,雙向鍊錶,迴圈鍊錶三種,由於雙向鍊錶和迴圈鍊錶經過細微的改變而成的,這裡我們就主要來講解單鏈表。
鏈式儲存結構是用一組不一定是連續的記憶體儲存空間來儲存表內的元素,這組記憶體空間可以是連續的,也可以是非連續的。因為他的記憶體空間並非連續,所以我們不能用索引的方式來訪問表內的元素。這時我們的元素內就不能只寫元素的內容,還應該寫入下乙個元素的位址。
在鏈式儲存結構中,我們把每個元素稱為節點,存放元素的內容的地方叫做資料域 data ,存放下個節點位址的地方叫做指標域next,由於在鍊錶中每個節點的位址放在了上乙個節點的指標域,為了找到第乙個節點,我們引入了頭節點,頭結點中資料域為空,指標域內存放第乙個元素的位址。
單鏈表示意圖:
下面我來講解一下單鏈表的建立方法。
想要建立乙個鍊錶,必須先構造出乙個節點來(下面我都以鍊錶中存放的整形為例,但鍊錶放什麼都是可以的,資料域是結構體型別也是可以的):
typedef structnode
char name[20] ;
struct node *next;
}listnode ,*linklist;
這樣就是乙個節點型別,資料域為name陣列,指標域為指向節點型別的指標。想要建立乙個鍊錶,必須先建立乙個頭結點:
linklistcreathead()
linklist head;
head =(linklist)malloc(sizeof(listnode));
head ->next;
return head;
用這個函式就可以來建立乙個頭節點,也就是乙個空的鍊錶,鍊錶如何新增節點呢?
新增分為兩種,一種是在兩頭新增,一種是在中間新增。要新增乙個元素時,我們需要將要新增位置的上乙個節點的next指向這個節點,而這個節點的next指向原來上個節點所指向的節點。具體方法如下:
voidaddnode(linklist head , int data , int i)
linklist p , s;
int j = 0 ;
p = head ;
while(p != null&& jp= p->next;
j++;
if(j != i-1 || p == null)
printf("輸入的資料有誤!");
else
s= (linklist)malloc(sizeof(listnode));
s->data= data;
s->next = p ->next;
p->next= s;
這個函式既可以新增兩頭,也可以新增中間的節點。
我們在來講一下刪除。
voiddelnode(linklist head,int i)
linklist p , s;
int j = 0;
p = head;
while(p->next != null &&jp= p->next;
j++;
if(j != i-1||p->next == null)
printf("輸入的資料有誤!");
else
s= p->next;
p->next= s->next;
free(s);
這些演算法的實現思路並不難,只要掌握好鍊錶的圖示結構,這些演算法還是很容易寫出的。
下面我在說一下節點的查詢。
節點的查詢一共有兩種方式,一種是根據序號來查詢,一種是根據值來查詢。
根據序號來查詢的演算法如下:
linklistselnodeone(linklist head , int i)
linklist p , s;
int j = 0;
p =head;
while(p->next != null &&jp= p->next;
j++;
if(j != i-1||p->next == null)
returnnull;
else
returnp->next;
還有一種是根據值的方式來查詢的,具體演算法如下:
linklistselnodetwo(linklist head,int i)
linklist p = head->next;
while(p->next != null &&p->data!=i)
p= p->next;
if(p->data == i)
returnp;
else
returnnull;
以上就是關於單鏈表的具體實現,關於迴圈鍊錶就是讓最後乙個節點的指標域存放頭結點的位址,雙向鍊錶就是在單鏈表的基礎上再新增乙個指標域,用來指向上乙個節點。具體實現只是在單鏈表的基礎上進行了一些改動,在這裡我就不寫了。
初學者學Java 三
任何程式語言只要有三種流程控制結構就可以描述任何問題了,這三種流程控制結構分別是 順序結構,選擇結構和迴圈結構。順序結構就是按照邏輯結構的順序一句句往下寫,這裡就不做過多的介紹了。主要說說選擇結構和迴圈結構。1.選擇結構的第一種形式 if 布林表示式 如果執行語句只有一條,可以省略,但最好寫上,增加...
初學者談初學者學html
這是乙個段落。解釋一下就是 html 與 html 之間的文字是描述網頁。head 與 head 之間的文字是文件的元資料。title 與 之間的文字是文件的標題。body 與 body 之間的文字是可見的頁面內容,是文章的主體部分。h1 與 h1 之間的文字被顯示為乙個大標題。p 與 p 之間的文...
初學者學Java(十五)
在這一篇中我們來講一下關於陣列的排序和查詢的方法。說到陣列的排序,就不得不說冒泡這種經典的方法。氣泡排序的基本思想是比較兩個相鄰元素的值,如果滿足條件就交換元素的值 如果是公升序,就將較大的值放在索引大的引用內,較小的值放在索引小的引用內 降序的話反之 這樣一次迴圈後最大或最小的值就會轉移到陣列的最...