下面将实现链表排序的排序和遍历显示功能:

所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn;

head的本身不作为数据节点,head->data保存结点个数.

insert_data(NODE* head) 在head之后插入新增的数据;
show_link_list(NODE* head)显示节点个数和每个节点的数据;
clear_link_list(NODE* head)删除并清空数据节点(不删除头结点);
FUNC_sort_list(NODE* head)对链表进行排序,传的head本身仅仅只作为一个起始地址,并不参与排序. 
              (比如,如果不传head, 传入head->next, 则从head->nxt->next开始进行排序)
FUNC_invert_link_list(NODE* head), 对链表数据节点进行倒序(反转),传的head本身仅仅只作为一个起始地址,并不参与倒序.
              (比如,如果不传head, 传入head->next, 则从head->nxt->next开始进行倒序)
FUNC_sort_list链表排序的实现:
  h -> p -> .... -> pren -> pn -> ..
  核心是 
  {     1. 比较以及节点位置交换swap(p , pn)       pren->next= pn->next;       pn->next= h->next;       h->next= pn;     2. 移动参考系
  }   最容易错的地方: 临界节点的判定. FUNC_invert_link_list链表反转的实现: http://www.cnblogs.com/mylinux/p/4632243.html 
//..............0-9.....

#include <stdio.h>
#include <stdlib.h> #define PR printf typedef struct node
{
long data;
struct node* next;
} NODE, *LIST; NODE* insert_data(NODE* head)
{
PR("please input the integer datas and end with q:\n"); while()
{
char ch[];
scanf("%s", ch); if(ch[]=='q' || ch[] =='Q'){
break;
}else{
long indata = strtol(ch, , );
NODE* temp = NULL; temp = (NODE*) malloc (sizeof(struct node));
temp->data = indata;
temp->next = NULL; temp->next = head->next;
head->next = temp;
head->data++;
}
}
return head;
} void show_link_list(NODE* head)
{
NODE* p = NULL;
if(NULL == head || NULL == head->next) //........, ...;
{
return;
}
printf("the count of data in link = %d, they are :\n", head->data);
p = head->next;
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
} void clear_link_list(NODE* head)
{
if(NULL == head || NULL == head->next)
{
return;
}
NODE* pd = head->next;
for(pd = head->next ; pd != NULL; pd =head->next)
{
head->next = pd->next;
free(pd);
}
}
NODE* FUNC_invert_link_list(NODE* head)
{
if(head == || head->next == ){
return ;
}
NODE* h = head->next; NODE* xpre = h;
NODE* x = h->next; for(; xpre->next != ; x = xpre->next)
{
xpre->next = x->next;
x->next = h;
h = x;
} head->next= h;
printf("FUNC_invert_link_list completed!\n");
return head;
}
void FUNC_sort_list(NODE* head)
{
if(NULL == head || NULL == head->next || head->next->next == NULL)
{
return;
}
NODE* h = head;
NODE* p = h->next;
NODE* pren = h->next;
NODE* pn = pren->next; while( p->next != NULL)
{
while(pn != NULL )
{
if(p->data < pn->data)
{
pren->next= pn->next;
pn->next= h->next;
h->next= pn;
//printf(" swapped!\n");
} else{
pren = pren->next;
}
pn = pren->next;
p = h->next;
} h = h->next;
p = h->next;
pren = h->next;
pn = pren->next;
}
printf("FUNC_sort_list completed!\n");
} void FUNC_bub_sort_list(NODE* head)
{
if(NULL == head || NULL == head->next || head->next->next == NULL)
{
return;
} NODE* tail = NULL;
NODE* pre = head;
NODE* p = pre->next;
#define TRUE 1
#define FALSE 0
int is_sorted = FALSE;//未排好 while(pre->next != tail && !is_sorted)
{
while(p->next != tail)
{
is_sorted = TRUE;
if(p->next->data > p->data) //如果发生数据交换,说明没有排好
{
NODE* pn = p->next;
p->next = pn->next;
pn->next = p;
pre->next = pn;
is_sorted = FALSE;
}
pre = pre->next;
p = pre->next;
} tail = p;
pre = head;
p = pre->next;
}
printf("FUNC_bub_sort_list completed!\n");
} void main(void)
{
NODE* head = (NODE*)malloc(sizeof(NODE));
head->next = NULL;
head->data = ; insert_data(head);
show_link_list(head); FUNC_sort_list(head);
show_link_list(head); FUNC_invert_link_list(head);
show_link_list(head); FUNC_bub_sort_list(head);
show_link_list(head); clear_link_list(head);
free(head); }
/*
please input the integer datas and end with q:
12 21 13 133 14 41 15 51 q
the count of data in link = 8, they are :
51 15 41 14 133 13 21 12 FUNC_sort_list completed!
the count of data in link = 8, they are :
133 51 41 21 15 14 13 12 FUNC_invert_link_list completed!
the count of data in link = 8, they are :
12 13 14 15 21 41 51 133 FUNC_bub_sort_list completed!
the count of data in link = 8, they are :
133 51 41 21 15 14 13 12
Press any key to continue . . .
*/

