C語言 單向鏈表的增刪查改快速掌握
前言
鏈表是線性表的鏈式存儲結構,它可以以O(1)的時間復雜度進行插入或者刪除,同時由於是鏈式結構相比順序表而言,不會存在空間浪費的情況。而鏈表又分為帶頭單向鏈表,不帶頭單向鏈表,帶頭循環鏈表,不帶頭循環鏈表,帶頭雙向循環鏈表,不帶頭雙向循環鏈表,帶頭雙向鏈表,不帶頭雙向鏈表,總共有八種,其中結構最簡單的是不帶頭單向鏈表,也是實現起來最容易出錯的。並且我們在網上進行鏈表的oj時,題目基本也是不帶頭的單向鏈表,而且也是互聯網大廠面試中最容易考的。
一、創建
typedef int SLTDadaType;//存放的數據類型 struct SListNode { SLTDadaType _data;//存放的數據 struct SListNode* _next;//指向下一個節點的指針 }; typedef struct SListNode SListNode;
二、單向鏈表的函數聲明
SListNode* BuyListNode(SLTDadaType x);//創建一個節點 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);//查找一個節點 void SListModify(SListNode* head, SLTDadaType x,SLTDadaType y);//x修改
三、函數實現
1.創建節點
SListNode* BuyListNode(SLTDadaType x) { SListNode* newnode = (SListNode*)malloc(sizeof(SListNode)); newnode->_data = x; newnode->_next = NULL; return newnode; }
2.尾插節點
SListNode* SListPushBack(SListNode* head, SLTDadaType x) { SListNode* newnode = BuyListNode(x);//無論節點是否為空,都先進行創建一個節點 if (head == NULL) //頭節點為空 { head = newnode; return head; } else //頭節點不為空,直接遍歷到鏈表結尾進行尾插 { 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.隻有一個節點 //3.有多個節點 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) //利用前指針來保存要刪除的節點的前一個節點 { 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.查找節點
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("對不起,您要修改的值不存在\n"); } }
總結
本篇文章主要是針對單向鏈表一些基本操作的代碼實現,若有寫的錯誤或值得改進的地方,請大傢多多留言指出。
最後,也請大傢多多支持,求關註!!!
到此這篇關於C語言 單向鏈表的增刪查改快速掌握的文章就介紹到這瞭,更多相關C語言 單向鏈表內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!