c语言之单链表的创建及排序
今天对之前学习过的链表知识进行简单的总结顺便写点代码;创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数
下面代码贴出具体代码:
#include <stdio.h>
#include <stdlib.h> struct person {
int age;
struct person *next;
}; struct person *insert_head(struct person *head, int age);
struct person *insert_tail(struct person *head, int age);
void destroy_list(struct person *head);
void show(struct person *head); int main()
{
struct person *head = NULL;
head = insert_tail(head, );
head = insert_tail(head, );
head = insert_tail(head, );
head = insert_tail(head, );
head = insert_tail(head, );
show(head); return ;
} /*头插法*/
struct person *insert_head(struct person *head, int age)
{
struct person *tmp = NULL; tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL; if(NULL == head) {
return tmp;
}
tmp->next = head;
head = tmp; return head;
} /*尾插法*/
struct person *insert_tail(struct person *head, int age)
{
struct person *tmp = NULL;
struct person *find = NULL; tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL; if(NULL == head) {
return tmp;
}
find = head;
while(find->next) {
find = find->next;
}
find->next = tmp; return head;
} /*销毁整个链表*/
void destroy_list(struct person *head)
{
struct person *tmp = NULL; tmp = head->next;
while(tmp) {
head->next = tmp->next;
free(tmp);
tmp = head->next;
}
} /*遍历链表*/
void show(struct person *head)
{
struct person *tmp = head;
while(tmp) {
printf("aeg is %d\n", tmp->age);
tmp = tmp->next;
}
}
上面的是创建了一个简单的链表,下面我们对链表进行简单的排序:
对于下面的链表排序:我们可以分为三步:
(1)在原链表中找到最小的
(2)从原链表摘下最小的
(3)一次插入到新链表
循环直到原链表为空
#include <stdio.h>
#include <stdlib.h> struct person {
int age;
struct person *next;
}; struct person *insert_head(struct person *head, int age);
struct person *insert_tail(struct person *head, int age);
struct person *insert_sort(struct person *head);
void destroy_list(struct person *head);
void show(struct person *head); int main()
{
struct person *head = NULL;
head = insert_tail(head, );
head = insert_tail(head, );
head = insert_tail(head, );
head = insert_tail(head, );
head = insert_tail(head, );
show(head);
printf("------------------------------\n");
head = insert_sort(head);
show(head);
} /*头插法*/
struct person *insert_head(struct person *head, int age)
{
struct person *tmp = NULL; tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL; if(NULL == head) {
return tmp;
}
tmp->next = head;
head = tmp; return head;
} /*尾插法*/
struct person *insert_tail(struct person *head, int age)
{
struct person *tmp = NULL;
struct person *find = NULL; tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL; if(NULL == head) {
return tmp;
}
find = head;
while(find->next) {
find = find->next;
}
find->next = tmp; return head;
} /*销毁整个链表*/
void destroy_list(struct person *head)
{
struct person *tmp = NULL; tmp = head->next;
while(tmp) {
head->next = tmp->next;
free(tmp);
tmp = head->next;
}
} #if 0
/*从大到小*/
struct person *insert_sort(struct person *head)
{
struct person *tmp = NULL;
struct person *newhead = NULL;
struct person *min = NULL;
struct person *min_pre = NULL; if(NULL == head || NULL == head->next)
return head; while(head) {
tmp = head;
min = head;
min_pre = NULL; /*step 1:find min*/
while(tmp->next) {
if(min->age > tmp->next->age) {
min_pre = tmp;
min = tmp->next;
}
tmp = tmp->next;
} /*step 2: cut min*/
if(min == head) {
head = head->next;
min->next = NULL;
}
else {
min_pre->next = min->next;
min->next = NULL;
} /*step 3: insert new list*/
if(NULL == newhead) {
newhead = min;
continue;
}
min->next = newhead;
newhead = min;
} return newhead;
} #else
/*从小到大*/
struct person *insert_sort(struct person *head)
{
struct person *tmp = NULL;
struct person *newhead = NULL;
struct person *newtail = NULL;
struct person *min = NULL;
struct person *min_pre = NULL; if(NULL == head || NULL == head->next)
return head; while(head) {
tmp = head;
min = head;
min_pre = NULL; /*step 1: find min*/
while(tmp->next) {
if(min->age > tmp->next->age) {
min_pre = tmp;
min = tmp->next;
}
tmp = tmp->next;
} /*step 2: cut min*/
if(min == head) {
head = head->next;
min->next = NULL;
}
else {
min_pre->next = min->next;
min->next = NULL;
} /*step 3: insert new list*/
if(NULL == newhead) {
newhead = min;
newtail = min;
continue;
}
newtail->next = min;
newtail = newtail->next;
} return newhead;
}
#endif /*遍历链表*/
void show(struct person *head)
{
struct person *tmp = head;
while(tmp) {
printf("aeg is %d\n", tmp->age);
tmp = tmp->next;
}
}
c语言之单链表的创建及排序的更多相关文章
- C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- C语言实现单链表,并完成链表常用API函数
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- java实现单链表的创建、增、删、改、查
文章目录 单链表的创建.增.删.改.查 1.增加一个节点 2.删除一个节点 3.修改某一个节点 5.遍历单链表 单链表的创建.增.删.改.查 双向链表的增删改查:https://blog.csdn.n ...
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- go语言实现单链表
线性表包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据. 单链表:每个结点包含两部分:数据域+指针域,上一个结点的指针指向下一结点,依次相连,形成链表.特别注意的是每 ...
随机推荐
- R.java文件介绍
HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R { public static final ...
- gdb学习(一)[第二版]
概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...
- 粒子系统属性Life,发射速率和总数的关系
提示,粒子系统的life,发射速率以及总粒子数是相互影响的. 如果你要发射器射出粒子流然后停顿一会,你将简单的必须确保lifetime和发射速率相匹配以至于在发射出的粒子达到粒子总数之前一些粒子是活跃 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (一)
cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...
- RedHat系列软件管理(第二版) --二进制软件包管理
RedHat系列软件管理 --二进制软件包管理 Linux学习思想-Linux相对与Windows来非常透明,因此,无论是系统,还是软件,都会有本身自带,或者是Man给提供的非常详细的说明/帮助文档, ...
- OAF中的MASTER-DETAIL关系
在日常开发中,我们经常会遇到头行结构,并且要求打开界面,行是隐藏的,点击头上的"显示"按钮,才要求头对应的行信息全部显示出来,这样,我们就用到了Master-Detail结构. 下 ...
- 【UML 建模】UML建模语言入门-视图,事物,关系,通用机制
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 一. UML视图 1. Ration ...
- Linux中find的使用(转)
本文转自:迷途花开 另一值得参考的是吴秦先生的博文linux中强大且常用命令:find.grep. find命令用于查找文件和目录,任何位于参数之前的字符串都将被视为欲查找的目录. find 可以指定 ...
- C++开发基础
硬件配置: 586以上PC兼容机或品牌机,配有彩色显示器.鼠标.键盘,内存不小于20MB,硬 盘自由空间不少于60MB.推荐配置为内存32MB或64MB(或以上),硬盘自由空间500MB 以上. 软件 ...
- Sencha touch 2 入门 -------- DataView 显示服务器端JSON文件数据
今天学习了下DataView如何显示JSON文件数据,废话不多说,直接贴代码: 首先看下文件目录: 然后看下我们要处理的JSON文件,bookInfo.json. { "success&qu ...