手撕單鏈表

目錄

鏈表的概念和結構

單鏈表的實現

申請新結點

打印

尾插

頭插

?尾刪

頭刪

??編輯

?查找

在pos位置前插入元素?

?在pos位置后插入元素

刪除pos位置的元素?

?刪除pos位置之后的位置的元素?編輯

完整代碼

SListNode.h

?

SListNode.c


鏈表的概念和結構

鏈表是一種物理存儲上非連續,非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的

鏈式結構邏輯連續,物理不一定連續

單鏈表的實現

無頭 單向 非循環鏈表

申請新結點

打印

尾插

?

頭插

?

?尾刪

?

頭刪

?

?

?查找

在pos位置前插入元素?

?????

?

?在pos位置后插入元素

刪除pos位置的元素?

?

?刪除pos位置之后的位置的元素

完整代碼

SListNode.h

?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int SLTDataType;typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;SLTNode* BuySListNode(SLTDataType x);     //申請一個結點void SListNodePrint(SLTNode* plist);      //打印void SListPushBack(SLTNode** pplist, SLTDataType x);    //尾插void SListPushfront(SLTNode** pplist, SLTDataType x);    //頭插void SListPopBack(SLTNode** pplist);    //尾刪void SListPopfront(SLTNode** pplist);    //頭刪SLTNode* SListFind(SLTNode* plist, SLTDataType x);        //查找void SListInsert(SLTNode** pplist, SLTNode* pos, SLTDataType x);    //在pos位置前插入元素void SListInsertAfter(SLTNode* pos, SLTDataType x);   //在pos位置后插入元素void SListErase(SLTNode** pplist, SLTNode* pos);     //刪除pos位置前的元素void SListEraseAfter(SLTNode* pos);          //刪除pos位置之后的位置的元素

SListNode.c

