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

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

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

C語言實(shí)現(xiàn)單鏈表-增刪改查

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-05-25 15:05 ? 次閱讀

鏈表是由一連串節(jié)點(diǎn)組成的數(shù)據(jù)結(jié)構(gòu),每個節(jié)點(diǎn)包含一個數(shù)據(jù)值和一個指向下一個節(jié)點(diǎn)的指針。鏈表可以在頭部和尾部插入和刪除節(jié)點(diǎn),因此可以在任何地方插入和刪除節(jié)點(diǎn),從而使其變得靈活和易于實(shí)現(xiàn)。

鏈表通常用于實(shí)現(xiàn)有序集合,例如隊(duì)列和雙向鏈表。鏈表的優(yōu)點(diǎn)是可以快速隨機(jī)訪問節(jié)點(diǎn),而缺點(diǎn)是插入和刪除操作相對慢一些,因?yàn)樾枰苿庸?jié)點(diǎn)。此外,鏈表的長度通常受限于內(nèi)存空間,因此當(dāng)鏈表變得很長時,可能需要通過分頁或鏈表分段等方式來管理其內(nèi)存。

image-20230525150013245

下面是一套封裝好的單鏈表框架,包括創(chuàng)建鏈表、插入節(jié)點(diǎn)、刪除節(jié)點(diǎn)、修改節(jié)點(diǎn)、遍歷節(jié)點(diǎn)和清空鏈表等常見操作,其中每個節(jié)點(diǎn)存儲一個結(jié)構(gòu)體變量,該結(jié)構(gòu)體中包含一個名為data的int類型成員。

