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

C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表

 更新時(shí)間:2021年11月26日 10:38:19   作者:swwlqw  
這篇文章主要為大家詳細(xì)介紹了c語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了c語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表的具體代碼,供大家參考,具體內(nèi)容如下

忽然想起來(lái),大概在兩年之前學(xué)習(xí)C語(yǔ)言的時(shí)候,曾經(jīng)用C語(yǔ)言寫(xiě)過(guò)一些通用的數(shù)據(jù)結(jié)構(gòu)。主要也就實(shí)現(xiàn)了鏈表、隊(duì)列、椎、HashSet,還有HashMap。當(dāng)時(shí)只是知道標(biāo)準(zhǔn)的C語(yǔ)言中沒(méi)有這方面的類庫(kù),后來(lái)才知道有很多第三方的類似這樣的類庫(kù)。廢話不多說(shuō),先把代碼粘過(guò)來(lái)。

下面實(shí)現(xiàn)的是通用鏈表,注意鏈表中只存儲(chǔ)了指針,沒(méi)有儲(chǔ)存實(shí)際的數(shù)據(jù)。

頭文件

/*************************
*** File myList.h
**************************/
 
#ifndef MYLIST_H_INCLUDED
#define MYLIST_H_INCLUDED
#include <stdio.h>
 
 
typedef struct myNode
{
    void * data;
    struct myNode *next;
} MyNode;
 
typedef struct myList
{
    MyNode * first;
    MyNode * last;
    int count;
    int (*equal)(void * a, void * b);
} MyList;
 
typedef struct myListIterator
{
    MyNode * p;
    int count;
    int allSize;
} MyListIterator;
 
//創(chuàng)建鏈表
MyList * createMyList();
 
//創(chuàng)建鏈表,帶有相等參數(shù),用于查找
MyList * createMySearchList(int(*equal)(void * a, void * b));
 
//釋放鏈表
void freeMyList(MyList * list);
 
//插入在尾部
void myListInsertDataAtLast(MyList* const list, void* const data);
 
//插入在首部
void myListInsertDataAtFirst(MyList * const list, void* const data);
 
//插入
void myListInsertDataAt(MyList * const list, void* const data, int index);
 
//刪除在尾部
void* myListRemoveDataAtLast(MyList* const list);
 
//刪除在首部
void* myListRemoveDataAtFirst(MyList * const list);
 
//刪除
void* myListRemoveDataAt(MyList* const list, int index);
 
//刪除對(duì)象,返回是否刪除成功
int myListRemoveDataObject(MyList* const list, void * data);
 
//長(zhǎng)度
int myListGetSize(const MyList * const list);
 
//打印
void myListOutput(const MyList * const list, void(*pt)(const void * const));
 
//取得數(shù)據(jù)
void* myListGetDataAt(const MyList * const list, int index);
 
//取得第一個(gè)數(shù)據(jù)
void* myListGetDataAtFirst(const MyList * const list);
 
//取得最后一個(gè)數(shù)據(jù)
void* myListGetDataAtLast(const MyList * const list);
 
//查找某個(gè)數(shù)據(jù)的位置,如果equal方法為空,比較地址,否則調(diào)用equal方法
//如果不存在返回-1,如果存在,返回出現(xiàn)的第一個(gè)位置
int myListFindDataIndex(const MyList * const list, void * data);
 
//創(chuàng)建遍歷器
MyListIterator* createMyListIterator(const MyList * const list);
 
//釋放遍歷器
void freeMyListIterator(MyListIterator* iterator);
 
//遍歷器是否有下一個(gè)元素
int myListIteratorHasNext(const MyListIterator* const iterator);
 
//返回遍歷器的下一個(gè)元素
void * myListIteratorNext(MyListIterator* const iterator);
 
#endif // MYLIST_H_INCLUDED

源文件

/*************************
*** File myList.c
**************************/
 
#include "myList.h"
#include <stdlib.h>
//創(chuàng)建鏈表
MyList * createMyList()
{
    MyList * re = (MyList *) malloc(sizeof(MyList));
    re->count = 0;
    re->first = NULL;
    re->last = NULL;
    re->equal = NULL;
    return re;
}
 
