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. Kubernetes 使用 Ingress 实现灰度发布功能

    使用 Ingress 实现灰度发布 一.Canary 规则说明 Ingress-Nginx 是一个K8S ingress工具,支持配置 Ingress Annotations 来实现不同场景下的灰度发 ...

  2. 给 Mac 添加右键菜单「使用 VSCode 打开」

    最终的实现效果是在文件 / 文件夹上右击时,会出现菜单项「用 VSCode 打开」,点击后会启动 Visual Studio Code 打开对应的文件 / 文件夹. 实现步骤 打开「自动操作.app」 ...

  3. 假如把Redis服务器们拉到一个群,看看他们是怎么工作的?

    我是Redis,一个叫Antirez的男人把我带到了这个世界上. 那天,Redis基友群里,许久未见的大白发来了一条消息··· 于是,大白拉了一个新的群 以后的日子中,咱们哥仨相互配合,日常工作中最多 ...

  4. Ubuntu17.10 React Native 环境搭建

    React Native 环境搭建 环境:ubuntu17.10 安装依赖 必须安装的依赖有:Node.React Native 命令行工具以及 JDK 和 Andriod Studio. 安装nod ...

  5. leetcode17gas-station

    题目描述 环形路上有n个加油站,第i个加油站的汽油量是gas[i]. 你有一辆车,车的油箱可以无限装汽油.从加油站i走到下一个加油站(i+1)花费的油量是cost[i],你从一个加油站出发,刚开始的时 ...

  6. yum源备份并安装扩展仓库

    yum源相关 默认的YUM源 1.备份默认的YUM源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.ba ...

  7. 【QT】 Qt多线程的“那些事”

    目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...

  8. BIM与GIS融合的意义——从智慧工地到智慧城市

    随着智慧城市概念的发展,BIM与GIS融合的概念深入人心,通过整合BIM的参数化描述建筑组件性质的特性与GIS宏观的几何空间概念,将 BIM 描述单体建筑物的特性通过 GIS 拓展至三维城市. BIM ...

  9. wcf调用时时间参数问题,返回值中有日期格式得值得问题

    第一种情况,客户端在调用wcf后台服务时,参数对象有日期类型得属性,日期默认值不能是datetime.minvalue得值,需要设置大于1971-1-1,不然调不通服务, 第二种情况,服务连通了,并且 ...

  10. 创建ABP Angular客户端(二)使用模板创建Angular前端

    现在我们使用ABP CLI创建Angular客户端. 首先,进入控制台,创建一个空目录,进入这个目录,执行: abp new ZL.Test -u angular 这里我们使用与上一个系列相同的项目名 ...