c语言之单链表的创建及排序
2015-09-05 17:18
609 查看
今天对之前学习过的链表知识进行简单的总结顺便写点代码;创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数
下面代码贴出具体代码:
上面的是创建了一个简单的链表,下面我们对链表进行简单的排序:
对于下面的链表排序:我们可以分为三步:
(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); void destroy_list(struct person *head); void show(struct person *head); int main() { struct person *head = NULL; head = insert_tail(head, 20); head = insert_tail(head, 30); head = insert_tail(head, 60); head = insert_tail(head, 50); head = insert_tail(head, 40); show(head); return 0; } /*头插法*/ 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, 20); head = insert_tail(head, 30); head = insert_tail(head, 60); head = insert_tail(head, 50); head = insert_tail(head, 40); 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++中的类拷贝构造函数和模板拷贝构造函数
- POJ C++程序设计 编程题#1 List
- C++模板学习之单链表的实现
- 考虑用赋值运算符(op=)取代其单独形式(op)(More Effective C++_22(效率))
- c++primer之顺序容器(添加元素)
- operator new在C++中的各种写法
- C++11 区间迭代
- 用C++写个方法,打印输入文件的最后K行
- C++中static_cast和dynamic_cast
- 关于SAPI的两段小代码(c++)
- C++入门经典 笔记 (第十六章)使用继承扩展类
- 【c++】大牛解析虚函数表
- 浅谈C++设计模式之单例模式
- 利用重载避免隐式类型转换(More Effective C++_21(效率))
- 返回值优化(More Effective C++_20(效率))
- __cdecl 、__fastcall、__stdcall
- c++文件操作
- C++内存详解
- Effective C++——条款22(第4章)
- 简单的C++游戏载入界面设计