//釋放鏈表
void freeMyList(MyList * list)
{
    MyNode * p;
    while (list->first)
    {
        p = list->first->next;
        free(list->first);
        list->first = p;
    }
    free(list);
}
 
//插入在尾部
void myListInsertDataAtLast(MyList * const list, void* const data)
{
    MyNode * node = (MyNode *) malloc(sizeof(MyNode));
    node->data = data;
    node->next = NULL;
    if (list->count)
    {
        list->last->next = node;
        list->last = node;
    }
    else
    {
        list->first = node;
        list->last = node;
    }
    (list->count)++;
}
 
//插入在首部
void myListInsertDataAtFirst(MyList * const list, void* const data)
{
    MyNode * node = (MyNode *) malloc(sizeof(MyNode));
    node->data = data;
    node->next = NULL;
 
    if (list->count)
    {
        node->next = list->first;
        list->first = node;
    }
    else
    {
        list->first = node;
        list->last = node;
    }
    (list->count)++;
}
 
//長(zhǎng)度
int myListGetSize(const MyList * const list)
{
    return list->count;
}
 
//打印
void myListOutput(const MyList * const list, void(*pt)(const void * const))
{
    MyNode * p = list->first;
    while (p)
    {
        (*pt)(p->data);
        p = p->next;
    }
}
 
//刪除在尾部
void* myListRemoveDataAtLast(MyList* const list)
{
    if (list->count == 1)
    {
        return myListRemoveDataAtFirst(list);
    }
    MyNode * p = list->first;
    while (p->next != list->last)
    {
        p = p->next;
    }
    void *re = list->last->data;
    free(list->last);
    p->next = NULL;
    list->last = p;
    (list->count)--;
    return re;
}
 
//刪除在首部
void* myListRemoveDataAtFirst(MyList * const list)
{
    MyNode *p = list->first;
    list->first = p->next;
    void * re = p->data;
    free(p);
    (list->count)--;
    if (list->count == 0)
    {
        list->last = NULL;
    }
    return re;
}
 
//插入
void myListInsertDataAt(MyList * const list, void* const data, int index)
{
    if (index == 0)
    {
        myListInsertDataAtFirst(list, data);
        return;
    }
    if (index == list->count)
    {
        myListInsertDataAtLast(list, data);
        return;
    }
    MyNode * node = (MyNode *) malloc(sizeof(MyNode));
    node->data = data;
    node->next = NULL;
 
    MyNode * p = list->first;
    for (int i = 0; i < index - 1; i++)
    {
        p = p->next;
    }
    node->next = p->next;
    p->next = node;
 
    (list->count)++;
}
 
//刪除
void* myListRemoveDataAt(MyList* const list, int index)
{
    if (index == 0)
    {
        return myListRemoveDataAtFirst(list);
    }
    if (index == list->count - 1)
    {
        return myListRemoveDataAtLast(list);
    }
 
    MyNode * p = list->first;
    for (int i = 0; i < index - 1; i++)
    {
        p = p->next;
    }
    MyNode *tp = p->next;
    p->next = p->next->next;
    void * re = tp->data;
    free(tp);
    (list->count)--;
    return re;
}
 
//取得數(shù)據(jù)
void* myListGetDataAt(const MyList * const list, int index)
{
    if (index == list->count - 1)
    {
        return myListGetDataAtLast(list);
    }
    MyNode * p = list->first;
    for (int i = 0; i < index; i++)
    {
        p = p->next;
    }
    return p->data;
}
 
//取得第一個(gè)數(shù)據(jù)
void* myListGetDataAtFirst(const MyList * const list)
{
    return list->first->data;
}
 
//取得最后一個(gè)數(shù)據(jù)
void* myListGetDataAtLast(const MyList * const list)
{
    return list->last->data;
}
 
