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栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
随机推荐
- [Luogu P4777] 【模板】扩展中国剩余定理(EXCRT) (扩展中国剩余定理)
题面 传送门:洛咕 Solution 真*扩展中国剩余定理模板题.我怎么老是在做模板题啊 但是这题与之前不同的是不得不写龟速乘了. 还有两个重点 我们在求LCM的时候,记得先/gcd再去乘另外那个数, ...
- Java基础知识(三)
一.hashCode 与 equals (重要) 面试官可能会问你:"你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?" 1 ...
- Azure DevOps 扩展之 Hub 插件的菜单权限控制配置
这是 Hub 插件的描述配置代码片段: { "contributions": [ { "id": "feature-hidden-fields-man ...
- java获取类路径下文件的绝对路径
获取文件绝对路径 在idea中,默认的当前路径是project的根路径,如果你使用idea的默认路径,只要离开idea换到其他位置,可能当前路径就不是project的根路径了. 使用一下通用方式的前提 ...
- XJOI 夏令营501-511测试11 游戏
Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/(2^p)的概率完成并得到2^(p-1)分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流 ...
- Python基本数据类型与数据结构(数据挖掘学习)
前言 最近工作和研究涉及到数据挖掘和机器学习,出于归纳和总结知识的目的写下这一系列的文章,这一系列文章将会包括Python的基本数据类型和数据结构,函数和面向对象相关的知识,然后会介绍数据挖掘和机器学 ...
- Servlet基础使用总结
Servlet通俗理解:主要功能在于交互式地浏览和生成数据,生成动态Web内容.Servlet运行于支持Java的应用服务器中.从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Ser ...
- 第05组 Alpha冲刺 (1/6)
.th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(二)
解析视频源 目录 解析视频源 获取视频流 解析视频流 说明:这篇博文分为"获取视频流"和"解析视频流"两个部分,使用的是FFmpeg4.1的版本,与网上流传的低 ...
- Fiddler中添加serverIP
以前一直觉得chrome浏览器中能看到remoteIP,真是觉得太酷了!一直想要fiddler也拥有这种技能,有天好奇的在网上搜了一下,真的可以,改造下fiddler脚本即可:上面那句是算接口请求的t ...