數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝
概述
單向鏈表分為單向有頭鏈表和單線無頭鏈表,本文針對(duì)單向有頭鏈表使用C語(yǔ)言來實(shí)現(xiàn)并進(jìn)行封裝。
實(shí)現(xiàn)
list_head.h文件
#ifndef _LIST_H_ #define _LIST_H_ typedef int datatype; #define SUCC #define MALLOC_FAIL 1 #define NOHEADNODE 2 #define INDEXFAIL 3 #define LIST_EMPTY 4 #define LIST_NOEMPTY 5 #define FAIL 10 typedef struct List_Node { datatype data; struct List_Node* pNext; }list; list*list_create(); int list_insert_at(list* pHead, int i, datatype* pData); int list_order_insert(list* pHead, datatype* pData); int list_delete_at(list* pHead, int index); int list_delete(list* pHead, datatype* pData); int list_isempty(list* pHead); void list_display(list* pHead); void list_destory(list* pHead); #endif // !_LIST_H_
list_head.c文件
/******************************************************** Copyright (C), 2016-2017, FileName: list Author: woniu201 Description:單向有頭鏈表使用 ********************************************************/ #include <stdio.h> #include "list_head.h" /************************************ @ Brief: 創(chuàng)建鏈表頭 @ Author: woniu201 @ Return: ************************************/ list* list_create() { list* pNode = (list *)malloc(sizeof(list)); memset(pNode, 0, sizeof(list)); if (pNode == NULL) { return MALLOC_FAIL; } pNode->pNext = NULL; return pNode; } /************************************ @ Brief: 按位置插入節(jié)點(diǎn) @ Author: woniu201 @ Return: ************************************/ int list_insert_at(list* pHead, int i, datatype* pData) { int j = 0; if (pHead == NULL) { return NOHEADNODE; } list* pNode = pHead; if (i<0) { return INDEXFAIL; } while (j< i && pNode !=NULL) { pNode = pNode->pNext; j++; } if (pNode == NULL) { return INDEXFAIL; } else { list* newNode = (list*)malloc(sizeof(list)); if (newNode ==NULL) { return MALLOC_FAIL; } memset(newNode, 0, sizeof(list)); newNode->data = *pData; pNode->pNext = newNode; } return SUCC; } /************************************ @ Brief: 按順序插入節(jié)點(diǎn) @ Author: woniu201 @ Return: ************************************/ int list_order_insert(list* pHead, datatype* pData) { if (pHead == NULL) { return NOHEADNODE; } list* pNewNode = (list*)malloc(sizeof(list)); if (pNewNode == NULL) { return MALLOC_FAIL; } memset(pNewNode, 0, sizeof(list)); pNewNode->data = *pData; list* pNode = pHead; if (pNode->pNext == NULL) { pNode->pNext = pNewNode; return SUCC; } while (pNode->pNext != NULL && pNode->pNext->data < *pData) { pNode = pNode->pNext; } if (pNode->pNext) { pNewNode->pNext = pNode->pNext; pNode->pNext = pNewNode; } else { pNode->pNext = pNewNode; } return SUCC; } /************************************ @ Brief: 按位置刪除節(jié)點(diǎn) @ Author: woniu201 @ Return: ************************************/ int list_delete_at(list* pHead, int index) { int j = 0; if (pHead == NULL) { return NOHEADNODE; } if (index < 0) { return INDEXFAIL; } list* pCur = pHead; list* pNode = pHead; while (pCur->pNext) { pNode = pCur; pCur = pCur->pNext; if (index == j) { break; } j++; } if (j< index) { printf("不存在該節(jié)點(diǎn)\n"); return INDEXFAIL; } else { if (pCur->pNext == NULL) { pNode->pNext = NULL; } else { pNode->pNext = pCur->pNext; } free(pCur); pCur = NULL; } return SUCC; } /************************************ @ Brief: 按值刪除節(jié)點(diǎn) @ Author: woniu201 @ Return: ************************************/ int list_delete(list* pHead, datatype* pData) { if (pHead == NULL) { return NOHEADNODE; } list* pCur = pHead; list* pNode = pHead; int bFind = 0; while (pCur->pNext) { pNode = pCur; pCur = pCur->pNext; if (pCur->data == *pData) { bFind = 1; break; } } if (!bFind) { printf("不存在該節(jié)點(diǎn)\n"); return INDEXFAIL; } else { if (pCur->pNext == NULL) { pNode->pNext = NULL; } else { pNode->pNext = pCur->pNext; } free(pCur); pCur = NULL; } return SUCC; } /************************************ @ Brief: 判斷鏈表是否為空 @ Author: woniu201 @ Return: ************************************/ int list_isempty(list* pHead) { if (pHead->pNext == NULL) { return LIST_EMPTY; } else { return LIST_NOEMPTY; } } /************************************ @ Brief: 遍歷打印鏈表 @ Author: woniu201 @ Return: ************************************/ void list_display(list* pHead) { if (list_isempty(pHead) == LIST_EMPTY) { printf("鏈表為空\(chéng)n"); return FAIL; } list* pNode = pHead->pNext; while (pNode) { printf("%d\n", pNode->data); pNode = pNode->pNext; } } /************************************ @ Brief: 釋放鏈表內(nèi)存 @ Author: woniu201 @ Return: ************************************/ void list_destory(list* pHead) { list* pCur = pHead; list* pNext = pHead->pNext; while (pNext) { pNext = pNext->pNext; free(pCur); pCur = NULL; pCur = pNext; } }
main.c 測(cè)試
#include <stdio.h> #include "list_head.h" int main() { list* pHead = list_create(); int data1 = 1; int data2 = 3; int data3 = 2; // int ret = list_insert_at(pHead,0, &data1); // ret = list_insert_at(pHead, 1, &data2); // if (ret == INDEXFAIL) // { // printf("添加索引位置錯(cuò)誤\n"); // } list_order_insert(pHead, &data2); list_order_insert(pHead, &data1); list_order_insert(pHead, &data3); list_delete_at(pHead, 3); int deleteData = 1; list_delete(pHead, &deleteData); list_display(pHead); list_destory(pHead); return 1; }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- 使用C++實(shí)現(xiàn)順序鏈表
- C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建
- C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解
- C++ STL入門教程(2) list雙向鏈表使用方法(附程序代碼)
- 利用C++簡(jiǎn)單實(shí)現(xiàn)順序表和單鏈表的示例代碼
- C++ 實(shí)現(xiàn)雙向鏈表的實(shí)例
- C++中鏈表操作實(shí)例分析
- C/C++ 雙鏈表之逆序的實(shí)例詳解
- C++ 實(shí)現(xiàn)靜態(tài)鏈表的簡(jiǎn)單實(shí)例
- C++刪除鏈表中間節(jié)點(diǎn)的方法
相關(guān)文章
Ubuntu18.04下QT開發(fā)Android無法連接設(shè)備問題解決實(shí)現(xiàn)
本文主要介紹了Ubuntu18.04下QT開發(fā)Android無法連接設(shè)備問題解決實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C語(yǔ)言深入分析浮點(diǎn)型數(shù)據(jù)存儲(chǔ)
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-08-08OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04C語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01Qt(C++)調(diào)用工業(yè)相機(jī)Basler的SDK使用示例
這篇文章主要介紹了Qt(C++)調(diào)用工業(yè)相機(jī)Basler的SDK使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03