成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

C語(yǔ)言實(shí)現(xiàn)單鏈表

cpupro / 1128人閱讀

摘要:文章目錄一單鏈表與順序表的區(qū)別二關(guān)于鏈表中的一些函數(shù)接口的作用及實(shí)現(xiàn)頭文件里的結(jié)構(gòu)體和函數(shù)聲明等等尾插尾刪頭插頭刪單鏈表查找中間插入在后面進(jìn)行插入中間刪除在后面進(jìn)行刪除多帶帶打印鏈表和從頭到尾打印鏈表


一、單鏈表與順序表的區(qū)別:

一、順序表:

1、內(nèi)存中地址連續(xù)

2、長(zhǎng)度可以實(shí)時(shí)變化

3、不支持隨機(jī)查找

4、適用于訪問(wèn)大量元素的,而少量需要增添/刪除的元素的程序

5、中間插入或者刪除比較方便,內(nèi)存命中率較高

二、鏈表

1、內(nèi)存中地址不連續(xù)(邏輯上連續(xù),物理上不連續(xù))

2、長(zhǎng)度可以實(shí)時(shí)變化(避免浪費(fèi)空間)

3、不支持隨機(jī)查找,查找的時(shí)間復(fù)雜度為o(1),

4、適用于訪問(wèn)大量元素的,對(duì)訪問(wèn)元素?zé)o要求的程序

5、中間插入或者刪除比較方便,效率高

二、關(guān)于鏈表中的一些函數(shù)接口的作用及實(shí)現(xiàn)

1、創(chuàng)建接口,開(kāi)辟空間

2、尾插尾刪

3、頭插頭刪

4、查找并修改

5、中插中刪

ps:我看了許多的單鏈表文章,在插刪的接口實(shí)現(xiàn)上大多數(shù)是往前進(jìn)行插刪,這里寫(xiě)的則是往后進(jìn)行插刪

1、頭文件里的結(jié)構(gòu)體和函數(shù)聲明等等

#pragma once#define _CRT_SECURE_NO_WARNINGS#include#include#includetypedef int SListDataType;//節(jié)點(diǎn)typedef struct SListNode{	SListDataType data;	struct SListNode* next;}SListNode;//struct SList//{//	SListNode* head;//	SListNode* tail;//};//尾插尾刪void SListPushBack(SListNode** pphead, SListDataType x);void SListPopBack(SListNode** pphead);//頭插頭刪void SListPushFront(SListNode**  pphead, SListDataType x);void SListPopFront(SListNode** pphaed);void SListPrint(SListNode* phead);//查找并修改SListNode* SListFind(SListNode* phead, SListDataType x);//中插中刪void SListInserAfter(SListNode**pphead,SListNode* pos, SListDataType x);void SListEraseAfter(SListNode* pos);//從頭到尾打印鏈表void PrintTailToHead(SListNode* pList);

2、創(chuàng)建接口空間

//開(kāi)辟的下一個(gè)空間SListNode* BuySListNode(SListDataType x){	SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));	if (newNode == NULL)	{		printf("申請(qǐng)結(jié)點(diǎn)失敗/n");		exit(-1);	}	newNode->data = x;	newNode->next = NULL;	return newNode;}

3.尾插尾刪

