鍊錶屬於線性表資料結構中的一種,線性表分為順序表和煉表,順序表可以理解為陣列。
按正常方式定義乙個陣列時,計算機會從記憶體取出一塊連續的位址來存放給定長度的陣列;而鍊錶則是由若干個結點所組成,(每個結點代表乙個元素),且結點在記憶體中的儲存位置通常是不連續的。
那麼鍊錶比陣列方便在**呢?
比如我們要在乙個序列中新增某乙個元素,這時候使用陣列就比較麻煩了,他需要將需要插入的位置後面的乙個元素全部向後移動(注意從最後乙個元素開始向右移動)比較麻煩,而鍊錶則可以直接連線即可。畫圖理解一下:
如果用陣列操作:
我麼可以看見需要將陣列移動位置,並且麻煩,如果陣列比較大,時間效率就比較低。
鍊錶只要先將原來的斷開在連線即可。
通常我們使用結構體實現鍊錶,鍊錶包括資料域和指標域,這裡只介紹單鏈表不介紹迴圈鍊錶。
我們只需要將每次這個結點的指標域指向下乙個結點即可將他們連線起來。
struct node
;
#include
#include
using
namespace std;
struct node
;int a[5]
;node*
create
(int a)
return head;
}int
main()
node *l =
create
(a);
l = l -
> next;
//指向第乙個鍊錶元素
while
(l !=
null
)return0;
}
其實鍊錶插入比較簡單,我們首先迴圈鍊錶,當找到插入位置的前乙個數時,我們就返回下標,然後我們就將該元素插入到這個位置上結點的下乙個即可。這裡需要注意的是我們不能直接先讓這個位置的指標域指向我們要插入的結點,因為這樣後面的元素將群龍無首,我們應該讓插入結點先指向所插入位置的結點的next。
可能很多人會疑惑,將元素插入到位置三是插在這個位置之前還是這個位置之後,比如序列5->3->6->1->2,插入9到3位置,得到的序列為5->3->9->6->1->2.其實應該是把原先的第三個位置開始的元素讓出來給需要插入的數。
具體實現code
//pos代表插入位置,x為插入元素
void
insert
(node* head,
int pos,
int x)
node *q =
new node;
q -> data = x;
q -> next = p -
> next;
//先將插入元素指向原來在該位置的結點
p -> next = q;
}
刪除操作大概就這幾個步驟;
a.由指標變數p列舉所有結點,另乙個指標變數pre表示p指向結點的前驅結點。
b.當p所指向的資料域為x,進行下面兩項操作.
i.令pre的指標域next指向p所指向的下乙個next結點。
ii.釋放p所指結點的記憶體空間.
iii.令p指向pre所指結點的下乙個結點。
void
del(node* head,
int x)
else}}
``# 5.查詢鍊錶中某乙個元素
我們可以設定乙個計數器,然後線性掃一遍鍊錶,如果存在元素與x相等,計數器++,然後最後返回計數器的值即可,為0說明不存在,為1則說明存在。
```cpp
intsearch
(node* head,
int x)
p = p -
> next;
//指標移向下乙個結點
}return cnt;
}
#include
#include
using
namespace std;
struct node
;int a[5]
;node*
create
(int a)
return head;
}//pos代表插入位置,x為插入元素
void
insert
(node* head,
int pos,
int x)
node *q =
new node;
q -> data = x;
q -> next = p -
> next;
//先將插入元素指向原來在該位置的結點
p -> next = q;
}void
del(node* head,
int x)
else}}
intsearch
(node* head,
int x)
p = p -
> next;
//指標移向下乙個結點
}return cnt;
}int
main()
node *l =
create
(a);
node *in = l;
//插入操作頭指標
node *de = l;
//刪除操作頭指標
node *fi = l;
//查詢操作頭指標
printf
("遍歷鍊錶\n");
l = l -
> next;
//指向第乙個鍊錶元素
while
(l !=
null
)printf
("\n");
printf
("進行插入操作\n");
insert
(in,3,
89); in = in -
> next;
//指向第乙個鍊錶元素
while
(in !=
null
)printf
("\n");
printf
("進行刪除操作\n");
del(de,5)
; de = de -
> next;
//指向第乙個鍊錶元素
while
(de !=
null
)printf
("\n");
int x;
scanf
("%d"
,&x);if
(search
(fi, x)
)else
return0;
}
簡單介紹了一下鍊錶的基本操 資料結構 順序表 鍊錶 基本操作
ifndef slist h define slist h include include include typedef int sltdatatype typedef struct slistnode slistnode typedef struct slist slist void slist...
c資料結構 鍊錶基本操作
鍊錶是一種線性結構,和順序表相比,鍊錶能充分利用磁碟上的空間,在對鍊錶進行插入刪除操作時,時間複雜度為o 1 相對於順序表,插入刪除時間複雜度為o n 但鍊錶需要額外的儲存指標的空間,且鍊錶不能隨機訪問。所以使用鍊錶還是使用順序表需要根據具體的使用場景。當多為查詢操作時使用順序表比較好,當刪除增加操...
資料結構之鍊錶基本操作
涉及到單鏈表的基本操作有如下 int initlist linklist 初始化乙個單鏈表,具有頭指標,頭結點,頭結點 next null int createlisthead linklist int n 頭插法建立乙個鍊錶,鍊錶長度為n int createlisttail linklist i...