最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)無(wú)頭單向鏈表的示例代碼

 更新時(shí)間:2021年09月26日 10:06:58   作者:燕麥沖沖沖  
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)無(wú)頭單向鏈表的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、易錯(cuò)的接口實(shí)現(xiàn)

1.1 新節(jié)點(diǎn)開(kāi)辟函數(shù)

由于創(chuàng)建一個(gè)新節(jié)點(diǎn)是頻繁的操作,所以封裝為一個(gè)接口最佳。

鏈表節(jié)點(diǎn)的屬性有:(1)數(shù)值。(2)指向下一個(gè)節(jié)點(diǎn)的地址。(3)自身地址。

static SLTNode* BuySListNode(SLTDataType x)
{
 SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
 //開(kāi)辟失敗
 if (newnode == NULL)
 {
  printf("malloc fail\n");
  exit(-1);
 }
 //初始化
 newnode->data = x;
 newnode->next = NULL;
 return newnode;
}

數(shù)值和next地址都由此函數(shù)初始化,自身地址則由函數(shù)的返回值返回。

要注意使用malloc函數(shù)時(shí),可能存在開(kāi)辟空間失敗的情況,這時(shí)會(huì)返回NULL。

1.2 尾插

尾插的難點(diǎn)在于存在特殊情況。

當(dāng)對(duì)非空鏈表和空鏈表進(jìn)行尾插時(shí),所需代碼不同。

對(duì)非空鏈表尾插時(shí),算法是:找到此鏈表的尾部,即遍歷此鏈表,直至自定義的結(jié)構(gòu)體指針tail的下一個(gè)節(jié)點(diǎn)為NULL,結(jié)束遍歷。在tail的后面插入一個(gè)新節(jié)點(diǎn)。

對(duì)空鏈表尾插時(shí),算法是:直接把新節(jié)點(diǎn)作為鏈表的頭節(jié)點(diǎn)。

void SListPushBack(SLTNode** pphead, SLTDataType x)
{
 assert(pphead);
 //找尾
 SLTNode* tail = *pphead;
 if (tail == NULL)
 {
  tail = BuySListNode(x);
  *pphead = tail;
 }
 else
 {
  while (tail->next != NULL)
  {
   tail = tail->next;
  }
  SLTNode* newnode = BuySListNode(x);
  tail->next = newnode;
 }
}

1.3 尾刪

此接口也有特殊情況處理。

當(dāng)鏈表有一個(gè)以上的節(jié)點(diǎn)時(shí),算法:遍歷鏈表到尾部,free掉tail所在內(nèi)存,改變tail之前一個(gè)節(jié)點(diǎn)的next,為NULL。

需要一個(gè)結(jié)構(gòu)體指針變量prev來(lái)記錄tail的前一個(gè)節(jié)點(diǎn)。

當(dāng)鏈表只有一個(gè)節(jié)點(diǎn)時(shí),算法:tail一開(kāi)始就在尾部,直接free掉tail,再把prev指針(初值為NULL)賦值給頭節(jié)點(diǎn)*pphead。

如果不單獨(dú)考慮這種情況的話,會(huì)因?yàn)镹ULL->next而出現(xiàn)內(nèi)存錯(cuò)誤。

當(dāng)鏈表沒(méi)有節(jié)點(diǎn)時(shí),是不可以調(diào)用尾刪的,直接用assert函數(shù)報(bào)錯(cuò)。

void SListPopBack(SLTNode** pphead)
{
 assert(pphead);
 assert(*pphead);//沒(méi)有節(jié)點(diǎn)斷言報(bào)錯(cuò)
 SLTNode* prev = NULL;
 SLTNode* tail = *pphead;
 while (tail->next != NULL)
 {
  prev = tail;
  tail = tail->next;
 }
 free(tail);
 tail = NULL;
 if (prev != NULL)
  prev->next = NULL;
 else
  *pphead = prev;
}

二、常見(jiàn)簡(jiǎn)單接口

2.1 打印鏈表

void SListPrint(SLTNode* phead)
{
 SLTNode* cur = phead;
 while (cur)
 {
  printf("%d->", cur->data);
  cur = cur->next;
 }
 printf("NULL\n");
}

2.2 節(jié)點(diǎn)計(jì)數(shù)器

int SListSize(SLTNode* phead)
{
 //計(jì)數(shù)器
 int count = 0;
 SLTNode* cur = phead;
 while (cur)
 {
  count++;
  cur = cur->next;
 }
 return count;
}

2.3 判斷是否為空鏈表

bool SListEmpty(SLTNode* phead)
{
 return phead == NULL;
}

2.4 通過(guò)值查找節(jié)點(diǎn)

SLTNode* SListFind(SLTNode* phead, SLTDataType data)
{
 //通過(guò)數(shù)據(jù)查找節(jié)點(diǎn)-遍歷節(jié)點(diǎn),判斷值是否相等
 SLTNode* cur = phead;
 while (cur)
 {
  if (cur->data == data)
   return cur;
  cur = cur->next;
 }
 return NULL;
}

