鍊錶是c/c++中的乙個重要的資料結構
首先,他在物理儲存上是非連續的,跟陣列正好相反,陣列是一系列連續的儲存單元,這樣的特性可能會使鍊錶的訪問時間複雜度o(n)高於陣列o(1),但是對於鍊錶的插入操作可以達到o(1),刪除同理,所以當我們處理資料可能會有大量的插入或者刪除操作時,用鍊錶存放資料就非常適用啦
另外,因為鍊錶在記憶體中是不連續的,所以它可以充分利用記憶體,同時,在記憶體空間足夠的情況下,它的大小也是沒有限制的,鍊錶支援動態增長,而陣列則是需要預先分配記憶體,可能會浪費掉一些記憶體資源(因為可能根本不會用到某些記憶體單元)
所以,其實鍊錶還是相當有用滴 廢話說了一些,開始碼**了
先看一下結構體的構成吧:
struct node
node(int elem_)
};
資料域只有乙個int型別的資料elem,指標域為next,指向下乙個節點; 預設建構函式將elem屬性初始化為0,指向null,建構函式將elem屬性初始化為引數elem_的值,指向的節點同樣為null
首先講一下如何建立鍊錶
方法很簡單,根據你現有的資料,建立新的node節點,然後用next指標把鍊錶和這些節點串聯起來
node *createnodelist();
node *head = new node();
if(head == null)else
return head;
}}
現在開始講一下插入操作,插入操作又分為幾種,一種是煉表頭插入操作,一種是鍊錶尾插入操作,一種是鍊錶中間插入操作,
表頭插入很簡單,直接新建乙個節點,指向當前的頭節點就ok了
node *insertathead(node *head, int elem)else
}
表尾插入,需要將指標移動到列表尾,然後進行插入操作
node *insertattail(node *head, int elem)
temp = new node(elem);
currenthead->next = temp;
return head;
}}
一般插入,這裡模擬的是在乙個有序鍊錶中插入節點,使得插入之後,鍊錶仍然有序,這種插入可能會遇到在表頭插入或者在表尾插入的情況,所以我們要單獨考慮這兩種情況
node *insert(node *head, int elem)elseelse
currenthead = currenthead->next;
}//在表尾插入
if(currenthead->next == null)
return head;
} }}
刪除節點同樣有3個版本,在煉表表頭刪除,在煉表表尾刪除,和在鍊錶中間刪除
首先是在煉表表頭刪除節點,這個操作很簡單,斷開當前表頭和鍊錶的連線即可
node *deleteathead(node *head)
然後是在煉表表尾刪除節點,同樣很容易,只要將鍊錶遍歷一遍,最後斷開尾節點跟前驅節點的連線即可
node *deleteattail(node *head)
//經過while迴圈後,currenthead現在是尾節點,prev是它的前驅節點
prev->next = null;
return head;
}
現在再來說一下通過資料成員匹配的刪除,這種情況下的刪除需要記錄下刪除節點的前驅節點和下乙個節點,然後讓這兩個節點連線起來,過程如下node *deletebyelem(node *head, int elem)else
prev = currenthead;
currenthead = currenthead->next;
} return head;
}}
最後就是稍微複雜一點的鍊錶反轉操作,我的做法是這樣的,每次讓當前表的表頭與剩下節點斷開,然後插入到反轉鍊錶的表頭,這樣就完成了鍊錶的反轉
node *revearsenodelist(node *head)else
return head;
}}
好了,差不多就是這些了,不過最近看到網上很多人對於表頭,表尾是否為空有一些疑問,其實表頭跟表尾為空或者不為空都是可以的,我這裡的實現,表頭,表尾都用來存放資料
上面的**都是經過除錯的,如果有什麼bug希望大家給我指出來,一起學習,一起進步~~
單鏈表 建立插入刪除
建立乙個工程,在其中新增 list.h 標頭檔案,list.cpp原始檔和main.cpp原始檔。標頭檔案list.h中進行資料型別抽象 adt 宣告了乙個結構體和對應的操作,如下 ifndef list h define list h typedef struct list list 函式宣告 l...
單鏈表 建立 插入 刪除 查詢 反轉等操作
ifndef list h define list h include include define notfound null typedef struct list node typedef struct list pnode typedef pnode plist typedef pnode ...
單鏈表的建立 刪除 反轉 插入 排序操作
在初學鍊錶時很多人會問,什麼是鍊錶,鍊錶怎麼實現,原理是什麼?的確帶著問題學習會讓你變得更快,鍊錶可以簡單理解為老師領著幼兒園小朋友過馬路,他們手拉手牽著一起,老師在最前面領著後面的小朋友,老師就是這個領頭人 鍊錶的頭節點 每乙個小朋友可以看做乙個節點。鍊錶的節點結構定義 typedef struc...