02 单链表

线性表之链式存储---单链表

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4
  5 // 数据结构
  6 typedef struct node
  7 {
  8     int data;
  9     struct node *next;
 10 }linkList;
 11
 12 // 创建单链表,并初始化
 13 linkList *linkList_init(void)
 14 {
 15     linkList *list = (linkList *)malloc(sizeof(linkList));
 16
 17     if (list == NULL)
 18     {
 19         return NULL;
 20     }
 21
 22     list->next = NULL;
 23
 24     return list;
 25 }
 26
 27 // 添加到链表头
 28 int linkList_add_head(linkList *list, int data)
 29 {
 30     // 参数检查
 31     if (list == NULL)
 32     {
 33         return -1;
 34     }
 35
 36     linkList *node = (linkList *)malloc(sizeof(linkList));
 37     if (node == NULL)
 38     {
 39         return -2;
 40     }
 41
 42     node->data = data;
 43     node->next = list->next;
 44     list->next = node;
 45
 46     return 0;
 47 }
 48
 49 // 添加到链表尾
 50 int linkList_add_tail(linkList *list, int data)
 51 {
 52     // 参数检查
 53     if (list == NULL)
 54     {
 55         return -1;
 56     }
 57
 58     linkList *node = (linkList *)malloc(sizeof(linkList));
 59     if (node == NULL)
 60     {
 61         return -2;
 62     }
 63
 64     node->data = data;
 65     node->next = NULL;
 66
 67     // 找到最后一个节点
 68     linkList *tmp = NULL;
 69     for (tmp = list; tmp->next != NULL; tmp = tmp->next)
 70     {
 71         ;
 72     }
 73
 74     tmp->next = node;
 75
 76     return 0;
 77 }
 78
 79 // 从头开始删除第一个节点,并保存到node中
 80 int linkList_del_head(linkList *list, linkList **node)
 81 {
 82     // 参数检查
 83     if (list == NULL || list->next == NULL)
 84     {
 85         return -1;
 86     }
 87
 88     *node = list->next;
 89
 90     list->next = list->next->next;
 91
 92     (*node)->next = NULL;
 93     return 0;
 94 }
 95
 96 // 从尾部开始删除第一个节点,并保存到node中
 97 int linkList_del_tail(linkList *list, linkList **node)
 98 {
 99     // 参数检查
100     if (list == NULL || list->next == NULL)
101     {
102         return -1;
103     }
104
105     // 记录最后一个节点的前一个节点
106     linkList *tmp = NULL;
107     for (tmp = list; tmp->next->next != NULL; tmp = tmp->next)
108     {
109         ;
110     }
111
112     *node = tmp->next;
113     (*node)->next = NULL;
114
115     tmp->next = NULL;
116
117     return 0;
118 }
119
120 int linkList_printf(linkList *list)
121 {
122     // 参数检查
123     if (list == NULL || list->next == NULL)
124     {
125         return -1;
126     }
127
128     linkList *tmp = NULL;
129     for (tmp = list->next; tmp != NULL; tmp = tmp->next)
130     {
131         printf("%d-", tmp->data);
132     }
133     printf("\n");
134
135     return 0;
136 }
137
138 int linkList_destroy(linkList *list)
139 {
140     linkList *tmp = NULL;
141
142     while (list != NULL)
143     {
144         tmp = list;
145         list = list->next;
146         free(tmp);
147         tmp = NULL;
148     }
149
150     return 0;
151 }
152
153 int main(void)
154 {
155     int i = 0;
156     linkList *list = NULL;
157     linkList *node = NULL;
158
159     list = linkList_init();
160
161     for (i = 0; i < 10; i++)
162     {
163         linkList_add_head(list, i);
164     }
165
166     linkList_printf(list);
167
168     for (i = 0; i < 10; i++)
169     {
170         linkList_add_tail(list, i);
171     }
172
173     linkList_printf(list);
174
175     linkList_del_head(list, &node);
176     printf("node:%d\n", node->data);
177     free(node);
178     node = NULL;
179
180     linkList_printf(list);
181
182     linkList_del_tail(list, &node);
183     printf("node:%d\n", node->data);
184     free(node);
185     node = NULL;
186
187     linkList_printf(list);
188
189     linkList_destroy(list);
190
191     return 0;
192 }
时间: 2024-04-22 11:10:40

02 单链表的相关文章

02循环单链表

循环单链表定义:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成了 一个环,这种头尾相接的单链表成为单循环链表. 循环链表的数据结构: 1 /* c2-2.h 线性表的单链表存储结构 */ 2 struct LNode 3 { 4 ElemType data; 5 struct LNode *next; 6 }; 7 typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */ 代码实现: 1 2 3 /* bo2-4.c 设立

C语言实现单链表-02版

我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1,要是数据很多怎么办,100000个节点,这个main函数得写多长啊... 2,这个连接的方式也太土啦吧!万一某个节点忘记连接下一个怎么办... 3,要是我想知道这个节点到底有多长,难道每次都要从头到尾数一遍嘛... 4,要是我想在尾部添加一个节点,是不是爬也要爬到尾部去啊... 这个是简单版中提出

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

7. C#数据结构与算法 -- 存储结构(单链表)

C#定义并实现单链表 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Linked {     //单链表结点类,采用泛型       public class Node<T> {         private T data; //数据域,当前结点的数据           private 

2-5-归并链式存储的单链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第2章  线性表 - 归并单链表(链式存储) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SinglyLinkedList.c        相关测试数据下载

2-10-归并扩展的线性单链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第2章  线性表 - 归并扩展的线性链表 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? ExtenLinkedList.c        相关测试数据下载  链接

C语言实现单链表-03版

在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4,一个专门遍历数据的功能: Solution 我们的数据结构体定义如下,和上一个版本稍微有所不同: 例如,我们把人这个结构体添加一个name域,前几个版本没有名字的节点: 我们叫起来很尴尬,都是第几个第几个节点,好啦!现在有名字啦! #include <stdio.h> #include <s

深度解析(三)数组、单链表和双链表

数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现.内容包括:数组单向链表双向链表1. C实现双链表2. C++实现双链表3. Java实现双链表 数组 数组有上界和下界,数组的元素在上下界内是连续的. 存储10,20,30,40,50的数组的示意图如下: 数组的特点是:数据是连续的

【数据结构】单链表&amp;&amp;静态链表详解和代码实例

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存储单元.当有节点插入时,系统动态的为结点分配空间.在结点删除时,应该及时释放相应的存储单元,以防止内存泄露.由于是链式存储,所以操作单链表时,必须知道头结点或者头指针的位置.并且,在查找第i个节点时,必须找到第i-1个节点. 1.2 单链表的存储结构代码描述 对于链式存储,通过上一节的讲解相信大家已