//尾插void SListPushBack(SListNode** pphead, SListDataType x){	SListNode* newNode = BuySListNode(x);//我們指向頭指針的那個(gè)結(jié)點(diǎn)是**pphead,*pphead就是頭指針的地址	//如果頭指針的地址為空,我們就把新開(kāi)辟的這個(gè)空間指針(已經(jīng)傳入值)再賦給頭指針,也就是下面的這個(gè)if循環(huán)	if (*pphead == NULL)	{		*pphead = newNode;	}	else	{		//找尾巴,判斷尾巴是不是空地址,這個(gè)函數(shù)實(shí)現(xiàn)的是尾插,我們找到尾巴后,如果尾巴是空地址,我們將插入的newNode賦給尾巴,此時(shí)		//實(shí)現(xiàn)了尾插,在下面的代碼中,我們首先把頭指針當(dāng)成尾巴,從頭指針開(kāi)始依次往后找,如果下一個(gè)不是空指針,我們就令		//tail=tail->next,此時(shí)指向下一個(gè)結(jié)點(diǎn),進(jìn)入循環(huán)繼續(xù)判斷,當(dāng)找到后,我們?cè)倭钗舶?newNode,在上面我們也判斷了頭指針為空的情況		SListNode* tail = *pphead;		while (tail->next!= NULL)		{			tail = tail -> next;		}		tail->next = newNode;	}}void SListPopBack(SListNode** pphead){	//1、空	//2、一個(gè)結(jié)點(diǎn)	//3、一個(gè)以上	if (*pphead == NULL)	{		return;	}	else if ((*pphead)->next == NULL)	{		free(*pphead);		*pphead = NULL;	}	else	{		SListNode* prev = NULL;		SListNode* tail = *pphead;		while (tail->next != NULL)		{			prev = tail;			tail = tail->next;		}		free(tail);		//tail = NULL;//這個(gè)無(wú)所謂,因?yàn)槲覀冡尫藕?,出了這個(gè)作用域,tail和prev都被銷(xiāo)毀,沒(méi)人能拿到,所以不會(huì)被再找到		prev->next = NULL;		}}

4、頭插頭刪

//頭插頭刪void SListPushFront(SListNode** pphead, SListDataType x){	SListNode* newnode = BuySListNode(x);	newnode->next = *pphead;	*pphead = newnode;}void SListPopFront(SListNode** pphead){	//1、空	//2、一個(gè)結(jié)點(diǎn)+3、一個(gè)以上		if (*pphead == NULL)	{		return;	}	//(*phead)->next:*和>都是解引用,同一優(yōu)先級(jí),我們需要給*pphead帶括號(hào),(*pphead)->next才是下一個(gè)結(jié)點(diǎn)		else{		//我們頭刪也會(huì)遇到情況,我們刪除第一個(gè)的話,第一個(gè)里面還存有第二個(gè)結(jié)點(diǎn)的地址,我們必須在刪除前,保存第二個(gè)結(jié)點(diǎn)的地址		SListNode* next = (*pphead)->next;		free(*pphead);//通過(guò)調(diào)試我們發(fā)現(xiàn):free前后,*pphead的地址不變,但是*pphead里的值被置為隨機(jī)值,free不僅僅把這塊空間還給操作系統(tǒng)		  //而且還把這塊空間存的值和地址都置為隨機(jī)值		*pphead = next;	}}

?5、單鏈表查找

//單鏈表查找SListNode* SListFind(SListNode* phead, SListDataType x){	SListNode* cur = phead;	while (cur)	{		if (cur->data == x)		{			return cur;		}		cur = cur->next;	}	return NULL;}

6、中間插入(在pos后面進(jìn)行插入)

void SListInserAfter(SListNode** pphead,SListNode* pos, SListDataType x){	assert(pos && pphead);	if (*pphead == pos)	{		SListPushFront(pphead, x);	}	else	{		SListNode* newnode = BuySListNode(x);		SListNode* tmp = *pphead;		while (tmp->next != pos)		{			tmp = tmp->next;		}		tmp->next = pos;		pos->next = newnode;	}	}

?7、中間刪除(在pos后面進(jìn)行刪除)