2.5 頭插

void SListPushFront(SLTNode** pphead, SLTDataType x)
{
 assert(pphead);
 SLTNode* newnode = BuySListNode(x);
 newnode->next = *pphead;
 *pphead = newnode;
}

2.6 頭刪

void SListPopFront(SLTNode** pphead)
{
 assert(pphead);
 assert(*pphead);
 SLTNode* next = (*pphead)->next;
 free(*pphead);
 *pphead = NULL;
 *pphead = next;
}

2.7 在任意節(jié)點(diǎn)后插入節(jié)點(diǎn)

void SListInsert(SLTNode* pos, SLTDataType x)
{
 assert(pos);
 SLTNode* newnode = BuySListNode(x);
 SLTNode* next = pos->next;
 pos->next = newnode;
 newnode->next = next;
}

2.8 在任意節(jié)點(diǎn)后刪除節(jié)點(diǎn)

void SListErase(SLTNode* pos)
{
 assert(pos);
 assert(pos->next);
 SLTNode* next = pos->next;
 pos->next = next->next;
 free(next);
 next = NULL;
}

2.9 銷(xiāo)毀鏈表

void SListDestroy(SLTNode** pphead)
{
 assert(pphead);
 SLTNode* cur, * nextnode;
 cur = *pphead;
 nextnode = NULL;
 while (cur)
 {
  nextnode = cur->next;
  free(cur);
  cur = nextnode;
 }
 *pphead = NULL;
}

三、頭文件相關(guān)內(nèi)容

3.1 引用的庫(kù)函數(shù)

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

3.2 結(jié)構(gòu)體聲明

typedef int SLTDataType;//重定義可便于修改值的數(shù)據(jù)類(lèi)型
1
typedef struct SListNode
{
 SLTDataType data;
 struct SListNode* next;
}SLTNode;//重定義可減少代碼冗余

到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)無(wú)頭單向鏈表的示例代碼的文章就介紹到這了,更多相關(guān)C語(yǔ)言無(wú)頭單向鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C語(yǔ)言關(guān)鍵字auto與register及static專項(xiàng)詳解

    C語(yǔ)言關(guān)鍵字auto與register及static專項(xiàng)詳解

    這篇文章主要解釋了c語(yǔ)言中什么是數(shù)據(jù)類(lèi)型,什么是變量,他們的真正含義是什么。分析了屬性關(guān)鍵字auto,register和static的用法
    2022-07-07
  • C語(yǔ)言實(shí)現(xiàn)opencv提取直線、輪廓及ROI實(shí)例詳解

    C語(yǔ)言實(shí)現(xiàn)opencv提取直線、輪廓及ROI實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)opencv提取直線、輪廓及ROI實(shí)例詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 用C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲

    用C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++實(shí)現(xiàn)視頻流轉(zhuǎn)換為圖片方式

    C++實(shí)現(xiàn)視頻流轉(zhuǎn)換為圖片方式

    今天小編就為大家分享一篇C++實(shí)現(xiàn)視頻流轉(zhuǎn)換為圖片方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解

    C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解

    下面小編就為大家?guī)?lái)一篇全面了解C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • C++11 并發(fā)指南之多線程初探

    C++11 并發(fā)指南之多線程初探

    這篇文章主要介紹了C++11 并發(fā)指南之多線程初探,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 淺析C++中的間接宏函數(shù)

    淺析C++中的間接宏函數(shù)

    這篇文章主要介紹了C++中的間接宏函數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C++ 匈牙利算法案例分析詳解

    C++ 匈牙利算法案例分析詳解

    這篇文章主要介紹了C++ 匈牙利算法案例分析詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言動(dòng)態(tài)順序表實(shí)例代碼

    C語(yǔ)言動(dòng)態(tài)順序表實(shí)例代碼

    大家好,本篇文章主要講的是C語(yǔ)言動(dòng)態(tài)順序表實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 教你用Matlab制作黃金礦工小游戲

    教你用Matlab制作黃金礦工小游戲

    黃金礦工作為經(jīng)典的單機(jī)小游戲,一直深受大家的喜愛(ài)。本文將用Matlab制作這一款經(jīng)典的游戲,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以了解一下
    2022-03-03

最新評(píng)論

乳源| 麻城市| 仪征市| 梨树县| 裕民县| 兰坪| 江西省| 峨眉山市| 义乌市| 隆昌县| 池州市| 惠来县| 马尔康县| 永登县| 灵石县| 台安县| 永善县| 都匀市| 枣庄市| 黄山市| 德惠市| 灵川县| 松阳县| 察隅县| 天长市| 肥东县| 永川市| 郧西县| 蓬溪县| 泽州县| 拜泉县| 九龙城区| 湄潭县| 宝鸡市| 扬中市| 金乡县| 新疆| 霍山县| 霍林郭勒市| 云林县| 濮阳市|