1、链表需要动态开辟存储空间,链表元素连接在一起,但在内存空间中它们是分散开的。

2、单链表只能以一个方向进行遍历

3、释放的是data指向的内存,而不是分配给指针变量data本身的内存空间

int *data;
data = (int*)malloc(sizeof(int));
free(data);

4、single_list.h

#ifndef LIST_H
#define LIST_H//链表单个节点信息
typedef struct _ListElmt
{void *data;//data指向另一个空间数据,删除链表需要://1)释放另外空间数据free(data);2)释放单个链表节点struct _ListElmt *next;
}ListElmt;//链表整体属性
typedef struct _List
{int size;int (*match)(const void *key1, const void *key2);void (*destroy)(void *data);ListElmt *head;ListElmt *tail;
}List; #define list_size(list)     (list->size)
#define list_head(list)     (list->head)
#define list_tail(list)     (list->tail)
#define list_next(element)      (element->next)
#define list_data(element)      (element->data)#define is_head(list,element)       ((element == list->head) ? 1 :0)
#define is_tail(element)            ((element->next == NULL) ? 1 :0)void list_init(List *list, int size, void (*destroy)(void *data));
int list_ins_next(List *list, ListElmt *element, void *data);
int list_rem_next(List *list, ListElmt *element);
#endif

5、single_list.c

#include <stdio.h>
#include <stdlib.h>
#include "single_list.h"//初始化,此时链表为空
void list_init(List *list, int size, void (*destroy)(void *data))
{list->size = size;list->destroy = destroy;list->head = NULL;list->tail = NULL;return;
}
//在element后面插入新节点 ,如果 element为空表示向头结点前面插入
int list_ins_next(List *list, ListElmt *element, void *data)
{ListElmt *new_element;if(( new_element = (ListElmt *)malloc(sizeof(ListElmt)) ) == NULL){return -1;}new_element->data = (void *)data;//如果 element为空表示向头结点前面插入if(element == NULL){//如果链表中还没有节点,则首尾节点都是新节点 if(list->size==0)list->tail=new_element; new_element->next = list->head;list->head = new_element; }else{//如果新节点插入的是链表末端 if(element->next==NULL)list->tail=new_element; new_element->next = element->next;element->next = new_element;}list->size++;return 0;
}
//删除element后面的节点,如果element为空则删除头结点
//data保存删除的节点中数据的地址,该地址是指向具体数据块的data变量的地址
int list_rem_next(List *list, ListElmt *element, void **data)
{ListElmt *old_element;if(list->size == 0){return -1;}if(element == NULL){*data = list->head->data;   old_element = list->head;list->head = list->head->next;if(list->size==1)list->tail=NULL;}else{//如果element后面无节点可删除,报错 if(element->next == NULL)return -1;*data = element->next->data;old_element = element->next; element->next = element->next->next ;//删除 element后面的节点,element可能为最末端的节点 if(element->next == NULL)list->tail = element;}list->size--;free(old_element);return 0;
}void list_destroy(List *list)
{void *data;while(list->size>0){if(list_rem_next(list, NULL, (void **)&data)==0 && list->destroy != NULL){//不仅要删除链表节点还要 删除该节点data指向的数据块 list->destroy(data);}}
}

算法精解----3、单链表相关推荐

  1. 算法精解_C语言 链表_单链表(接口定义+类型实现)

    链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操 ...

  2. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  3. 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)

    下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...

  4. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  5. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

  6. 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)

    设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的). #include <stdio.h> #include<malloc.h> typedef str ...

  7. 数据结构与算法(二)单链表(Singly linked list)

    数据结构与算法(二)单链表(Singly linked list) 链表(Linked list) Python完整功能实现 LeetCode思想实践: 链这个东西大家一定都不陌生, 脖子上有项链, ...

  8. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

  9. 算法精解(三):C语言描述(链表常见问题)

    1.如何判断两个单链表是否相交,如果相交,找出交点(两个链表都不存在环) 如果两个单链表相交,那应该呈"Y"字形,则交点之后的节点是相同的. 所以判断是否相交,只需看两个链表的最后 ...

  10. 【数据结构与算法】带环单链表查找环的入口算法

    带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...

最新文章

  1. QIIME 2教程. 29参考数据库DataResources(2020.11)
  2. 如果你写程序不愿写注释,只有一个原因
  3. banana pi BPI-R1 原理图下载地址:
  4. 两款自动检测代码工具与插件,开源真香
  5. UA OPTI512R 傅立叶光学导论23 透镜成像系统的物理光学模型
  6. 刚刚,阿里发布AI谣言粉碎机,识别准确率达81%
  7. 【深度学习】深度学习两大基础Tricks:Dropout和BN详解
  8. 在一台服务器上搭建多个项目的SVN
  9. 【2021新版】一线大厂 Go 面试题合集
  10. 【网络基础】《TCP/IP详解》学习笔记5
  11. 漫谈广告竞价模式(四)
  12. SQL Server 2014 新建数据库
  13. JDK Dynamic Proxy_JDK动态代理
  14. JAVA B/S系统实现客户端屏幕截图,Java版的QQ截图
  15. java case容易崩溃_一些故障解决的CASE
  16. XDOJ(智慧平台)--分配宝藏(用动态规划dp算法解决)(C语言)
  17. 切换计算机管理员身份,管理员身份运行,教您如何设置以管理员身份运行程序...
  18. echartsx轴数据过多,倾斜45度
  19. 申报快结束!2022年武汉经开区在孵企业房租申报奖励补贴补助、申报条件材料
  20. 开学季将至 华硕重炮手主板让你学习娱乐两不误

热门文章

  1. 遥感图像处理 | 辐射校正
  2. perl脚本的参数输入
  3. win10默认壁纸_小白个人系统安装美化(二)win10系统美化设置篇
  4. 【语音识别】基于DTW算法实现0~9数字含Matlab源码
  5. win8更改计算机锁屏时间,win8如何设置电脑屏保时间设置方法
  6. IR2130与MOSFET驱动电路分析
  7. 利用MentoHUST在路由器上使用锐捷认证来共享校园网
  8. 第14课:JSP动作 JSP param动作(JSP教程 JSP入门实战教程 黄菊华Java网站开发系列教程)
  9. 2020年百度之星程序设计大赛-初赛一(Drink、GPA、Dec)
  10. backtrack5 oracle,BackTrack5(BT5)硬盘安装