算法精讲链表的定义

算法精讲中用c语言定义链表数据结构很具有通用性.

C++一般为节省空间中好多人这样搞.只定义一个节点的结构.当然也可以定义全一点.

struct Node{
   int data;
   Node *next;
};

C中通用做法

//元素typedef struct ListElmt_ {
    void *data;
    struct ListElmt_ *next;
} ListElmt;
//列表typedef struct List_{
    int size;
    int (*math)(const void *key1, const void *key2);
    void (*destroy)(void *data);
    ListElmt *head;
    ListElmt *tail;
} List;
 

C 语言 完整的定义

//list.h

#ifndef list_h
#define list_h

#include <stdio.h>
#include <stdlib.h>

/**
 structure for linked list elements.
 */
typedef struct ListElmt_ {
    void *data;
    struct ListElmt_ *next;
} ListElmt;

/**
 structure for linked lists.
 */
typedef struct List_{
    int size;
    int (*math)(const void *key1, const void *key2);
    void (*destroy)(void *data);
    ListElmt *head;
    ListElmt *tail;
} List;

void list_init(List *list, void (*destory)(void *data));
void list_destory(List *list);
int list_ins_next(List *list, ListElmt *element, const void *data);
int list_rem_next(List *list, ListElmt *element, void **data);

#define list_size(list) ((list)->size)
#define list_head(list) ((list)->head)
#define list_tail(list) ((list)->tail)
#define list_is_head(list,element) ((element) == (list)->head ? 1 : 0)
#define list_is_tail(element) ((element)->next == NULL ? 1: 0)
#define list_data(element) ((element)->data)
#define list_next(element) ((element)->next)

#endif /* list_h */

//list.c

#include "list.h"
#include <stdlib.h>
#include <string.h>

void list_init(List *list, void (*destory)(void *data)) {
    list->size = 0;
    list->destroy = destory;
    list->head = NULL;
    list->tail = NULL;
    return;
}

void list_destory(List *list) {
    void *data;
    while (list_size(list) > 0 ) {
        if (list_rem_next(list, NULL, (void **)&data) == 0 && list -> destroy != NULL) {
            list->destroy(data);
        }
    }
    memset(list, 0, sizeof(List));
    return;
}

int list_ins_next(List *list, ListElmt *element, const void *data) {
    ListElmt *new_element;
    //allocate storage for the element.
    if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL) {
        return -1;
    }
    //Insert the element into the list.
    new_element->data = (void *)data;
    if (element == NULL) {
        //Handle insertion at the head of the list.
        if (list_size(list) == 0) {
            list->tail = new_element;
        }
        new_element->next = list->head;
        list->head = new_element;
    }else {
        //Handle insertion somewhere other than at the head.
        if (element->next == NULL) {
            list->tail = new_element;
            new_element->next = element->next;
            element->next = new_element;
        }
    }
    //Adjust the size of the list to account for the inserted element.
    list->size++;
    return 0;
}

int list_rem_next(List *list, ListElmt *element, void **data) {
    ListElmt *old_element;
    //Do not allow removal from an empty list.
    if (list_size(list) == 0) {
        return -1;
    }
    //Remove the element from the list.
    if (element == NULL) {
        //Handler removal from the head of the list.
        *data = list->head->data;
        old_element = list->head;
        list->head = list->head->next;

        if (list_size(list) == 1) {
            list->tail = NULL;
        }
    }else {
        //Handle removal form somewhere other than the head.
        if (element->next == NULL) {
            return -1;
        }
        *data = element->next->data;
        old_element = element->next;
        element->next = element->next->next;
        if (element->next == NULL) {
            list->tail = element;
        }
    }
    //Free the storage allocated by the abstract datatype.
    free(old_element);

    //Adjust the size of the list to account for the removed element.
    list->size--;

    return 0;
}

原文地址:https://www.cnblogs.com/wjw-blog/p/10369503.html

时间: 2024-10-05 16:06:32

算法精讲链表的定义的相关文章

直通BAT算法精讲附程序源码

