C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)
一.為什么使用鏈表
在學(xué)習(xí)鏈表以前,我們存儲數(shù)據(jù)用的方式就是數(shù)組。使用數(shù)組的好處就是便于查找數(shù)據(jù),但缺點也很明顯。
使用前需聲明數(shù)組的長度,一旦聲明長度就不能更改
插入和刪除操作需要移動大量的數(shù)組元素,效率慢
只能存儲一種類型的數(shù)據(jù).
為了解決上述的問題,我們就可以使用鏈表來存儲數(shù)據(jù)。
二.鏈表的概念
概念:鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的
三.鏈表的實現(xiàn)
3.1 創(chuàng)建鏈表前須知
結(jié)點:鏈表中每一個元素稱為“結(jié)點”,每個結(jié)點都應(yīng)包括兩個部分:一為用戶需要用的實際數(shù)據(jù);二為下一個結(jié)點的地址,
頭結(jié)點:在單鏈表的第一個結(jié)點之前附設(shè)一個結(jié)點,這個節(jié)點不存儲數(shù)據(jù),稱之為頭結(jié)點
3.2 定義結(jié)構(gòu)體
#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int SLDateType; //鏈表中存儲的數(shù)據(jù)類型,可換成其他 typedef struct SListNode { SLDateType date; struct SListNode* next; //指向下一個節(jié)點的指針 }SListNode;
3.3 申請一個節(jié)點
SListNode* BuyListNode(SLDateType x) { SListNode* newNode = (SListNode*)malloc(sizeof(SListNode)); if (NULL == newNode) { printf("malloc error\n"); //內(nèi)存開辟失敗 exit(-1); } else { newNode->date = x; // 給新節(jié)點賦值 newNode->next = NULL; } return newNode; }
3.4 鏈表的頭插
void SListPushFront(SListNode** pphead/*要改動頭指針,所以要傳遞二級指針*/, SLDateType x) { SListNode* newNode = BuyListNode(x); //申請節(jié)點 newNode->next = *pphead; *pphead = newNode; }
3.5 鏈表的尾插
void SListPushBack(SListNode** pphead, SLDateType x) { SListNode* newNode = BuyListNode(x); if (*pphead == NULL) //若頭指針為空,則鏈表為空鏈表,直接將新節(jié)點接到頭指針后 { *pphead = newNode; } else { SListNode* tail = *pphead; while (tail->next != NULL) //找鏈表的尾部 { tail = tail->next; } tail->next = newNode;//將新節(jié)點接到尾部 } }
3.6 鏈表的尾刪
void SListPopBack(SListNode** pphead) { assert(pphead); if (*pphead == NULL)//鏈表為空,則不進行任何操作 { return; } else if ((*pphead)->next == NULL) //鏈表只有一個節(jié)點 { free(*pphead); *pphead = NULL; } else//其余情況 { SListNode* tail = *pphead; //鏈表的尾部節(jié)點 SListNode* pre = NULL;//鏈表尾的前一個節(jié)點 while (tail->next != NULL)//找尾 { pre = tail; tail = tail->next; } pre->next = tail->next; //將尾節(jié)點的指針域賦值給前一個節(jié)點的指針域 free(tail); } }
3.7 鏈表的頭刪
void SListPopFront(SListNode** pphead) { assert(pphead); if (*pphead == NULL) //鏈表為空什么也不做 { return; } else { SListNode* head = *pphead;//記錄原本的第一個節(jié)點 *pphead = head->next; //讓頭指針指向第二個節(jié)點 free(head);//釋放第一個節(jié)點 } }
3.8 尋找某節(jié)點
SListNode* SListFind(SListNode* phead, SLDateType x) { SListNode* cur = phead; while (cur != NULL) { if (cur->date == x) //找到則返回該節(jié)點 { return cur; } cur = cur->next; } return NULL; //未找到則返回空 }
3.9 在指定節(jié)點前插入節(jié)點
void SListInsert(SListNode** pphead, SListNode* pos/*要插入的位置*/, SLDateType x) { assert(pphead); assert(pos); if (*pphead == pos) { SListPushFront(pphead, x); } else { SListNode* cur = *pphead; //當(dāng)前所指向的位置 SListNode* pre = NULL; //前一個節(jié)點 while (cur != pos) { pre = cur; cur = cur->next; } SListNode* newNode = BuyListNode(x); pre->next = newNode; newNode->next = cur; } }
3.10 刪除指定節(jié)點前的節(jié)點
void SListErase(SListNode** pphead, SListNode* pos/*要插入的位置*/) { assert(pphead); assert(pos); if (*pphead == pos) { SListPopFront(pphead); } else { SListNode* cur = *pphead; SListNode* pre = *pphead; while (cur != pos) { pre = cur; cur = cur->next; } pre->next = cur->next; free(cur); } }
3.11 鏈表的銷毀
void SListDestory(SListNode** pphead) { if (*pphead == NULL) { return; } else { while (*pphead != NULL) { SListNode* cur = *pphead; *pphead = cur->next; free(cur); } } }
到此這篇關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言 單鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Win32應(yīng)用程序(SDK)設(shè)計原理詳解
這篇文章主要介紹了Win32應(yīng)用程序(SDK)設(shè)計原理,對于理解win32應(yīng)用程序運行原理有很大的幫助,需要的朋友可以參考下2014-08-08C語言中QString與QByteArray互相轉(zhuǎn)換的方法
本文主要介紹了C語言中QString與QByteArray互相轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05深入分析為Visual Assist設(shè)置快捷鍵的方法
本篇文章是對為Visual Assist設(shè)置快捷鍵的方法進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05OpenCV4.1.0+VisualStudio2019開發(fā)環(huán)境搭建(超級簡單)
這篇文章主要介紹了OpenCV4.1.0+VisualStudio2019開發(fā)環(huán)境搭建(超級簡單),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C語言中函數(shù)指針與軟件設(shè)計經(jīng)驗總結(jié)
今天小編就為大家分享一篇關(guān)于C語言中函數(shù)指針與軟件設(shè)計經(jīng)驗總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12