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语言版单链表的更多相关文章

  1. 数据结构C语言版--单链表的基本功能实现

    /* * 构造一个链式存储的线性表(当输入9999时,结束构造过程),然后输出该线性表 * 并统计该线性链表的长度 . *注:new和delete是C++的运算符 malloc和free是C++/C的 ...

  2. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  3. C语言实现单链表-02版

    我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...

  4. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  5. C语言实现单链表节点的删除(带头结点)

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

  6. C/C++语言实现单链表(带头结点)

    彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...

  7. C语言实现单链表-01版

    单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难 ...

  8. 「C语言」单链表/双向链表的建立/遍历/插入/删除

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  9. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

随机推荐

  1. python实现常见的设计模式

    Pyhton实现常用的23种设计模式[详解] 关注公众号[轻松学编程],回复[设计模式],获取本文源代码. 在文章末尾可以扫码关注公众号. 一.概念 软件工程中,设计模式是指软件设计问题的推荐方案. ...

  2. Spring框架之beans源码完全解析

    导读:Spring可以说是Java企业开发里最重要的技术.而Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Oriented Programmin ...

  3. 【Kata Daily 190924】Difference of Volumes of Cuboids(长方体的体积差)

    题目: In this simple exercise, you will create a program that will take two lists of integers, a and b ...

  4. 【kata Daily 190905】What's a Perfect Power anyway?(完美幂)

    原题: A perfect power is a classification of positive integers: In mathematics, a perfect power is a p ...

  5. Java自动化测试框架-02 - TestNG之理论到实践

    TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用来做集 ...

  6. css水平垂直居中 三种最常用的方式

    代码在下面,可以直接用. bb两句,个人见解: text-align 是让里面的内容水平居中 line-height 是行高,行高等于元素的高度 就能让内容垂直居中 left和top 50% 是根据h ...

  7. Spring中基于XML的声明式事务控制配置步骤

    1.配置事务管理器 2.配置事务的通知 此时,我们就需要导入事务的约束 tx名称空间和约束,同时也需要aop的 使用tx:advice标签配置事务通知 属性: id:给事务通知起一个唯一标识 tran ...

  8. [MIT6.006] 15. Single-Source Shortest Paths Problem 单一来源的最短路径问题

    首先简单介绍下最大路径问题:给定一个加权图,找到两点之间最短加权路径,本质上就是求两点之间哪条路径的权重和最小.有两种算法去做:Dijkatra和Bellman-Ford,后面几节课会专门讲这两个算法 ...

  9. vite 搭建Vue3.0项目

    1.全局安装vite:npm install create-vite-app -g 2.创建项目:npx create-vite-app project-name 3.cd project-name ...

  10. wait()系统调用分别演示在父子进程

    废话不多说开代码 在父进程调用wait() #include<stdio.h> #include<unistd.h> #include<sys/wait.h> in ...