课程内容第1章 免费试看2 视频 | 2 练习字符串和二叉树问题免费试看1.1 二叉树打印 免费1.2 二叉树打印练习题 免费1.3 字符串 免费1.4 两串旋转练习题 免费 第2章 排序4 视频 | 16 练习详细介绍常见的排序算法过程,以及各个排序算法稳定性.时间和空间复杂度,当然还有常见面试题目的讲解.2.1 排序(1)2.2 冒泡排序练习题2.3 选择排序练习题2.4 插入排序练习题2.5 归并排序练习题2.6 快速排序练习题2.7 堆排序练习题 免费2.8 希尔排序练习题2.9 排序(

基于MFC设计的MINI快跑游戏(游戏开发、MFC精讲、线程与进程通信)

课程讲师:今夜有风    课程分类:游戏开发    适合人群:初级    课时数量:36课时    更新程度:完成    服务类型:C类(普通服务类课程)    用到技术:MFC    涉及项目:MINI快跑游戏 给各位网友分享一套课程,有兴趣的可以加我 2748165793 一.项目简单介绍 MFC简介: MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎.VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develo

深度学习之目标检测常用算法原理+实践精讲 YOLO / Faster RCNN / SSD / 文本检测 / 多任务网络

深度学习之目标检测常用算法原理+实践精讲 YOLO / Faster RCNN / SSD / 文本检测 / 多任务网络 资源获取链接:点击这里 第1章 课程介绍 本章节主要介绍课程的主要内容.核心知识点.课程涉及到的应用案例.深度学习算法设计通用流程.适应人群.学习本门课程的前置条件.学习后达到的效果等,帮助大家从整体上了解本门课程的整体脉络. 1-1 课程导学 第2章 目标检测算法基础介绍 本章节主要介绍目标检测算法的基本概念.传统的目标检测算法.目前深度学习目标检测主流方法(one-sta

玩转算法系列--图论精讲 面试升职必备(Java版)

第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真正地,玩转图论算法:) 第2章 图的基本表示千里之行,驶于足下.解决任何有一个图论算法问题,首先需要用基本的数据结构来表示图.在这一章,我们就将探索图的基本表示问题,学习邻接矩阵和邻接表,进而,也让同学们熟悉这个课程的整体代码风格. 第3章 图的深度优先遍历任何一种数据结构,都需要进行遍历.图也不例外.通过深

深度学习之目标检测常用算法原理+实践精讲

第1章 课程介绍本章节主要介绍课程的主要内容.核心知识点.课程涉及到的应用案例.深度学习算法设计通用流程.适应人群.学习本门课程的前置条件.学习后达到的效果等,帮助大家从整体上了解本门课程的整体脉络. 第2章 目标检测算法基础介绍本章节主要介绍目标检测算法的基本概念.传统的目标检测算法.目前深度学习目标检测主流方法(one-stage.two-stage.多任务网络).相关算法的基本流程.算法性能的评价指标.不同算法的优缺点和性能比较等,并结合实际的应用场景和案例来介绍目标检测算法的重要性和实用

iOS开发——语法篇OC篇&amp;高级语法精讲二

Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发.下面通过分析Apple开源的Runtime代码(我使用的版本是objc4-646.tar)来深入理解Objective-C的Runtime机制. Runtime数据结构 在Objective-C中,使用[receiver message]语法并不会马上执行receiver对象的message方

Hibernate入门精讲

学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道    什么是Hibernate?    为什么要使用Hibernate?    Hibernate的配置文件的作用是什么?          Hibernate映射文件的作用是什么?     Hibernate持久化对象的状态有哪些? 现在我先上面的问题解决了. 一.我们为什么要学习框架技术? 1.框架技术有哪些? 在Java开发中,我们经常使用Struts.Hibernate和Sp

不看绝对后悔的Linux三剑客之awk实战精讲

一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel).处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用.本章主要讲解awk命令的运用 1.2 awk环境简介 [[email protected] ~]# cat /etc/redhat-release 

2016计算机考研:数据结构常用算法精析

不知道博客园有没有计算机专业的考研党,希望列举的计算机考研考点能帮助大家吧,以下就是数据结构常用算法精析,如果大家看有什么不对的地方,欢迎纠错指正啊哈哈哈.2016考研加油!!!!!!!!! 内部排序(在内存中进行的排序不需要访问外存的)外部排序(排序量很大,通过分批的读写外存,最终完成排序) 稳定排序和非稳定排序:看相同记录的相对次序是否回发生改变.主要看在排序过程中的比较是不是相邻记录,如果是相邻比较,一定是稳定的排序.如果不是相邻的比较,就是不稳定的. 内排序方法 截止目前,各种内排序方法