91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鏈表的基本操作

玩轉(zhuǎn)單片機(jī) ? 來(lái)源:玩轉(zhuǎn)單片機(jī) ? 作者:玩轉(zhuǎn)單片機(jī) ? 2022-12-13 10:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

回看了一下以前寫(xiě)的鏈表操作,確實(shí)有點(diǎn)復(fù)雜不利于初學(xué),這篇文章就換個(gè)寫(xiě)法,簡(jiǎn)單明了的介紹鏈表的操作;

第一步:定義節(jié)點(diǎn)結(jié)構(gòu)體,可以把它看成一個(gè)模板:

// 定義節(jié)點(diǎn)
typedef struct node
{
    unsigned char data;
    struct node *next;
}node_t;

第二步:初始化節(jié)點(diǎn),目的就是獲取到頭節(jié)點(diǎn),后續(xù)的操作都是判斷節(jié)點(diǎn)的同名結(jié)構(gòu)體指針是否為空,所有頭節(jié)點(diǎn)的head->next必須等于NULL:

// 初始化節(jié)點(diǎn)
node_t* node_init(unsigned char data)
{
  node_t* head=(node_t*)malloc(sizeof(node_t));
  head->data = data;
  head->next = NULL;
  return head;
}

第三步:打印節(jié)點(diǎn)數(shù)據(jù),用于查看節(jié)點(diǎn)的最新數(shù)據(jù):

// 打印鏈表
void node_printf(node_t *node)
{
  node_t *head = node;
  while(1){
    printf("data:%d
",head->data);
    if(head->next==NULL){
      return;
    }else{
      head = head->next;
    }
  };
}

第四步:尾插方式把新的節(jié)點(diǎn)接入鏈表,核心就是判斷節(jié)點(diǎn)的指針是否為空,找到最尾巴的節(jié)點(diǎn),然后把新的節(jié)點(diǎn)接到它的后面,然后再把新的節(jié)點(diǎn)指針賦值為空:

// 尾插
node_t* node_end_add(node_t *node, unsigned char data)
{
  node_t *head = node;
  node_t *end = node;
  while(1){
    if(end->next!=NULL){
      end = end->next;
    }else{
      node_t* temp_node=(node_t*)malloc(sizeof(node_t));
      temp_node->data = data;
      temp_node->next = NULL;
      end->next = temp_node;
      return head;
    }
  }
}

第五步:通過(guò)尾刪的方式,把節(jié)點(diǎn)指針為空的節(jié)點(diǎn)刪除,再把它上一個(gè)節(jié)點(diǎn)賦值為空:

// 尾刪
node_t* node_end_del(node_t *node)
{
  node_t *head = node;
  node_t *end = node;
  node_t *temp = NULL;
  while(1){
    if(end->next!=NULL){
      temp = end;
      end = end->next;
    }else{
      free(end);
      temp->next = NULL;
      return head;
    }
  }
}

第六步:通過(guò)頭插方式,把新的節(jié)點(diǎn)接入到鏈表,頭插的方式并不需要賦值為空,因?yàn)樗迦氲南乱还?jié)點(diǎn),就是上一次插入的節(jié)點(diǎn)指針,所以只需要把上一個(gè)節(jié)點(diǎn)指針賦值給新加入的指針即可,注意頭插一定要返回頭節(jié)點(diǎn)指針,因?yàn)轭^插的頭節(jié)點(diǎn)會(huì)隨著插入而改變:

// 頭插
node_t* node_head_add(node_t *node, unsigned char data)
{
  node_t* temp_node=(node_t*)malloc(sizeof(node_t));
  temp_node->data = data;
  temp_node->next = node;
  return temp_node;
}

第七步:通過(guò)頭刪的方式,把頭部的節(jié)點(diǎn)刪除,因?yàn)轭^部的節(jié)點(diǎn)是已知的,所以只要改表一下頭節(jié)點(diǎn),然后把頭部節(jié)點(diǎn)釋放就可以:

// 頭刪
node_t* node_head_del(node_t *node)
{
  node_t* head = node->next;
  free(node);
  return head;
}

總結(jié):尾節(jié)點(diǎn)操作是通過(guò)判斷節(jié)點(diǎn)指針是否為NULL,找到節(jié)點(diǎn)指針為NULL的指針,然后進(jìn)行相關(guān)操作,而頭節(jié)點(diǎn)直接就通過(guò)頭節(jié)點(diǎn)進(jìn)行相關(guān)操作,頭插和尾插最大的不同就是數(shù)據(jù)是反的,這點(diǎn)要注意不要搞錯(cuò);

完整代碼如下:

#include "stdio.h"
#include "stdlib.h"