void SListEraseAfter(SListNode* pos){	//刪除pos后面的	assert(pos);	if (pos->next)	{		//pos->next=pos->next->next//不推薦		SListNode* next = pos->next;		SListNode* nextnext = next->next;		pos->next = nextnext;		free(next);	}}

8、多帶帶打印鏈表和從頭到尾打印鏈表

void SListPrint(SListNode* phead){	SListNode* cur = phead;	while (cur != NULL)	{		printf("%d->", cur->data);		cur = cur->next;	}	printf("NULL/n");}void PrintTailToHead(SListNode* pList){	if (pList == NULL)	{		return;	}	PrintTailToHead(pList->next);	printf("%d->",pList->data);}

9、test.c

#include"SList.h"TestSList1(){	SListNode* pList = NULL;//這個(gè)結(jié)構(gòu)體指針指向開(kāi)辟的空間,頭指針指向鏈表的開(kāi)頭	SListPushBack(&pList, 1);	SListPushBack(&pList, 2);	SListPushBack(&pList, 3);	SListPushBack(&pList, 4);	SListPrint(pList);	SListPopBack(&pList);	SListPopBack(&pList);	SListPopBack(&pList);	SListPopBack(&pList);	SListPopBack(&pList);	SListPrint(pList);	SListPushFront(&pList, 1);	SListPushFront(&pList, 2);	SListPushFront(&pList, 6);	SListPushFront(&pList, 4);	SListPushFront(&pList, 5);	SListPrint(pList);	SListPopFront(&pList);	SListPopFront(&pList);	SListPopFront(&pList);	SListPopFront(&pList);	SListPopFront(&pList);	SListPopFront(&pList);	SListPrint(pList);}TestSList2(){	SListNode* pos1;	SListNode* pList = NULL;//這個(gè)結(jié)構(gòu)體指針指向開(kāi)辟的空間,頭指針指向鏈表的開(kāi)頭	SListPushBack(&pList, 1);	SListPushBack(&pList, 2);	SListPushBack(&pList, 3);	SListPushBack(&pList, 4);	SListPrint(pList);	SListNode* pos = SListFind(pList, 3);	if (pos)	{		pos->data = 30;//這里將cur-data改為pos->data,然后再將pos-data原來(lái)的值改為30	}	SListPrint(pList);	pos1 = SListFind(pList, 30);//我們先去找到這個(gè)pos1的位置,然后再去插入	SListInserAfter(&pList,pos1,50);//函數(shù)傳參要對(duì)應(yīng)起來(lái),我們用指針傳用指針接收,不能在pos1位置直接寫(xiě)個(gè)數(shù)字	SListPrint(pList);	SListEraseAfter(pos1);//pList指向第一個(gè)結(jié)點(diǎn),pList->next指向第二個(gè)結(jié)點(diǎn),那么我們刪除的是目標(biāo)節(jié)點(diǎn)后面	SListPrint(pList);	//PrintTailToHead(&pList);}int main(){	TestSList1();	TestSList2();	return 0;	}

?

?

?

總結(jié)

提示:這里對(duì)文章進(jìn)行總結(jié):
例如:以上就是今天要講的內(nèi)容,本文僅僅簡(jiǎn)單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119292.html

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)之線性

    摘要:線性表是最基本的數(shù)據(jù)結(jié)構(gòu)之一,在實(shí)際程序中應(yīng)用非常廣泛,它還經(jīng)常被用作更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)基礎(chǔ)。鏈表之單鏈表線性表的定義,它是一些元素的序列,維持著元素之間的一種線性關(guān)系。 線性表學(xué)習(xí)筆記,python語(yǔ)言描述-2019-1-14 線性表簡(jiǎn)介 在程序中,經(jīng)常需要將一組(通常是同為某個(gè)類(lèi)型的)數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含...

    leoperfect 評(píng)論0 收藏0
  • 實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之單鏈

    摘要:常見(jiàn)操作對(duì)單鏈表我們常見(jiàn)的操作有如下語(yǔ)言實(shí)現(xiàn)首先我們根據(jù)定義實(shí)現(xiàn)一個(gè)類(lèi)。單鏈表是鏈表這種鏈?zhǔn)酱嫒?shù)據(jù)結(jié)構(gòu)中基礎(chǔ)的部分,同樣屬于鏈表結(jié)構(gòu)的還有雙鏈表,環(huán)形鏈表和多鏈表。專(zhuān)題系列基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)專(zhuān)題系列目錄地址主要使用語(yǔ)法總結(jié)基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法。 什么是鏈表? 鏈表由一個(gè)一個(gè)的作為節(jié)點(diǎn)的對(duì)象構(gòu)成的,每一個(gè)節(jié)點(diǎn)都有指向下一個(gè)節(jié)點(diǎn)的指針,最后一個(gè)節(jié)點(diǎn)的指針域指向空。每個(gè)節(jié)點(diǎn)可以存儲(chǔ)任何數(shù)據(jù)類(lèi)型。...

    xumenger 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<