那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鏈表的基本操作

玩轉單片機 ? 來源:玩轉單片機 ? 作者:玩轉單片機 ? 2022-12-13 10:11 ? 次閱讀

回看了一下以前寫的鏈表操作,確實有點復雜不利于初學,這篇文章就換個寫法,簡單明了的介紹鏈表的操作;

第一步:定義節點結構體,可以把它看成一個模板:

// 定義節點
typedef struct node
{
    unsigned char data;
    struct node *next;
}node_t;

第二步:初始化節點,目的就是獲取到頭節點,后續的操作都是判斷節點的同名結構體指針是否為空,所有頭節點的head->next必須等于NULL:

// 初始化節點
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;
}

總結:尾節點操作是通過判斷節點指針是否為NULL,找到節點指針為NULL的指針,然后進行相關操作,而頭節點直接就通過頭節點進行相關操作,頭插和尾插最大的不同就是數據是反的,這點要注意不要搞錯;

完整代碼如下:

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


// 定義節點
typedef struct node
{
    unsigned char data;
    struct node *next;
}node_t;


// 初始化節點
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("------
");
}

代碼寫得不是很嚴謹,主要用于入門學習,把主要思路講清楚;覺得有收獲的同學動動小手指點個贊吧,我是Noah,我們下篇推文再見!

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4826

    瀏覽量

    69052
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    10872
  • 鏈表
    +關注

    關注

    0

    文章

    80

    瀏覽量

    10599

原文標題:通俗|操作鏈表

文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    結構數據:鏈表刪除及靜態鏈表操作(2)#結構數據

    數據結構與算法
    學習硬聲知識
    發布于 :2022年12月17日 20:31:42

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

    數據結構
    jf_60701476
    發布于 :2023年01月23日 22:08:21

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

    數據結構
    jf_60701476
    發布于 :2023年01月23日 22:09:17

    [2.3.2]--2.3.2單鏈表基本操作的實現

    算法數據結構
    jf_60701476
    發布于 :2023年01月24日 20:37:11

    Linux內核的鏈表操作

    Linux內核的鏈表操作本文詳細分析了 2.6.x 內核中鏈表結構的實現,并通過實例對每個鏈表操作接口進行了詳盡的講解。一、
    發表于 08-29 11:13

    Linux鏈表操作心得體會

    在研究linux內核自帶的dmatest.c驅動程序過程中發現有部分的鏈接操作,非常迷惑,故在此記錄下來一些查閱資料后的心得體會。
    發表于 07-26 08:15

    回調函數的相關資料推薦

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

    數據結構鏈表的基本操作

    嵌入式學習基礎-數據結構鏈表的基本操作鏈表節點采用結構體的方式進行定義,下面是最基礎的定義只有一個數據data,*pNext用于指向下一個節點(若為尾節點則指向NULL)。//鏈表節點
    發表于 12-22 08:05

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

    操作RT-Thread的對象容器是依賴于雙鏈表(雙向循環鏈表)的,其雙鏈表的相關操作在文件rtservice.h中:其節點結構體為:str
    發表于 05-18 14:23

    小編科普一下rtthread鏈表操作的幾個API與實用的幾個宏

    rtthread 鏈表操作的的幾個 API /* 將節點 n 插入到節點 l 的后面,如果 l 為頭節點,則插入到鏈表頭部 */rt_inline void rt_list_insert_after
    發表于 05-18 14:26

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

    發表于 11-09 16:01 ?34次下載

    C++結構體與鏈表的實驗報告資料免費下載

    本文檔的主要內容詳細介紹的是C++結構體與鏈表的實驗報告資料免費下載。 一、目的和要求1. 掌握結構體類型、結構體變量的基本概念;2. 掌握結構體指針、結構體數組的應用;3. 掌握鏈表的基本概念;4. 掌握鏈表的基本
    發表于 05-27 08:00 ?4次下載
    C++結構體與<b class='flag-5'>鏈表</b>的實驗報告資料免費下載

    鏈表學習的超詳細說明(二)

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

    鏈表學習的總結(一)

    想必大多數人和我一樣,剛開始學數據結構中的單鏈表還是蠻吃力的,特別是后面的雙鏈表操作更是如此。還有就是在實踐代碼操作時,你又會感到無從下手,沒有思路。
    的頭像 發表于 12-24 17:35 ?3476次閱讀

    說說Go里面的鏈表操作

    按照邏輯結構來說,他們應該是一個挨著一個的,但是在實際存儲當中并沒有像這樣連續,可能會散落在各個內存區里面。
    的頭像 發表于 08-17 11:07 ?1823次閱讀
    說說Go里面的<b class='flag-5'>鏈表</b><b class='flag-5'>操作</b>
    马德里百家乐的玩法技巧和规则| 犹太人百家乐的玩法技巧和规则| 大发888官网客户端| 在线百家乐官网博彩网| 百家乐出千方法技巧| 大发888亚洲游戏 网页| 百家乐官网赌场公司| 买百家乐程序| 柏乡县| 百家乐游戏平台排名| 龙博娱乐城| 棋牌百家乐官网有稳赚的方法吗 | 安卓水果机游戏下载| 百家乐官网视频游戏盗号| 百家乐牌路分析仪| 尊尚会娱乐城| 百家乐游戏排行榜| 百家乐龙虎玩| 百家乐官网怎样捉住长开| 百家乐大西洋| 三国百家乐娱乐城| 网上百家乐官网官方网站| 澳门百家乐赌钱| 蓬安县| 新加坡百家乐官网规则| 宝胜娱乐城| 大都会百家乐官网的玩法技巧和规则| 网上百家乐作弊法| 百家乐官网网页游戏网址| 葡京百家乐的玩法技巧和规则 | 汶上县| 百家乐赌场详解| 百家乐官网博彩策略论坛| 百家乐游戏卡通| 百家乐官网平台要多少钱| 百家乐娱乐场真人娱乐场| 菲律宾百家乐官网娱乐网| 乐宝百家乐的玩法技巧和规则| 百家乐官网三跳| 大发888真钱娱乐网| 做生意佩戴什么纳财|