C語(yǔ)言 單向鏈表的增刪查改快速掌握
前言
鏈表是線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),它可以以O(shè)(1)的時(shí)間復(fù)雜度進(jìn)行插入或者刪除,同時(shí)由于是鏈?zhǔn)浇Y(jié)構(gòu)相比順序表而言,不會(huì)存在空間浪費(fèi)的情況。而鏈表又分為帶頭單向鏈表,不帶頭單向鏈表,帶頭循環(huán)鏈表,不帶頭循環(huán)鏈表,帶頭雙向循環(huán)鏈表,不帶頭雙向循環(huán)鏈表,帶頭雙向鏈表,不帶頭雙向鏈表,總共有八種,其中結(jié)構(gòu)最簡(jiǎn)單的是不帶頭單向鏈表,也是實(shí)現(xiàn)起來最容易出錯(cuò)的。并且我們?cè)诰W(wǎng)上進(jìn)行鏈表的oj時(shí),題目基本也是不帶頭的單向鏈表,而且也是互聯(lián)網(wǎng)大廠面試中最容易考的。
一、創(chuàng)建
typedef int SLTDadaType;//存放的數(shù)據(jù)類型 struct SListNode { SLTDadaType _data;//存放的數(shù)據(jù) struct SListNode* _next;//指向下一個(gè)節(jié)點(diǎn)的指針 }; typedef struct SListNode SListNode;
二、單向鏈表的函數(shù)聲明
SListNode* BuyListNode(SLTDadaType x);//創(chuàng)建一個(gè)節(jié)點(diǎn) SListNode* SListPushBack(SListNode* head, SLTDadaType x);//尾插 SListNode* SListPopBack(SListNode* head);//頭插 SListNode* SListPushFornt(SListNode* head, SLTDadaType x);//尾刪 SListNode* SListPopFornt(SListNode* head);//頭刪 SListNode* SListFind(SListNode* head, SLTDadaType x);//查找一個(gè)節(jié)點(diǎn) void SListModify(SListNode* head, SLTDadaType x,SLTDadaType y);//x修改
三、函數(shù)實(shí)現(xiàn)
1.創(chuàng)建節(jié)點(diǎn)
SListNode* BuyListNode(SLTDadaType x) { SListNode* newnode = (SListNode*)malloc(sizeof(SListNode)); newnode->_data = x; newnode->_next = NULL; return newnode; }
2.尾插節(jié)點(diǎn)
SListNode* SListPushBack(SListNode* head, SLTDadaType x) { SListNode* newnode = BuyListNode(x);//無論節(jié)點(diǎn)是否為空,都先進(jìn)行創(chuàng)建一個(gè)節(jié)點(diǎn) if (head == NULL) //頭節(jié)點(diǎn)為空 { head = newnode; return head; } else //頭節(jié)點(diǎn)不為空,直接遍歷到鏈表結(jié)尾進(jìn)行尾插 { SListNode* tail = head; while (tail->_next != NULL) { tail = tail->_next; } tail->_next = newnode; return head; } }
3.頭插
SListNode* SListPushFornt(SListNode* head, SLTDadaType x) { SListNode* newnode = BuyListNode(x); newnode->_next = head; head = newnode; return head; }
4.尾刪
SListNode* SListPopBack(SListNode* head) { //1.空 //2.只有一個(gè)節(jié)點(diǎn) //3.有多個(gè)節(jié)點(diǎn) if (head == NULL) { return head; } else if (head->_next== NULL) { free(head); head = NULL; return head; } else { SListNode* prev = NULL; SListNode* tail = head; while (tail->_next != NULL) //利用前指針來保存要?jiǎng)h除的節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn) { prev = tail; tail = tail->_next; } free(tail); if (prev != NULL) prev->_next = NULL; return head; } }
5.頭刪
SListNode* SListPopFornt(SListNode* head) { if (head == NULL) { return head; } else { SListNode* cur = head->_next; free(head); head = cur; return head; } }
6.查找節(jié)點(diǎn)
SListNode* SListFind(SListNode* head, SLTDadaType x) { SListNode* cur = head; while (cur) { if (cur->_data == x) { return cur; } else { cur = cur->_next; } } return NULL; }
7.修改
void SListModify(SListNode* head, SLTDadaType x, SLTDadaType y)//x修改 { SListNode* find = SListFind(head, x); if (find) { find->_data = y; } else { printf("對(duì)不起,您要修改的值不存在\n"); } }
總結(jié)
本篇文章主要是針對(duì)單向鏈表一些基本操作的代碼實(shí)現(xiàn),若有寫的錯(cuò)誤或值得改進(jìn)的地方,請(qǐng)大家多多留言指出。
最后,也請(qǐng)大家多多支持,求關(guān)注?。?!
到此這篇關(guān)于C語(yǔ)言 單向鏈表的增刪查改快速掌握的文章就介紹到這了,更多相關(guān)C語(yǔ)言 單向鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)組名不等于指針?sizeof()函數(shù)求數(shù)組大小錯(cuò)誤問題及解決
這篇文章主要介紹了數(shù)組名不等于指針?sizeof()函數(shù)求數(shù)組大小錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11c++實(shí)現(xiàn)簡(jiǎn)單隨機(jī)數(shù)的代碼
在本篇文章里小編給大家整理的是一篇關(guān)于c++實(shí)現(xiàn)簡(jiǎn)單隨機(jī)數(shù)的代碼內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-05-05C++使用郵件槽實(shí)現(xiàn)ShellCode跨進(jìn)程傳輸
在計(jì)算機(jī)安全領(lǐng)域,進(jìn)程間通信(IPC)一直是一個(gè)備受關(guān)注的話題,在本文中,我們將探討如何使用Windows郵件槽(Mailslot)實(shí)現(xiàn)ShellCode的跨進(jìn)程傳輸,需要的可以參考下2023-12-12C語(yǔ)言實(shí)現(xiàn)順序表的基本操作指南(注釋很詳細(xì))
線性表是最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),而順序表又是最簡(jiǎn)單的線性表,其基本思想是用一段地址連續(xù)的儲(chǔ)存單元依次存儲(chǔ)線性表的數(shù)據(jù)元素,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)順序表的基本操作,需要的朋友可以參考下2021-10-10C++使用一棵紅黑樹同時(shí)封裝出map和set實(shí)例代碼
紅黑樹(Red?Black?Tre)是一種自平衡二叉查找樹,是在計(jì)算機(jī)科學(xué)中用到的一種數(shù)據(jù)結(jié)構(gòu),典型的用途是實(shí)現(xiàn)關(guān)聯(lián)數(shù)組,下面這篇文章主要給大家介紹了關(guān)于C++使用一棵紅黑樹同時(shí)封裝出map和set的相關(guān)資料,需要的朋友可以參考下2023-04-04C++實(shí)踐Time類中的運(yùn)算符重載參考方法
今天小編就為大家分享一篇關(guān)于C++實(shí)踐Time類中的運(yùn)算符重載參考方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02linux安裝mysql和使用c語(yǔ)言操作數(shù)據(jù)庫(kù)的方法 c語(yǔ)言連接mysql
Linux下使用C語(yǔ)言操作數(shù)據(jù)庫(kù)的方法,我將從MySQL環(huán)境的搭建,MySQL命令的使用到使用C接口來操作MySQL等過程詳細(xì)的介紹在Linux下管理MySQL數(shù)據(jù)庫(kù)的方法2014-01-01