鍊錶節點一般有兩部分組成,即資料域和指標域:
struct node;
一般說來,資料域放節點要儲存的資料,而指標域指向下乙個結點的位址,這樣就會產生從某個結點開始的、由指標連線的一條鏈式結構,即鍊錶。而以鍊錶是否存在頭結點,又可以把鍊錶分為帶頭結點的鍊錶和不帶頭結點的鍊錶。頭結點一般成為head,且其資料域data不存放任何內容,而指標域next指向第乙個資料域有內容的節點(一般直接把這個節點叫做第乙個節點)。事實上,兩種鍊錶的寫法大同小異,因此為了統一起見,本文中的鍊錶均採用帶頭結點的寫法。如下圖所示:
//返回頭結點指標
}int
main()
;int n =
sizeof
(array)
/sizeof
(int);
node*l=
creat
(array, n)
;//新建鍊錶,返回的頭指標head賦值給l
l = l-
>next;
//從第乙個節點開始有資料域
while
(l)return0;
}
輸出結果:如果已經有一條鍊錶,那麼如何查詢其中是否有給定的元素x呢?很簡單,只需從第乙個節點開始,不斷判斷當前節點的資料域是否等於x,如果等於,那麼就給計數器cnt+1,這樣當到達鍊錶結尾時,count的值就是鍊錶中元素x的個數。5 3 6 1 2
//在以head為頭節點的鍊錶上計數元素x的個數
intsearch
(node*head,
int x)
return cnt;
//返回計數器cnt
}
對鍊錶來說,插入元素是指在鍊錶給定位置的地方插入乙個節點。例如在鍊錶5->3->6->1->2的第3個位置插入元素4,就會使鍊錶變為5->3->4->6->1->2。如下圖所示:
通過上圖,可以很容易看出來:
1、元素4所在節點的指標域next指向了元素6所在的節點位址。
2、元素3所在節點的指標域next指向了元素4所在節點的位址。
void
insert
(node*head,
int pos,
int x)
node*temp =
new node;
//新建節點
temp-
>data = x;
//新節點的資料域為x
temp-
>next = p-
>next;
//新節點的下乙個節點指向原先插入位置的節點
p->next = temp;
//前乙個位置的節點指向新節點
}
對鍊錶來說,刪除元素是指刪除鍊錶上所有值為給定的數x。例如刪除鍊錶5->3->6->1->2中的6,就會使鍊錶變為5->3->1->2,如下圖所示:
刪除操作是這樣進行的:
1、由指標變數p列舉節點,另乙個指標變數pre表示p指向節點的前驅節點。
2、當p所指節點的資料域恰好為x時,進行 下面三個操作:
2.1、令pre所指節點的指標域next指向p所指節點的下乙個節點,
2.2、釋放p所指節點的記憶體空間,
2.3、令p指向pre所指節點的下乙個節點
void
del(node*head,
int x)
else
}}
void
reserve
(node *head)
pcur-
>next = pre;
head-
>next = pcur;
}
#include
using
namespace std;
struct node
;node*
creat
(int
*a,int n)
return head;
//返回頭結點指標
}//在以head為頭節點的鍊錶上計數元素x的個數
intsearch
(node*head,
int x)
return cnt;
//返回計數器cnt
}void
display
(node*head)
cout << endl;
}void
insert
(node*head,
int pos,
int x)
node*temp =
new node;
//新建節點
temp-
>data = x;
//新節點的資料域為x
temp-
>next = p-
>next;
//新節點的下乙個節點指向原先插入位置的節點
p->next = temp;
//前乙個位置的節點指向新節點
}//刪除以head為頭結點的鍊錶中所有資料域為x的節點
void
del(node*head,
int x)
else}}
void
reserve
(node *head)
pcur-
>next = pre;
head-
>next = pcur;
}int
main()
;int n =
sizeof
(array)
/sizeof
(int);
node*head =
creat
(array, n)
;//新建鍊錶,返回的頭指標head賦值給l
cout <<
"鍊錶:"
;display
(head)
;//顯示鍊錶
//cout << search(head, 2) << endl; //查詢
insert
(head,3,
4);//在第三個位置插入4
cout <<
"在第三個位置插入4:"
;display
(head)
;insert
(head,3,
5); cout <<
"在第三個位置插入5:"
;display
(head)
;del
(head,3)
; cout <<
"刪除元素3:"
;display
(head)
;reserve
(head)
;//反轉鍊錶
cout <<
"反轉鍊錶:"
;display
(head)
;return0;
}
執行結果:
鍊錶:5 3 6 1 2
在第三個位置插入4:5 3 4 6 1 2
在第三個位置插入5:5 3 5 4 6 1 2
刪除元素3:5 5 4 6 1 2
反轉鍊錶:2 1 6 4 5 5
請按任意鍵繼續. . .
筆記 資料結構與演算法 單向鍊錶
要實現兩個部分 結點物件 鍊錶物件 假設需求 這裡的頭節點,有點像第乙個元素的佔位符 defis empty self return self.head none deflength self cur self.head count 0while cur none count 1 cur cur.n...
考研筆記 資料結構之鍊錶
線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素。這組儲存單元可以是連續的,也可以是不連續的 線性表的鏈式儲存是一種非隨機儲存結構,但是方便插入和刪除。單鏈表的每個結點中只包含乙個指標域,指向下乙個結點。typedef struct slnode node,linklist 構造...
學習筆記 資料結構(三)核心鍊錶
linux核心鍊錶在 usr src linux headers include linux list.h中可以看到,其中 為核心版本號。我們可以採用核心鍊錶的方式實現我們自己的資料結構。核心鍊錶節點定義的結構體中只包含了指標域,struct list head 那麼資料放在 呢?實際上核心鍊錶是通...