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栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
随机推荐
- CSS动画之过渡模块
:hover伪类选择器可以用于所有的选择器(只有在悬停时,执行选择器的属性)CSS3中新增过渡模块:transition property(属性)duration(过渡效果花费的时间)timing-f ...
- 时间UTC格式装换php时间格式
date_default_timezone_get("UTC");date("Y-m-d", strtotime("2017-11-13T18:04: ...
- django支持多语言
Django支持多语言切换 下面介绍下如何使网站或APP国际化,让其支持多种语言 . 官网 效果 1.创建locale文件夹 先在项目根目录下创建一个名为locale的文件夹,这个文件夹是用来存放dj ...
- 微服务通信之ribbon实现原理
前言 上一篇我们知道了feign调用实现负载均衡是通过集成ribbon实现的.也较为详细的了解到了集成的过程.现在我们看一下ribbo是如何实现负载均衡的.写到这里我尚未去阅读源代码,我在这里盲猜一下 ...
- 【jmeter】实现接口关联的两种方式:正则表达式提取器和json提取器
关联通俗来讲就是把上一次请求的返回内容中的部分截取出来保存为参数,用来传递给下一个请求使用. 示例: 1.用户密码进行登录,登录后生成authentication 2.需要将登录接口响应结果中auth ...
- Mybatis之plugin插件设计原理
大多数框架,都支持插件,用户可通过编写插件来自行扩展功能,Mybatis也不例外. 我们从插件配置.插件编写.插件运行原理.插件注册与执行拦截的时机.初始化插件.分页插件的原理等六个方面展开阐述. 一 ...
- AQS解析
什么是AQS? AQS是JUC内存的基石,它本质上是一个抽象类,定义了多线程下资源争夺与释放的规则和过程,许多实现类都是继承于AQS,使用AQS的骨架. AQS的原理 AQS总体上来看是由一个FIFO ...
- c语言博客作业——顺序结构,分支结构
1.PTA截图 2.本章学习总结 2.1学习内容总结 数据的输入和输出:%d表示输入输出整数 %.lf表示输入浮点数 %.nf表示输出结果保留n位小数 if-else的分支结构可以有限个分类情况进行处 ...
- 09-jQuery案例:爱好选择器
爱好选择器HTML 1 <!DOCTYPE html> 2 <head> 3 <meta charset="UTF-8"> 4 <titl ...
- 也谈模块加载,吐槽CMD
先吐槽CMD,不要没头没脑的搞出个CMD,没意思. 大家都看AMD好了,异步模块加载机制,CMD并没有改变这个模式. 模块加载的关口就是getCurrentScript,每次define被调用的时候, ...