欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

帶頭結(jié)點(diǎn)單鏈表與不帶頭結(jié)點(diǎn)單鏈表的區(qū)別

 更新時(shí)間:2023年07月02日 11:49:55   作者:CD4356  
這篇文章主要介紹了帶頭結(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)文章

  • java string對(duì)象上的操作,常見的用法你知道嗎

    java string對(duì)象上的操作,常見的用法你知道嗎

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java String類用法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-08-08
  • 利用C++模擬實(shí)現(xiàn)STL容器:list

    利用C++模擬實(shí)現(xiàn)STL容器:list

    列表是一種順序容器,它允許在序列中的任何位置執(zhí)行常量時(shí)間插入和刪除操作,并允許在兩個(gè)方向上進(jìn)行迭代。本文將利用C++模擬實(shí)現(xiàn)list,希望對(duì)大家有所幫助
    2022-12-12
  • c++ 標(biāo)準(zhǔn)庫多線程問題小結(jié)

    c++ 標(biāo)準(zhǔn)庫多線程問題小結(jié)

    C++11 引入了<thread>庫,使得多線程編程更加方便,以下是一些基本概念和示例,幫助你理解如何在 C++ 中進(jìn)行多線程編程,這篇文章主要介紹了c++ 標(biāo)準(zhǔn)庫多線程,需要的朋友可以參考下
    2025-03-03
  • C語言使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器

    C語言使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了C語言如何使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-12-12
  • 對(duì)C語言中遞歸算法的深入解析

    對(duì)C語言中遞歸算法的深入解析

    C通過運(yùn)行時(shí)堆棧支持遞歸函數(shù)的實(shí)現(xiàn)。遞歸函數(shù)就是直接或間接調(diào)用自身的函數(shù)
    2013-07-07
  • 使用Qt實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果

    使用Qt實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果

    這篇文章主要為大家詳細(xì)介紹了如何使用Qt實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • C++實(shí)現(xiàn)LeetCode(100.判斷相同樹)

    C++實(shí)現(xiàn)LeetCode(100.判斷相同樹)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(100.判斷相同樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 應(yīng)用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    應(yīng)用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    相對(duì)于操作NandFlash,操作NorFlash相對(duì)簡(jiǎn)單,因?yàn)榛静恍枰紤]壞塊,NorFlash也沒有OOB區(qū)域,也跟ECC沒有關(guān)系。讀寫擦除相對(duì)容易,下面看個(gè)例子吧
    2013-12-12
  • C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    這篇文章主要介紹了C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • VS2010+Opencv+MFC讀取圖像和視頻顯示在Picture控件

    VS2010+Opencv+MFC讀取圖像和視頻顯示在Picture控件

    這篇文章主要為大家詳細(xì)介紹了VS2010+Opencv+MFC讀取圖像和視頻顯示在Picture控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評(píng)論