// 定義節(jié)點(diǎn)
typedef struct node
{
    unsigned char data;
    struct node *next;
}node_t;


// 初始化節(jié)點(diǎn)
node_t* node_init(unsigned char data)
{
  node_t* head=(node_t*)malloc(sizeof(node_t));
  head->data = data;
  head->next = NULL;
  return head;
}


// 打印鏈表
void node_printf(node_t *node)
{
  node_t *head = node;
  while(1){
    printf("data:%d
",head->data);
    if(head->next==NULL){
      return;
    }else{
      head = head->next;
    }
  };
}


// 尾插
node_t* node_end_add(node_t *node, unsigned char data)
{
  node_t *head = node;
  node_t *end = node;
  while(1){
    if(end->next!=NULL){
      end = end->next;
    }else{
      node_t* temp_node=(node_t*)malloc(sizeof(node_t));
      temp_node->data = data;
      temp_node->next = NULL;
      end->next = temp_node;
      return head;
    }
  }
}


// 尾刪
node_t* node_end_del(node_t *node)
{
  node_t *head = node;
  node_t *end = node;
  node_t *temp = NULL;
  while(1){
    if(end->next!=NULL){
      temp = end;
      end = end->next;
    }else{
      free(end);
      temp->next = NULL;
      return head;
    }
  }
}


// 頭插
node_t* node_head_add(node_t *node, unsigned char data)
{
  node_t* temp_node=(node_t*)malloc(sizeof(node_t));
  temp_node->data = data;
  temp_node->next = node;
  return temp_node;
}


// 頭刪
node_t* node_head_del(node_t *node)
{
  node_t* head = node->next;
  free(node);
  return head;
}


int main()
{
  node_t* user_node = node_init(1);
  // 尾
  // user_node = node_end_add(user_node, 2);
  // user_node = node_end_add(user_node, 3);
  // user_node = node_end_add(user_node, 4);
  // node_printf(user_node);
  // printf("------
");
  // user_node = node_end_del(user_node);
  // user_node = node_end_del(user_node);
  // node_printf(user_node);
  // printf("------
");
  // user_node = node_end_add(user_node, 3);
  // user_node = node_end_add(user_node, 4);
  // node_printf(user_node);
  // printf("------
");
  // 頭
  user_node = node_head_add(user_node, 2);
  user_node = node_head_add(user_node, 3);
  user_node = node_head_add(user_node, 4);
  node_printf(user_node);
  printf("------
");
  user_node = node_head_del(user_node);
  user_node = node_head_del(user_node);
  node_printf(user_node);
  printf("------
");
  user_node = node_head_add(user_node, 3);
  user_node = node_head_add(user_node, 4);
  node_printf(user_node);
  printf("------
");
}

代碼寫(xiě)得不是很?chē)?yán)謹(jǐn),主要用于入門(mén)學(xué)習(xí),把主要思路講清楚;覺(jué)得有收獲的同學(xué)動(dòng)動(dòng)小手指點(diǎn)個(gè)贊吧,我是Noah,我們下篇推文再見(jiàn)!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73960
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    131

    瀏覽量

    11371
  • 鏈表
    +關(guān)注

    關(guān)注

    0

    文章

    80

    瀏覽量

    11057

原文標(biāo)題:通俗|操作鏈表

文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī),微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    結(jié)構(gòu)數(shù)據(jù):鏈表刪除及靜態(tài)鏈表操作(1)#結(jié)構(gòu)數(shù)據(jù)

    數(shù)據(jù)結(jié)構(gòu)與算法
    學(xué)習(xí)硬聲知識(shí)
    發(fā)布于 :2022年12月17日 20:31:07

    [2.6.1]--2.6單鏈表的基本操作1

    數(shù)據(jù)結(jié)構(gòu)
    jf_60701476
    發(fā)布于 :2023年01月23日 22:08:21

    [2.7.1]--2.7單鏈表的基本操作2

    數(shù)據(jù)結(jié)構(gòu)
    jf_60701476
    發(fā)布于 :2023年01月23日 22:09:17

    [2.3.2]--2.3.2單鏈表基本操作的實(shí)現(xiàn)

    算法數(shù)據(jù)結(jié)構(gòu)
    jf_60701476
    發(fā)布于 :2023年01月24日 20:37:11

    Linux內(nèi)核的鏈表操作

    Linux內(nèi)核的鏈表操作本文詳細(xì)分析了 2.6.x 內(nèi)核中鏈表結(jié)構(gòu)的實(shí)現(xiàn),并通過(guò)實(shí)例對(duì)每個(gè)鏈表操作接口進(jìn)行了詳盡的講解。一、
    發(fā)表于 08-29 11:13

    Linux鏈表操作心得體會(huì)

    在研究linux內(nèi)核自帶的dmatest.c驅(qū)動(dòng)程序過(guò)程中發(fā)現(xiàn)有部分的鏈接操作,非常迷惑,故在此記錄下來(lái)一些查閱資料后的心得體會(huì)。
    發(fā)表于 07-26 08:15

    回調(diào)函數(shù)的相關(guān)資料推薦

    前言上文分享了一個(gè)專(zhuān)用的雙鏈表的基本操作示例:雙鏈表操作示例(附代碼)這里提到了一個(gè)關(guān)鍵詞:專(zhuān)用。與專(zhuān)用對(duì)應(yīng)的詞是通用。我們從字面上可以很容易理解這兩個(gè)詞,專(zhuān)用就是針對(duì)特定情況的,特
    發(fā)表于 12-15 06:45

    數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作

    嵌入式學(xué)習(xí)基礎(chǔ)-數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作鏈表節(jié)點(diǎn)采用結(jié)構(gòu)體的方式進(jìn)行定義,下面是最基礎(chǔ)的定義只有一個(gè)數(shù)據(jù)data,*pNext用于指向下一個(gè)節(jié)點(diǎn)(若為尾節(jié)點(diǎn)則指向NULL)。//鏈表節(jié)點(diǎn)
    發(fā)表于 12-22 08:05

    淺析RT-Thread中對(duì)象容器與雙鏈表操作

    操作RT-Thread的對(duì)象容器是依賴(lài)于雙鏈表(雙向循環(huán)鏈表)的,其雙鏈表的相關(guān)操作在文件rtservice.h中:其節(jié)點(diǎn)結(jié)構(gòu)體為:str
    發(fā)表于 05-18 14:23

    小編科普一下rtthread鏈表操作的幾個(gè)API與實(shí)用的幾個(gè)宏

    rtthread 鏈表操作的的幾個(gè) API /* 將節(jié)點(diǎn) n 插入到節(jié)點(diǎn) l 的后面,如果 l 為頭節(jié)點(diǎn),則插入到鏈表頭部 */rt_inline void rt_list_insert_after
    發(fā)表于 05-18 14:26

    鏈表的基本操作(含源代碼)

    發(fā)表于 11-09 16:01 ?34次下載

    C++結(jié)構(gòu)體與鏈表的實(shí)驗(yàn)報(bào)告資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++結(jié)構(gòu)體與鏈表的實(shí)驗(yàn)報(bào)告資料免費(fèi)下載。 一、目的和要求1. 掌握結(jié)構(gòu)體類(lèi)型、結(jié)構(gòu)體變量的基本概念;2. 掌握結(jié)構(gòu)體指針、結(jié)構(gòu)體數(shù)組的應(yīng)用;3. 掌握鏈表的基本概念;4. 掌握鏈表的基本
    發(fā)表于 05-27 08:00 ?4次下載
    C++結(jié)構(gòu)體與<b class='flag-5'>鏈表</b>的實(shí)驗(yàn)報(bào)告資料免費(fèi)下載

    鏈表學(xué)習(xí)的超詳細(xì)說(shuō)明(二)

    昨天跟大家分享了單鏈表的一些基本用法,今天接著繼續(xù)和大家分享單鏈表的用法,今天分享完,單鏈表操作就暫告一段落了,后面接著分享雙鏈表的學(xué)習(xí)和
    的頭像 發(fā)表于 12-24 17:33 ?1222次閱讀

    鏈表學(xué)習(xí)的總結(jié)(一)

    想必大多數(shù)人和我一樣,剛開(kāi)始學(xué)數(shù)據(jù)結(jié)構(gòu)中的單鏈表還是蠻吃力的,特別是后面的雙鏈表操作更是如此。還有就是在實(shí)踐代碼操作時(shí),你又會(huì)感到無(wú)從下手,沒(méi)有思路。
    的頭像 發(fā)表于 12-24 17:35 ?3942次閱讀

    說(shuō)說(shuō)Go里面的鏈表操作

    按照邏輯結(jié)構(gòu)來(lái)說(shuō),他們應(yīng)該是一個(gè)挨著一個(gè)的,但是在實(shí)際存儲(chǔ)當(dāng)中并沒(méi)有像這樣連續(xù),可能會(huì)散落在各個(gè)內(nèi)存區(qū)里面。
    的頭像 發(fā)表于 08-17 11:07 ?2380次閱讀
    說(shuō)說(shuō)Go里面的<b class='flag-5'>鏈表</b><b class='flag-5'>操作</b>