先說一些設計鍊錶的一些規則和細節:
typedef unsigned cnttype;
typedef char datatype;
1)對於鍊錶應當使用乙個頭節點:既不使用資料域的節點如:
typedef struct nodenode;
也許有人會說這樣會浪費資料空間,但是這樣會簡化演算法相應的也就節省了
**段的空間了。。
例如對於乙個沒有頭節點的鍊錶:
(以下兩例均是採用尾插法)
/*建立乙個鍊錶:採用尾插法*/
而對於使用頭結點的鍊錶接可以節省演算法設計**:
再比如在乙個鍊錶中找到乙個data值為x的節點並刪除之
有頭結點的:
而沒有頭結點的則這樣設計演算法:
2)對於雙鏈表:
typedef struct nodenode;
node *head; /*指向首節點*/
node *tail; /*指向尾節點*/
應當有head->prev == tail-> next == null;
而不是head->prev == head;
tail->next == tail;
因此:初始化時先建立乙個首節點 node *head
head = (node *)calloc(1, sizeof(node));
首節點初始化:
head->prev = head->next = null;
而不是:
head->prev = head->next = head; /*linux核心是這樣做的,讀者可以按情況考慮*/
鍊錶的一些操作
判斷兩個鍊錶是否有交點 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點 假設兩個鍊錶都不存在環 相交的煉表示意圖如下所示。兩個沒有環的鍊錶如果是相交於某一結點,如上圖所示,這個結點後面都是共有的。所以如果兩個鍊錶相交,那麼兩個鍊錶的尾結點的位址也是一樣的。程式實現時分別遍歷兩個單鏈表,直到尾結...
鍊錶和順序表的一些區別
順序表與鍊錶是非常基本的資料結構,它們可以被統稱為線性表。線性表 linear list 是由 n n 0 個資料元素 結點 a 0 a 1 a 2 a n 1 組成的有限序列。順序表和煉表,是線性表的不同儲存結構。它們各自有不同的特點和適用範圍。針對它們各自的缺點,也有很多改進的措施。順序表一般表...
鍊錶的一些基本操作
include include typedef struct list elem,pelem typedef struct real list,plist void initialize plist mylist 初始化 int creat plist mylist1 建立鍊錶 else print...