在sort函数里面,

如果某层循环的结束条件写错可能导致段错误,

如果参考系的移动出错可能导致段错误或者第二次的排序不对.

 

c语言:链表排序, 链表反转的更多相关文章

  1. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

  2. C语言 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2输出: 1->2示例 2: 输入: 1->1->2->3-> ...

  3. C语言 链表的使用(链表的增删查改,链表逆转,链表排序)

    //链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...

  4. 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

    关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...

  5. c语言之单链表的创建及排序

    今天对之前学习过的链表知识进行简单的总结顺便写点代码:创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数 下面代码贴出具体代 ...

  6. Leecode刷题之旅-C语言/python-83删除排序链表中的重复元素

    /* * @lc app=leetcode.cn id=83 lang=c * * [83] 删除排序链表中的重复元素 * * https://leetcode-cn.com/problems/rem ...

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

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

  8. C语言实现通用链表初步(一)

    注意:本文讨论的是无头单向非循环链表. 假设不采用Linux内核链表的思路,怎样用C语言实现通用链表呢? 一种常用的做法是: typedef int element_t; struct node_in ...

  9. c语言版单链表

    1 //c语言单链表 2 #include <stdio.h> 3 #include <stdlib.h> 4 typedef struct Node 5 { 6 int da ...

随机推荐

  1. [置顶] 程序员必知(二):位图(bitmap)

    位图是什么? 位图就是数组,一般来说是bit型的数组,具有快速定位某个值的功能,这种思想有很广泛的应用,比如下边两题: 1 找出一个不在5TB个整数中存在的数 假设整数是32位的,总共有4GB个数,我 ...

  2. Linux 环境下 fork 函数和 exec 函数族的使用

    前言 接触 Linux 已经有几个月了,以前在网上看各路大神均表示 Windows 是最烂的开发平台,我总是不以为然,但是经过这段时间琢磨,确实觉得 Linux 开发给我带来不少的便利.下面总结一下学 ...

  3. Python——str(字符串)内部功能介绍

    str内部功能详解: class str(object): """ str(object='') -> str str(bytes_or_buffer[, enco ...

  4. C# Thread Programming Start

    引言 1.理解多线程 2. 线程异步与线程同步 3.创建多线程应用程序 3.1通过System.Threading命名空间的类构建 3.1.1异步调用线程 3.1.2并发问题 3.1.3线程同步 3. ...

  5. cocos2d-x游戏开发系列教程-超级玛丽03-main函数

    代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn main函数内容 #include "m ...

  6. Windows Azure 网站上的 WebSocket 简介

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站最近新增了对 WebSocket 协议的支持..NE ...

  7. redis研究记录

    1 redis安装 wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-st ...

  8. 【JQuery】eval()出现missing after property id 错误。

    是因为数据没有转换成json格式输出就直接eval了. 正确步骤:后台: JsonBinder.buildNormalBinder().toJson(list); 前台: eval('(${posit ...

  9. tomcat编译通过问题

    tomcat  编译后 的类 和 网站目录不能同名!

  10. PHP学习笔记4-类/命名空间/成员方法/类方法

    命名空间 namespace   类 class创建文件Hello.php,namespace是jikexueyuan: <?php /** * Created by PhpStorm. * U ...