帶頭結(jié)點(diǎn)單鏈表與不帶頭結(jié)點(diǎn)單鏈表的區(qū)別
鏈表作為一種基本數(shù)據(jù)結(jié)構(gòu),常用的鏈表分為帶結(jié)點(diǎn)和不帶頭結(jié)點(diǎn)。從線性表的定義可以知道,線性表允許在任意位置進(jìn)行插入和刪除。所有的鏈表都有一個(gè)頭指針head,帶頭結(jié)點(diǎn)的鏈表中head的數(shù)據(jù)項(xiàng)為空,而不帶頭的鏈表直接在頭結(jié)點(diǎn)存入數(shù)據(jù),那么當(dāng)從頭插入數(shù)據(jù)時(shí),head需要時(shí)刻變化。
接下來具體分析:
1.帶頭結(jié)點(diǎn)的鏈表的插入,使用一個(gè)臨時(shí)變量p等于插入之前的結(jié)點(diǎn)(不管具體插入位置),之后不論要插入的結(jié)點(diǎn)x是插到鏈表頭還是插入到鏈表其他位置都是如下語句:
x->next=p->next; p->next=x;
2.不帶頭結(jié)點(diǎn)的鏈表的插入,若要插入到鏈表的開頭:
x->next=head; head=x; ?//這里不再是head->next=x;
若插到鏈表的其他位置:
p=插入之前的結(jié)點(diǎn) x->next=p->next; p->next=x;
3.帶頭結(jié)點(diǎn)的刪除:
p是刪除結(jié)點(diǎn)之前結(jié)點(diǎn)
x是要?jiǎng)h除結(jié)點(diǎn)
p->next=x->next;
free(x);
同樣不存在刪除位置的差異。
4.不帶頭結(jié)點(diǎn)的刪除:
刪除第一個(gè)結(jié)點(diǎn):head=head->next;這時(shí)需要改變鏈表的頭結(jié)點(diǎn)。
刪除其他結(jié)點(diǎn)時(shí),head的值不會(huì)變。
綜上所述,帶頭結(jié)點(diǎn)的單鏈表,不論刪除和插入的位置如何,不需要修改head的值,不帶頭結(jié)點(diǎn)的單鏈表當(dāng)頭插和頭刪需要修改head的值。所以一般單鏈表一般帶有頭結(jié)點(diǎn)。
下面是其它的補(bǔ)充
下面的代碼中,傳遞鏈表時(shí),傳的是頭指針。如果是帶頭結(jié)點(diǎn)的鏈表,傳遞鏈表時(shí),可以傳頭結(jié)點(diǎn),具體可以看看 C語言實(shí)現(xiàn)-線性表的鏈?zhǔn)酱鎯?chǔ)(單鏈表)
帶頭結(jié)點(diǎn)單鏈表 和 不帶頭結(jié)點(diǎn)單鏈表的區(qū)別:
帶頭結(jié)點(diǎn)單鏈表,在進(jìn)行插入、刪除操作時(shí),不需要改變鏈表頭指針。
不帶頭結(jié)點(diǎn)的單鏈表,在進(jìn)行插入、刪除操作時(shí),可能會(huì)涉及到鏈表頭指針的修改(所以鏈表作為參數(shù)傳遞時(shí),傳遞的是頭指針的引用,具體可看代碼④中head_insert方法中的指針變量帶了&取地址符,而代碼⑤中的沒有。因?yàn)閹ь^結(jié)點(diǎn)單鏈表進(jìn)行頭插操作不需要修改頭指針,而不帶頭結(jié)點(diǎn)的單鏈表進(jìn)行頭插操作時(shí)需要修改頭指針)
具體的代碼也有些許差異,可對(duì)比 代碼④ 和 代碼⑤
帶頭結(jié)點(diǎn)單鏈表 和 不帶頭結(jié)點(diǎn)的init()初始化都修改了頭指針,所以指針變量帶了&取地址符
不帶頭結(jié)點(diǎn)的操作
① ② ③ ④ 四組代碼本質(zhì)是一樣的。只是我本人對(duì)地址、指針、引用、指針變量概念不是很理解,所以才寫了這四組代碼進(jìn)行對(duì)比,方便自己以后復(fù)習(xí)理解。讀者可以跳過① ② ③,直接看④的代碼即可
代碼①
#include <stdio.h>
#include <malloc.h>
typedef struct LNode {
int data;
struct LNode *next;
};
void init(LNode **L) {
*L = NULL;
}
void head_insert(LNode **L, int x) {
LNode *newP = (LNode *)malloc(sizeof(LNode));
newP->data = x;
newP->next = *L;
*L = newP;
}
LNode *get(LNode *L, int k) {
if (k < 1) {
printf("查找位置非法!");
return NULL;
}
int i = 1;
if (L != NULL && i <= k) {
L = L->next;
i++;
}
if (i == k) {
return L;
}
printf("查找位置非法!");
return NULL;
}
void print(LNode *L) {
printf("\n");
while (L) {
printf("%4d ", L->data);
L = L->next;
}
printf("\n");
}
int main() {
LNode *L;
init(&L);
head_insert(&L, 15);
head_insert(&L, 25);
head_insert(&L, 35);
print(L);
printf("\n%4d \n", get(L, 2)->data);
return 0;
}代碼②
#include <stdio.h>
#include <malloc.h>
typedef struct LNode {
int data;
struct LNode *next;
};
void init(LNode *&L) {
L = NULL;
}
void head_insert(LNode *&L, int x) {
LNode *newP = (LNode *)malloc(sizeof(LNode));
newP->data = x;
newP->next = L;
L = newP;
}
LNode *get(LNode *L, int k) {
if (k < 1) {
printf("查找位置非法!");
return NULL;
}
int i = 1;
if (L != NULL && i <= k) {
L = L->next;
i++;
}
if (i == k) {
return L;
}
printf("查找位置非法!");
return NULL;
}
void print(LNode *L) {
printf("\n");
while (L) {
printf("%4d ", L->data);
L = L->next;
}
printf("\n");
}
int main() {
LNode *L;
init(L);
head_insert(L, 15);
head_insert(L, 25);
head_insert(L, 35);
print(L);
printf("\n%4d \n", get(L, 2)->data);
return 0;
}代碼③
#include <stdio.h>
#include <malloc.h>
typedef struct LNode {
int data;
struct LNode *next;
}*LinkList;
void init(LinkList *L) {
*L = NULL;
}
void head_insert(LinkList *L, int x) {
LinkList newP = (LinkList)malloc(sizeof(LNode));
newP->data = x;
newP->next = *L;
*L = newP;
}
LinkList get(LinkList L, int k) {
if (k < 1) {
printf("查找位置非法!");
return NULL;
}
int i = 1;
if (L != NULL && i <= k) {
L = L->next;
i++;
}
if (i == k) {
return L;
}
printf("查找位置非法!");
return NULL;
}
void print(LinkList L) {
printf("\n");
while (L) {
printf("%4d ", L->data);
L = L->next;
}
printf("\n");
}
int main() {
LinkList L;
init(&L);
head_insert(&L, 15);
head_insert(&L, 25);
head_insert(&L, 35);
print(L);
printf("\n%4d \n", get(L, 2)->data);
return 0;
}代碼④
#include <stdio.h>
#include <malloc.h>
//結(jié)構(gòu)體
typedef struct LNode {
int data;
struct LNode *next;
} *LinkList;
//初始化
void init(LinkList &L) {
L = NULL;
}
//頭插
void head_insert(LinkList &L, int x) {
LinkList newP = (LinkList)malloc(sizeof(LNode));
newP->data = x;
newP->next = L;
L = newP;
}
//按位序查找
LinkList get(LinkList L, int k) {
if (k < 1) {
printf("查找位置非法!");
return NULL;
}
int i = 1;
if (L != NULL && i <= k) {
L = L->next;
i++;
}
if (i == k) {
return L;
}
printf("查找位置非法!");
return NULL;
}
//遍歷輸出
void print(LinkList L) {
printf("\n");
while (L) {
printf("%4d ", L->data);
L = L->next;
}
printf("\n");
}
int main() {
LinkList L;
init(L);
head_insert(L, 15);
head_insert(L, 25);
head_insert(L, 35);
print(L);
printf("\n%4d \n", get(L, 2)->data);
return 0;
}帶頭結(jié)點(diǎn)的操作
代碼⑤
#include <stdio.h>
#include <malloc.h>
//結(jié)構(gòu)體
typedef struct LNode {
int data;
struct LNode *next;
} *LinkList;
//初始化
void init(LinkList &L) {
LinkList newp = (LinkList)malloc(sizeof(LNode));
newp->next = NULL;
L = newp;
}
//頭插
void head_insert(LinkList L, int x) {
LinkList newp = (LinkList)malloc(sizeof(LNode));
newp->data = x;
newp->next = L->next;
L->next = newp;
}
//按位序查找
LinkList get(LinkList L, int k) {
if (k < 1) {
printf("查找位置非法!");
return NULL;
}
int i = 1;
LinkList p = L->next;
if (p != NULL && i <= k) {
p = p->next;
i++;
}
if (i == k) {
return p;
}
printf("查找位置非法!");
return NULL;
}
//遍歷輸出
void print(LinkList L) {
printf("\n");
LinkList p = L->next;
while (p) {
printf("%4d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList L;
init(L);
head_insert(L, 15);
head_insert(L, 25);
head_insert(L, 35);
print(L);
printf("\n%4d \n", get(L, 2)->data);
return 0;
}到此這篇關(guān)于帶頭結(jié)點(diǎn)單鏈表與不帶頭結(jié)點(diǎn)單鏈表的區(qū)別的文章就介紹到這了,更多相關(guān)帶頭與不帶頭結(jié)點(diǎn)單鏈表區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt?加載?libjpeg?庫出現(xiàn)“長(zhǎng)跳轉(zhuǎn)已經(jīng)運(yùn)行”錯(cuò)誤問題解決
這篇文章主要介紹了Qt?加載?libjpeg?庫出現(xiàn)“長(zhǎng)跳轉(zhuǎn)已經(jīng)運(yùn)行”錯(cuò)誤,本文給大家分享完美解決方案,需要的朋友可以參考下2023-04-04
對(duì)比分析C語言中的gcvt()和ecvt()以及fcvt()函數(shù)
這篇文章主要介紹了對(duì)比分析C語言中的gcvt和ecvt以及fcvt函數(shù),都是將數(shù)字轉(zhuǎn)化為字符串,注意其之間的功能區(qū)別,需要的朋友可以參考下2015-08-08
Qt編寫提示進(jìn)度條的實(shí)現(xiàn)示例
進(jìn)度條在很地方都可以使用到,Qt自帶的進(jìn)度條或者操作系統(tǒng)的進(jìn)度條樣式,不夠炫,本文就介紹一下Qt編寫自定義控件的提示進(jìn)度條的實(shí)現(xiàn)示例,感興趣的可以了解一下2021-12-12
C語言關(guān)鍵字auto與register及static專項(xiàng)詳解
這篇文章主要解釋了c語言中什么是數(shù)據(jù)類型,什么是變量,他們的真正含義是什么。分析了屬性關(guān)鍵字auto,register和static的用法2022-07-07