#define _CRT_SECURE_NO_WARNINGS 1#include "SListNode.h"SLTNode* BuySListNode(SLTDataType x)            //申請一個新結點
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->data = x;newnode->next = NULL;return newnode;
}void SListNodePrint(SLTNode* plist)      //打印
{SLTNode* cur = plist;while (cur){printf(" %d ->", cur->data);cur = cur->next;}printf("NULL");printf("\n");
}void SListPushBack(SLTNode** pplist, SLTDataType x)    //尾插
{assert(pplist);SLTNode* newnode = BuySListNode(x);if (*pplist == NULL){*pplist = newnode;}else{SLTNode* tail = *pplist;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}
}void SListPushfront(SLTNode** pplist, SLTDataType x)    //頭插
{assert(pplist);SLTNode* newnode = BuySListNode(x);newnode->next = *pplist;*pplist = newnode;}void SListPopBack(SLTNode** pplist)    //尾刪
{assert(pplist);assert(*pplist);//空鏈表//一個結點if ((*pplist)->next == NULL){free(*pplist);*pplist = NULL;}//一個以上結點else{SLTNode* tail = *pplist;while (tail->next->next != NULL){tail = tail->next;}free(tail->next);tail->next = NULL;}
}void SListPopfront(SLTNode** pplist)    //頭刪
{assert(pplist);assert(*pplist);SLTNode* cur = *pplist;*pplist = (*pplist)->next;free(cur);
}SLTNode* SListFind(SLTNode* plist, SLTDataType x)        //查找
{SLTNode* cur = plist;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}void SListInsert(SLTNode** pplist, SLTNode* pos, SLTDataType x)    //在pos位置前插入元素
{assert(pplist);assert(pos);if (*pplist == pos){SListPopfront(pplist, x);}else{SLTNode* cur = *pplist;while (cur->next != pos){cur = cur->next;}SLTNode* newnode = BuySListNode(x);newnode->next = cur->next;cur->next = newnode;}
}void SListInsertAfter(SLTNode* pos, SLTDataType x)   //在pos位置后插入元素
{assert(pos);SLTNode* newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;
}void SListErase(SLTNode** pplist, SLTNode* pos)     //刪除pos位置的元素
{assert(pplist);assert(pos);if (*pplist == pos){SListPopfront(pplist);}else{SLTNode* cur = *pplist;while (cur->next->next = pos){cur = cur->next;}cur->next = pos->next;free(pos);pos = NULL;}
}void SListEraseAfter(SLTNode* pos)          //刪除pos位置之后的位置的元素
{assert(pos);assert(pos->next);SLTNode* cur = pos->next;pos->next = cur->next;free(cur);cur = NULL;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41268.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【JavaSE】Java方法的使用

【本節目標】 1. 掌握方法的定義以及使用 2. 掌握方法傳參 3. 掌握方法重載 4. 掌握遞歸 目錄 1.方法概念及使用 1.1什么是方法(method) 1.2 方法定義 1.3 方法調用的執行過程 1.4 實參和形參的關系 2. 方法重載 2.1 為什么需要方法重載 2.2 方法重載概念 3. 遞歸 3.…

【uni-app報錯】獲取用戶收貨地址uni.chooseAddress()報錯問題

chooseAddress:fail the api need to be declared in …e requiredPrivateInf 原因&#xff1a; 小程序配置 / 全局配置 (qq.com) 解決&#xff1a; 登錄小程序后臺申請接口 按照流程申請即可 在項目根目錄中找到 manifest.json 文件&#xff0c;在左側導航欄選擇源碼視圖&a…

杭電比賽總結

我們的隊伍&#xff1a;team013 另外兩隊&#xff1a;team014、team015 ? 今天是我第一次打杭電&#xff0c;發現杭電多數都是猜結論題 先給一下我們的提交數據 Submit TimeProblem IDTimeMemoryJudge Status4:59:59101115 MS1692 KWrong Answer4:59:55101115 MS1684 KWrong…

Java算法_ 檢查對稱樹(LeetCode_Hot100)

題目描述&#xff1a;給你一個二叉樹的根節點 &#xff0c; 檢查它是否軸對稱。root 獲得更多&#xff1f;算法思路:代碼文檔&#xff0c;算法解析的私得。 運行效果 完整代碼 /*** 2 * Author: LJJ* 3 * Date: 2023/8/17 8:47* 4*/ public class SymmetricTree {static class…

vue之動態表單(優化)

代碼資源在這兒 ↑ vue之動態表單優化 vue2js動態表單優化vue3ts動態表單優化 vue2js動態表單優化 效果圖 目錄結構 五個文件的完整代碼: 以下是App.vue <template><div><router-view></router-view><Formpage /></div> </templa…

【LeetCode】647.回文子串

題目 給你一個字符串 s &#xff0c;請你統計并返回這個字符串中 回文子串 的數目。 回文字符串 是正著讀和倒過來讀一樣的字符串。 子字符串 是字符串中的由連續字符組成的一個序列。 具有不同開始位置或結束位置的子串&#xff0c;即使是由相同的字符組成&#xff0c;也會…

web連接桌面打開gptmap

一&#xff1a;環境配置 需要的材料&#xff1a; python-3.10.4 我使用的是這個版本的&#xff0c;3.8.10 該版本和以下版本組件組合&#xff0c;驗證過能正常運行&#xff08;python 3.6.8測試異常&#xff09; websockify 該項目有python版本和node js版本 noVNC 形式的app…

Qt Designer設計的界面如何顯示、即運行顯示窗口界面

首先利用Qt Designer設計.ui文件&#xff0c;然后采用Tools->External Tools->PyUIC轉換成.py文件。這個.py文件是.ui文件編譯而來的&#xff0c;將這種文件由.ui文件編譯而來的.py文件稱之為界面文件。由于界面文件每次編譯時候都會初始化&#xff0c;所以需要新建一個.…

Android 13 添加自定義分區,恢復出廠設置不被清除

需求: 客戶有些文件或數據,需要做得恢復出廠設置還存在,故需新增一個分區存儲客戶數據。 要求: a) 分區大小為50M b) 應用層可讀可寫 c) 恢復出廠設置后不會被清除 d) 不需要打包.img e) 不影響OTA升級 缺點: 1).通過代碼在分區創建目錄和文件,會涉及到SeLinux權限的修…

