最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝

 更新時(shí)間:2018年12月22日 10:04:58   作者:蝸牛201  
今天小編就為大家分享一篇關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

概述

單向鏈表分為單向有頭鏈表和單線無(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)鏈接

相關(guān)文章

  • HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解

    HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解

    本篇文章是對(duì)HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++庫(kù)std::flush的具體使用

    C++庫(kù)std::flush的具體使用

    std::flush是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)操作符,用于刷新輸出流,本文主要介紹了C++庫(kù)std::flush的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C++中Socket網(wǎng)絡(luò)編程實(shí)例詳解

    C++中Socket網(wǎng)絡(luò)編程實(shí)例詳解

    這篇文章主要介紹了C++中Socket網(wǎng)絡(luò)編程實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C++相交鏈表和反轉(zhuǎn)鏈表詳解

    C++相交鏈表和反轉(zhuǎn)鏈表詳解

    這篇文章主要介紹了C++相交鏈表和反轉(zhuǎn)鏈表,結(jié)合實(shí)例形式分析了C++相交鏈表和反轉(zhuǎn)鏈表的原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-08-08
  • 基于C++實(shí)現(xiàn)柏林噪聲算法(Perlin?Noise)

    基于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++ deque容器的具體使用

    C++ deque容器的具體使用

    deque又稱雙端隊(duì)列容器。deque容器中存儲(chǔ)元素并不能保證所有元素都存儲(chǔ)到連續(xù)的內(nèi)存空間中,本文詳細(xì)的介紹了C++ deque容器的使用,感興趣的可以了解一下
    2021-05-05
  • 你真的理解C語(yǔ)言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)

    你真的理解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)拷貝交換

    本文主要介紹了C++中Copy-Swap實(shí)現(xiàn)拷貝交換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • QT實(shí)現(xiàn)用戶登錄注冊(cè)功能

    QT實(shí)現(xiàn)用戶登錄注冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)用戶登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解C/C++ QT QChart 繪制組件應(yīng)用

    詳解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

最新評(píng)論

饶平县| 奇台县| 台东市| 八宿县| 昔阳县| 漳州市| 开化县| 澄迈县| 出国| 电白县| 周口市| 塔城市| 嘉荫县| 隆昌县| 通江县| 广河县| 商河县| 肥东县| 孟州市| 阳信县| 广东省| 丹阳市| 广灵县| 定日县| 康保县| 思南县| 东兰县| 庆元县| 中宁县| 上杭县| 台东市| 章丘市| 昂仁县| 乌兰浩特市| 光泽县| 木里| 湖北省| 布尔津县| 聂拉木县| 乐昌市| 荣成市|