c语言版单链表
1 //c语言单链表
2 #include <stdio.h>
3 #include <stdlib.h>
4 typedef struct Node
5 {
6 int data;//数据域
7 struct Node *pNext;//指针域
8 }NODE,*PNODE;////NODE等价于struct Node PNODE等价于struct Node *
9 //函数声明
10 PNODE create_list();//创建链表
11 void traverse_list(PNODE pHead);//遍历链表
12 int is_empty(PNODE pHead);//判断链表是否为空
13 int length_list(PNODE);//求链表长度
14 int insert_list(PNODE pHead, int pos, int val);//在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始
15 int delete_list(PNODE pHead, int pos, int *pVal);//删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中, 并且pos的值是从1开始
16 void sort_list(PNODE);//对链表排序
17
18 PNODE create_list()
19 {
20 int len;//用来存放有效节点的个数
21 int i;
22 int val;//用来临时存放用户输入的节点的值
23
24 //分配一个存放有效数据的头结点
25 PNODE pHead = (PNODE)malloc(sizeof(NODE));
26 if (pHead==NULL)
27 {
28 printf("内存分配失败,程序终止\n");
29 exit(-1);
30 }
31 PNODE pTail = pHead;
32 pTail->pNext = NULL;
33
34 printf("请输入要生成的链表的节点个数:len=");
35 scanf("%d", &len);
36
37 for (i=0;i<len;++i)
38 {
39 printf("请输入第%d个节点的值", i + 1);
40 scanf("%d", &val);
41
42 PNODE pNew = (PNODE)malloc(sizeof(NODE));
43 if (pNew==NULL)
44 {
45 printf("内存分配失败,程序终止\n");
46 exit(-1);
47 }
48 pNew->data = val;
49 pTail->pNext = pNew;
50 pNew->pNext = NULL;
51 pTail = pNew;
52 }
53 return pHead;
54 }
55 void traverse_list(PNODE pHead)
56 {
57 PNODE p = pHead->pNext;
58 while (p!=NULL)
59 {
60 printf("%d ", p->data);
61 p = p->pNext;
62 }
63 printf("\n");
64
65 return;
66 }
67
68 int is_empty(PNODE pHead)
69 {
70 if (pHead->pNext==NULL)
71 {
72 return 1;
73 }
74 else
75 {
76 return 0;
77 }
78 }
79 int length_list(PNODE pHead)
80 {
81 PNODE p = pHead->pNext;
82 int len = 0;
83 while (p!=NULL)
84 {
85 ++len;
86 p = p->pNext;
87 }
88 return len;
89 }
90 void sort_list(PNODE pHead)
91 {
92 int i, j, t;
93 int len = length_list(pHead);
94 PNODE p, q;
95 for (i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
96 {
97 for (j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
98 {
99 if (p->data>q->data)//类似a[i]>a[j]
100 {
101 t = p->data;
102 p->data = q->data;
103 q->data = t;
104 }
105 }
106 }
107 return;
108 }
109
110 int insert_list(PNODE pHead, int pos, int val)
111 {
112 int i = 0;
113 PNODE p = pHead;
114
115 while (p!=NULL&&i<pos-1)
116 {
117 p = p->pNext;
118 ++i;
119 }
120 if (i>pos-1||p==NULL)
121 {
122 return 0;
123 }
124 //如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓
125 //分配新的结点
126 PNODE pNew = (PNODE)malloc(sizeof(NODE));
127 if (NULL == pNew)
128 {
129 printf("动态分配内存失败!\n");
130 exit(-1);
131 }
132 pNew->data = val;
133 //将新的节点存入p节点的后面
134 PNODE q = p->pNext;
135 p->pNext = pNew;
136 pNew->pNext = q;
137
138 return 1;
139 }
140
141 int delete_list(PNODE pHead, int pos, int *pVal)
142 {
143 int i = 0;
144 PNODE p = pHead;
145
146 while (p->pNext!=NULL&&i<pos-1)
147 {
148 p = p->pNext;
149 ++i;
150 }
151 if (i>pos-1||p->pNext==NULL)
152 {
153 return 0;
154 }
155 //如果程序能执行到这一行说明p已经指向了第pos-1个结点,并且第pos个节点是存在的
156
157 PNODE q = p->pNext;//q指向待删除的节点
158 *pVal = q->data;
159
160 //删除p节点后面的节点
161 p->pNext = p->pNext->pNext;
162
163 //释放q所指向的节点所占的内存
164 free(q);
165 q = NULL;
166
167 return 1;
168 }
169 int main()
170 {
171 PNODE pHead = NULL;
172 int val,len;
173 pHead = create_list();//create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址付给pHead
174 printf("链表是否为空:\n");
175 if (is_empty(pHead))
176 printf("链表为空!\n");
177 else
178 printf("链表不空!\n");
179
180 traverse_list(pHead);
181 printf("插入操作在第3个位置插入2\n");
182 insert_list(pHead, 3, 2);
183 traverse_list(pHead);
184 printf("插入操作在第4个位置删除\n");
185 if (delete_list(pHead, 4, &val))
186 {
187 printf("删除成功,您删除的元素是: %d\n", val);
188 }
189 else
190 {
191 printf("删除失败!您删除的元素不存在!\n");
192 }
193 traverse_list(pHead);
194 printf("求长度操作\n");
195 len = length_list(pHead);
196 printf("链表的长度是%d\n", len);
197 printf("排序操作\n");
198 sort_list(pHead);
199 traverse_list(pHead);
200 return 0;
201 }
c语言版单链表的更多相关文章
- 数据结构C语言版--单链表的基本功能实现
/* * 构造一个链式存储的线性表(当输入9999时,结束构造过程),然后输出该线性表 * 并统计该线性链表的长度 . *注:new和delete是C++的运算符 malloc和free是C++/C的 ...
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- C语言实现单链表,并完成链表常用API函数
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- C语言实现单链表-01版
单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难 ...
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
随机推荐
- Kubernetes 搭建 ES 集群(存储使用 cephfs)
一.集群规划 使用 cephfs 实现分布式存储和数据持久化 ES 集群的 master 节点至少需要三个,防止脑裂. 由于 master 在配置过程中需要保证主机名固定和唯一,所以搭建 master ...
- 三年工作经验,从小厂离职后,我凭什么拿到了阿里的offer
本篇文章主要记录分享我的面试准备过程. 很多朋友问我为什么离职 关于离职原因,马云有一句经典的话"要么钱没给到位,要么心委屈了",想必大家耳熟能详了,我这里再细说一下我个人离职原因 ...
- [LuoguP1005]矩阵取数游戏 (DP+高精度)
题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...
- think PHP5.1使用时 session重定向丢失问题
查了很多资料,也看了redirect底层代码,具体来说,还是多个用的地方不太对.做个笔记防忘记: 遇重定向后丢失session时: 1.php.ini配置文件,不要自动启动,默认是0,session. ...
- git/SQL/正则表达式的在线练习网站
虽说我没事就喜欢喷应试教育,但我也从应试教育中发现了一个窍门:如果能够以刷题的形式学习某项技能,效率和效果是最佳的.对于技术的学习,我经常面临的困境是,理论知识知道的不少,但是有的场景实在无法模拟,缺 ...
- C语言100题集合005-删除一维数组中所有相同的数,使之只剩一个
系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...
- VSCode--HTML代码片段(基础版,react、vue、jquery)
起因是最近在学习前端,看的网上的demo也是在react.vue.jquery之间穿插,为了方便一键生成html模板(懒)写demo,有了以下折腾. 本人使用的前端编辑工具是vscode(方便.懒), ...
- 13、form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- 7 apache和nginx的区别
7 apache和nginx的区别 nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并 ...
- Redis缓存穿透和雪崩
缓存穿透 用户想要查询一个数据 在redis缓存数据库中没有获取到 就会向后端的数据库中查询. 当用户很多 都去访问后端数据库的话,这就会给数据库带来很大的压力. 常见场景:秒杀活动 等 解决方法: ...