數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝
概述
單向鏈表分為單向有頭鏈表和單線無(wú)頭鏈表,本文針對(duì)單向有頭鏈表使用C語(yǔ)言來(lái)實(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)文章
HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
本篇文章是對(duì)HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++中Socket網(wǎng)絡(luò)編程實(shí)例詳解
這篇文章主要介紹了C++中Socket網(wǎng)絡(luò)編程實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
基于C++實(shí)現(xiàn)柏林噪聲算法(Perlin?Noise)
Perlin噪聲(Perlin?noise,又稱為柏林噪聲)指由Ken?Perlin發(fā)明的自然噪聲生成算法,具有在函數(shù)上的連續(xù)性,并可在多次調(diào)用時(shí)給出一致的數(shù)值。本文將用C++實(shí)現(xiàn)柏林噪聲算法,感興趣的可以了解一下2023-03-03
你真的理解C語(yǔ)言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)
這篇文章主要介紹了你真的理解C語(yǔ)言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù),本篇將引入一個(gè)庫(kù)函數(shù)來(lái)實(shí)現(xiàn)我們希望的順序,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
C++中Copy-Swap實(shí)現(xiàn)拷貝交換
本文主要介紹了C++中Copy-Swap實(shí)現(xiàn)拷貝交換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
詳解C/C++ QT QChart 繪制組件應(yīng)用
Qtcharts 組件基于GraphicsView模式實(shí)現(xiàn),其核心是QChartView和QChart的二次封裝版。本文重點(diǎn)給大家介紹C/C++ QT QChart 繪制組件應(yīng)用的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-11-11