● 123.買賣股票的最佳時機III ● 188.買賣股票的最佳時機IV

123.買賣股票的最佳時機III class Solution { public:int maxProfit(vector<int>& prices) {vector<vector<int>>dp(prices.size(),vector<int>(5));int lenprices.size();if(len0)return 0;dp[0][0]0;dp[0][1]-prices[0];dp[0][2]0;dp[0][3]-pr…

LeetCode150道面試經典題-- 環形鏈表(簡單)

1.題目 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置&…

Java設計模式 (一) 模板方法設計模式

什么是模板方法設計模式? 模板方法設計模式是一種行為型設計模式&#xff0c;它定義了一個算法的骨架&#xff0c;并將一些步驟的具體實現延遲到子類中。模板方法模式可以幫助確保在算法的不同部分中保持一致性&#xff0c;同時也允許子類根據需要進行具體實現。 模板方法模式…

分布式光伏運維平臺在公益場館屋頂光伏發電系統的應用分析

摘要&#xff1a;2021年9月&#xff0c;國家發改委印發烷善能源消費強度和總量雙控制度方案》&#xff0c;提出鼓勵可再生能源的使用&#xff0c;支持可再生能源發展。在這樣的政策推動下&#xff0c;光伏發電市場無疑將迎來高質量發展的新機遇。現結合山東博物館光伏電站日常管…

系統架構設計師---計算機基礎知識之數據庫系統結構與規范化

目錄 一、基本概念 二、 數據庫的結構 三、常用的數據模型 概念數據模型

git add 用法

git add 是 Git 的一個命令&#xff0c;用于將更改的文件加入到暫存區&#xff08;staging area&#xff09;&#xff0c;準備提交這些更改。以下是該命令的常見用法&#xff1a; 添加單個文件 git add 文件名添加多個文件 git add 文件名1 文件名2 ...添加所有當前目錄下的更改…

面試攻略,Java 基礎面試 100 問(十八)

JAVA IO 包 JAVA NIO NIO 主要有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buffer(緩沖區), Selector。 傳統 IO 基于字節流和字 符流進行操作&#xff0c;而 NIO 基于 Channel 和 Buffer(緩沖區)進行操作&#xff0c;數據總是從通道讀取到緩沖區 中&#xff0c;或者…

Linux命令(70)之bzip2

linux命令之bzip2 1.bzip2介紹 linux命令bzip2是用來壓縮或解壓縮文件名后綴為".bz2"的文件 2.bzip2用法 bzip2 [參數] filename bzip2常用參數 參數說明-d解壓縮文件-t測試壓縮文件是否正確-k壓縮后&#xff0c;保留源文件-z強制壓縮-f強制覆蓋已存在的文件-v顯…

TRT8系列—— 版本差異注意事項

TRT8 一個大版本&#xff0c;8.4-、 8.5、 8.6&#xff08;包含預覽功能&#xff09;卻有很多變動&#xff0c;一不注意就發現很混亂&#xff0c;特備注此貼。建議具體case可以參考這個合集&#xff0c;真心安利&#xff1a;https://github.com/NVIDIA/trt-samples-for-hackath…

Go語言GIN框架安裝與入門

Go語言GIN框架安裝與入門 文章目錄 Go語言GIN框架安裝與入門1. 創建配置環境2. 配置環境3. 下載最新版本Gin4. 編寫第一個接口5. 靜態頁面和資源文件加載6. 各種傳參方式6.1 URL傳參6.2 路由形式傳參6.3 前端給后端傳遞JSON格式6.4 表單形式傳參 7. 路由和路由組8. 項目代碼mai…

GaussDB 實驗篇+openGauss的4種1級分區案例

? 范圍分區/range分區 -- 創建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…