//查找某個(gè)數(shù)據(jù)的位置,如果equal方法為空,比較地址,否則調(diào)用equal方法
//如果不存在返回-1,如果存在,返回出現(xiàn)的第一個(gè)位置
int myListFindDataIndex(const MyList * const list, void * data)
{
    MyNode * p = list->first;
    int re = 0;
    if (list->equal)
    {
        while (p)
        {
            if (p->data == data || (*(list->equal))(p->data, data))
            {
                return re;
            }
            re++;
            p = p->next;
        }
 
    }
    else
    {
        while (p)
        {
            if (p->data == data)
            {
                return re;
            }
            re++;
            p = p->next;
        }
    }
    return -1;
}
 
//創(chuàng)建鏈表,帶有相等參數(shù),用于查找
MyList * createMySearchList(int(*equal)(void * a, void * b))
{
    MyList * re = createMyList();
    re->equal = equal;
    return re;
}
 
//創(chuàng)建遍歷器
MyListIterator* createMyListIterator(const MyList * const list)
{
    MyListIterator * re = (MyListIterator *) malloc(sizeof(MyListIterator));
    re->p = list->first;
    re->allSize = list->count;
    re->count = 0;
    return re;
}
 
//釋放遍歷器
void freeMyListIterator(MyListIterator* iterator)
{
    free(iterator);
}
 
//遍歷器是否有下一個(gè)元素
int myListIteratorHasNext(const MyListIterator* const iterator)
{
    return iterator->count < iterator->allSize;
}
 
//返回遍歷器的下一個(gè)元素
void * myListIteratorNext(MyListIterator* const iterator)
{
    void * re = iterator->p->data;
    iterator->p = iterator->p->next;
    (iterator->count)++;
    return re;
}
 
//刪除對(duì)象,返回是否刪除成功
int myListRemoveDataObject(MyList* const list, void * data)
{
    MyListIterator * it = createMyListIterator(list);
    int a = 0;
    while (myListIteratorHasNext(it))
    {
        void * ld = myListIteratorNext(it);
        if (data == ld || (list->equal != NULL && (*(list->equal))(ld, data)))
        {
            a = 1;
            break;
        }
    }
    if (a)
    {
        myListRemoveDataAt(list, it->count - 1);
    }
    return a;
}

測(cè)試文件

/*************************
*** File main.c
*** test for MyList
**************************/
#include <stdio.h>
#include <stdlib.h>
#include "myList.h"
 
typedef struct a
{
    int i;
    char c;
} A;
 