#include 
 #include 
 ?
 // 鏈表節(jié)點(diǎn)結(jié)構(gòu)體
 typedef struct ListNode {
     int data;                   // 節(jié)點(diǎn)數(shù)據(jù)
     struct ListNode *next;      // 下一個節(jié)點(diǎn)的指針
 } ListNode;
 ?
 // 創(chuàng)建一個新節(jié)點(diǎn)
 ListNode *createNode(int data) {
     ListNode *node = (ListNode*) malloc(sizeof(ListNode));
     node->data = data;
     node->next = NULL;
     return node;
 }
 ?
 // 在鏈表頭部插入一個新節(jié)點(diǎn)
 ListNode *insertNodeAtHead(ListNode *head, int data) {
     ListNode *node = createNode(data);
     node->next = head;
     return node;
 }
 ?
 // 在鏈表尾部插入一個新節(jié)點(diǎn)
 ListNode *insertNodeAtTail(ListNode *head, int data) {
     ListNode *node = createNode(data);
     if(head == NULL) {
         return node;
     } else {
         ListNode *current = head;
         while(current->next != NULL) {
             current = current->next;
         }
         current->next = node;
         return head;
     }
 }
 ?
 // 刪除鏈表中第一個值為data的節(jié)點(diǎn)
 ListNode *deleteNode(ListNode *head, int data) {
     if(head == NULL) {
         return NULL;
     }
     if(head->data == data) {
         ListNode *current = head;
         head = head->next;
         free(current);
         return head;
     }
     ListNode *current = head;
     while(current->next != NULL && current->next->data != data) {
         current = current->next;
     }
     if(current->next != NULL) {
         ListNode *deleteNode = current->next;
         current->next = deleteNode->next;
         free(deleteNode);
     }
     return head;
 }
 ?
 // 修改鏈表中第一個值為oldData的節(jié)點(diǎn)的數(shù)據(jù)為newData
 void updateNode(ListNode *head, int oldData, int newData) {
     ListNode *current = head;
     while(current != NULL) {
         if(current->data == oldData) {
             current->data = newData;
             break;
         } else {
             current = current->next;
         }
     }
 }
 ?
 // 遍歷鏈表
 void traverseList(ListNode *head) {
     ListNode *current = head;
     while(current != NULL) {
         printf("%d ", current->data);
         current = current->next;
     }
     printf("
");
 }
 ?
 // 清空鏈表,釋放所有節(jié)點(diǎn)的內(nèi)存空間
 void clearList(ListNode *head) {
     while(head != NULL) {
         ListNode *current = head;
         head = head->next;
         free(current);
     }
 }
 ?
 // 示例程序
 int main() {
     ListNode *head = NULL;
     head = insertNodeAtHead(head, 1);
     head = insertNodeAtHead(head, 2);
     head = insertNodeAtTail(head, 3);
     traverseList(head);
     head = deleteNode(head, 2);
     traverseList(head);
     updateNode(head, 1, 4);
     traverseList(head);
     clearList(head);
     return 0;
 }

在上述代碼中,定義了一個節(jié)點(diǎn)結(jié)構(gòu)體ListNode,其中包含一個int類型的data成員和一個指向下一個節(jié)點(diǎn)的指針。接著定義了用于創(chuàng)建新節(jié)點(diǎn)、插入節(jié)點(diǎn)、刪除節(jié)點(diǎn)、修改節(jié)點(diǎn)、遍歷節(jié)點(diǎn)和清空鏈表等操作的子函數(shù),并在main函數(shù)中演示了這些操作的使用例子。在使用完鏈表后一定要調(diào)用clearList函數(shù)釋放內(nèi)存空間。

審核編輯:湯梓紅

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

    關(guān)注

    8

    文章

    3025

    瀏覽量

    74047
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136824
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62618
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70563
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40130
收藏 人收藏

    評論

    相關(guān)推薦

    Qt(C++)使用SQLite數(shù)據(jù)庫完成數(shù)據(jù)增刪改

    當(dāng)前文章介紹的設(shè)計的主要功能是利用 SQLite 數(shù)據(jù)庫實(shí)現(xiàn)寵物投喂器上傳數(shù)據(jù)的存儲,并且支持?jǐn)?shù)據(jù)的增刪改操作。其中,寵物投喂器上傳的數(shù)據(jù)包括投喂間隔時間、水溫、剩余重量等參數(shù)。
    的頭像 發(fā)表于 06-21 09:10 ?1799次閱讀
    Qt(<b class='flag-5'>C</b>++)使用SQLite數(shù)據(jù)庫完成數(shù)據(jù)<b class='flag-5'>增刪改</b><b class='flag-5'>查</b>

    Mybatis自動生成增刪改代碼

    使用 mybatis generator 自動生成代碼,實(shí)現(xiàn)數(shù)據(jù)庫的增刪改。 1 配置Mybatis插件 在pom文件添加依賴: pluginsplugin
    的頭像 發(fā)表于 01-13 15:43 ?1101次閱讀
    Mybatis自動生成<b class='flag-5'>增刪改</b><b class='flag-5'>查</b>代碼

    Qt(C++)使用SQLite數(shù)據(jù)庫完成數(shù)據(jù)增刪改

    當(dāng)前文章介紹的設(shè)計的主要功能是利用 SQLite 數(shù)據(jù)庫實(shí)現(xiàn)寵物投喂器上傳數(shù)據(jù)的存儲,并且支持?jǐn)?shù)據(jù)的增刪改操作。其中,寵物投喂器上傳的數(shù)據(jù)包括投喂間隔時間、水溫、剩余重量等參數(shù)。
    的頭像 發(fā)表于 08-28 11:34 ?1883次閱讀

    使用DOM對XML讀取進(jìn)行增刪改

    DOM解析XML的增刪改實(shí)現(xiàn)
    發(fā)表于 06-12 16:01

    基于SpringBoot mybatis方式的增刪改實(shí)現(xiàn)

    SpringBoot mybatis方式實(shí)現(xiàn)增刪改
    發(fā)表于 06-18 16:56

    使用jpa和thymeleaf做增刪改示例

    【本人禿頂程序員】springboot專輯:springboot+jpa+thymeleaf增刪改示例
    發(fā)表于 04-01 11:49

    如何用php調(diào)用mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪改

    php調(diào)用mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪改
    發(fā)表于 04-09 12:53

    laravel框架如何進(jìn)行簡單的增刪改和文件上傳

    laravel框架簡單的增刪改和文件上傳
    發(fā)表于 04-26 14:13

    python是如何實(shí)現(xiàn)hbase增刪改

    hbase shell是怎樣去創(chuàng)建命名空間的?python是如何實(shí)現(xiàn)hbase增刪改的?求解
    發(fā)表于 10-19 07:26

    LINQ的增刪改源碼 v0.1

    LINQ的增刪改源碼 v0.1.rar 聲明:            
    發(fā)表于 02-08 14:21 ?20次下載

    C語言實(shí)現(xiàn)鏈表舉例

    所謂鏈表,就是用一組任意的存儲單元存儲線性表元素的一種數(shù)據(jù)結(jié)構(gòu)。鏈表又分為鏈表、雙向鏈表和循環(huán)鏈表
    發(fā)表于 07-11 16:40 ?87次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言實(shí)現(xiàn)</b><b class='flag-5'>單</b><b class='flag-5'>鏈表</b>舉例

    PHP數(shù)據(jù)庫教程之增刪改的數(shù)據(jù)高級操作資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是PHP數(shù)據(jù)庫教程之增刪改的數(shù)據(jù)高級操作資料免費(fèi)下載。
    發(fā)表于 07-02 17:40 ?1次下載

    SQLite數(shù)據(jù)庫增刪改

    SQLite數(shù)據(jù)庫增刪改? SQLite是一種輕量級的RDBMS(關(guān)系型數(shù)據(jù)庫管理系統(tǒng)),具有速度快、易用性高等優(yōu)點(diǎn)。雖然SQLite數(shù)據(jù)庫相對于一些大型數(shù)據(jù)庫管理系統(tǒng)而言功能上存在較多的限制
    的頭像 發(fā)表于 08-28 17:09 ?1209次閱讀

    mysql數(shù)據(jù)庫的增刪改sql語句

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),是許多網(wǎng)站和應(yīng)用程序的首選數(shù)據(jù)庫。在MySQL中,我們可以使用SQL(結(jié)構(gòu)化查詢語言)進(jìn)行數(shù)據(jù)的增刪改操作。本文將詳細(xì)介紹MySQL數(shù)據(jù)庫的增刪改
    的頭像 發(fā)表于 11-16 15:41 ?1245次閱讀

    數(shù)據(jù)庫mysql基本增刪改

    MySQL是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),常用于Web應(yīng)用程序的數(shù)據(jù)存儲和管理。通過使用MySQL,用戶可以進(jìn)行數(shù)據(jù)的增刪改操作,從而實(shí)現(xiàn)對數(shù)據(jù)的有效管理。下面將詳細(xì)介紹MySQL數(shù)據(jù)庫
    的頭像 發(fā)表于 11-16 16:35 ?1516次閱讀