void ppt(const void* const p)
{
    A * pp= p;
    printf("%d(%c) ", pp->i, pp->c);
}
 
 
int main()
{
    const int S =10;
 
    //創(chuàng)建并初始化數(shù)據(jù)
    A * data= malloc(sizeof(A)*S);
    for (int i=0; i< S; i++)
    {
        data[i].i=i;
        data[i].c=(char)('A'+0);
    }
 
    //創(chuàng)建鏈表
    MyList * list= createMyList();
 
    //測(cè)試三種插入方法
    myListInsertDataAtLast( list, &data[0]);
    myListInsertDataAtFirst( list, &data[4]);
    myListInsertDataAt(list, &data[1], 1 );
 
 
    //測(cè)試查找
    int index = myListFindDataIndex(list, &data[2]);
    printf("%d\n", index);
    index = myListFindDataIndex(list, &data[4]);
    printf("%d\n", index);
 
    //輸出
    myListOutput(list, ppt );
    puts("");
 
    //測(cè)試使用迭代器輸出
    MyListIterator * it = createMyListIterator(list);
    while(myListIteratorHasNext(it))
    {
        A * pp = myListIteratorNext(it);
        printf("%d[%c] ", pp->i, pp->c);
    }
    puts("");
    //釋放迭代器
    freeMyListIterator(it);
 
    //釋放鏈表
    freeMyList(list);
 
    //釋放數(shù)據(jù)
    free(data);
    return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法

    C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法

    這篇文章主要介紹了C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • opencv如何識(shí)別圖片上帶顏色的圓

    opencv如何識(shí)別圖片上帶顏色的圓

    這篇文章主要為大家詳細(xì)介紹了opencv如何識(shí)別圖片上帶顏色的圓,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C++中函數(shù)匹配機(jī)制詳解

    C++中函數(shù)匹配機(jī)制詳解

    大家好,本篇文章主要講的是C++中函數(shù)匹配機(jī)制詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C++映像劫持后門(mén)實(shí)例分析

    C++映像劫持后門(mén)實(shí)例分析

    這篇文章主要介紹了C++映像劫持后門(mén),實(shí)例分析了C++映像劫持后門(mén)的原理與相關(guān)實(shí)現(xiàn)技巧,有助于進(jìn)一步了解后門(mén)的原理,需要的朋友可以參考下
    2015-04-04
  • C++在同一對(duì)象中存儲(chǔ)左值或右值的方法

    C++在同一對(duì)象中存儲(chǔ)左值或右值的方法

    C++ 代碼似乎經(jīng)常出現(xiàn)一個(gè)問(wèn)題:如果該值可以來(lái)自左值或右值,則對(duì)象如何跟蹤該值?即如果保留該值作為引用,那么就無(wú)法綁定到臨時(shí)對(duì)象,本文給大家介紹了C++在同一對(duì)象中存儲(chǔ)左值或右值的幾種方法,需要的朋友可以參考下
    2025-03-03
  • 讓?xiě)?yīng)用程序只運(yùn)行一個(gè)實(shí)例的實(shí)現(xiàn)方法

    讓?xiě)?yīng)用程序只運(yùn)行一個(gè)實(shí)例的實(shí)現(xiàn)方法

    我們?cè)谑褂谩?60軟件管家》時(shí)發(fā)現(xiàn),在《360軟件管家》已經(jīng)運(yùn)行了的情況下,再次點(diǎn)擊《360軟件管家》的圖標(biāo),那么它不會(huì)再運(yùn)行另外一個(gè)《360軟件管家》,而是將已有的《360軟件管家》給激活,始終只能運(yùn)行一個(gè)《360軟件管家》的實(shí)例
    2013-05-05
  • C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用

    C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用

    本篇文章主要包括內(nèi)聯(lián)函數(shù)和auto關(guān)鍵字。其中,內(nèi)斂函數(shù)包括概念,特性等;auto關(guān)鍵字的使用規(guī)則,使用場(chǎng)景等,接下來(lái)讓我們深入了解
    2022-05-05
  • Qt利用ImageWatch實(shí)現(xiàn)圖片查看功能

    Qt利用ImageWatch實(shí)現(xiàn)圖片查看功能

    Visual Studio有專門(mén)針對(duì)OpenCV開(kāi)發(fā)的插件,名叫ImageWatch,圖片放大之后可以查看RGB的像素值。本文將利用這一查件實(shí)現(xiàn)圖片查看功能,需要的可以參考一下
    2022-04-04
  • C++11中的引用限定符示例代碼

    C++11中的引用限定符示例代碼

    C++中有左值和右值的概念,其實(shí),左值和右值的區(qū)分也同樣適用于類對(duì)象,本文中將左值的類對(duì)象稱為左值對(duì)象,將右值的類對(duì)象稱為右值對(duì)象,對(duì)C++11?引用限定符相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • C語(yǔ)言double和float 實(shí)例分析

    C語(yǔ)言double和float 實(shí)例分析

    本文主要介紹了C語(yǔ)言中的浮點(diǎn)數(shù)(float,double),并通過(guò)實(shí)例代碼進(jìn)行分析比較,希望能幫助學(xué)習(xí)相關(guān)知識(shí)的同學(xué)
    2016-07-07

最新評(píng)論

怀宁县| 郎溪县| 赤峰市| 福海县| 平阴县| 青川县| 会理县| 那曲县| 永康市| 泽州县| 靖安县| 绵竹市| 平和县| 长宁区| 开鲁县| 汉中市| 西畴县| 雷波县| 永济市| 原平市| 公安县| 镇平县| 全南县| 盈江县| 九龙城区| 满城县| 改则县| 喀什市| 陆良县| 浦县| 遂川县| 名山县| 兴化市| 佛坪县| 德惠市| 三江| 泸溪县| 溧阳市| 邓州市| 富顺县| 玛沁县|