C语言单链表按数字大小排序,数据结构之单链表的排序(C语言实现)

数据结构之单链表的排序

一、 实现的步骤

1、生成一个单链表 2、对生成的链表排序

二、实现代码

#include

#include              //包含malloc函数,用来实现动态内存的分配

#include                 //包含exit函数,用来退出整个程序

typedef struct Node                //定义一个结构体变量 ,并进行类型定义

{

int data;                    //数据域

struct Node * pNext;        //指针域

}NODE,*PNODE ;                    //NODE 等价于struct Node;PNODE 等价于struct Node *

//注意不要忘记“;”

//函数前置声明

PNODE creat_list(void);            //函数的作用:创建一个链表并返回该链表的头指针(头指针是指向头节点的一个指针),函数不传参

void traverse_list(PNODE);         //函数的作用:遍历一个链表,函数的参数为链表的头指针

bool is_empty(PNODE);            //函数的作用:判断一个函数是否为空,函数的参数为链表的头指针

int length_list(PNODE);            //函数的作用:计算一个链表的长度,函数的参数为链表的头指针

void sort_list(PNODE);            //函数的作用:对一个链表进行排序,函数的参数为链表的头指针

int main (void)

{

PNODE pHead = NULL;

pHead = creat_list();

printf("链表的内容是:");

traverse_list(pHead);

sort_list(pHead);

printf("排序后链表的内容是:");

traverse_list(pHead);

return 0;

}

//创建一个链表

/*

定义一个链表需要什么?

1、有效节点的个数

2、每个节点存放的数据

*/

PNODE creat_list(void)

{

int len;                //用来存放有效节点的个数

int val;                //用来存放用户临时输入的数据

int i;                    //用来控制循环

PNODE pHead = (PNODE)malloc(sizeof(NODE));        //定义一个头节点,并将这个头节点的地址赋值给pHead

//分配完成后首先要确定内存是否分配成功

if(NULL == pHead)

{

printf("内存分配失败,程序结束!!!\n");

exit(-1);

}

printf("请输入您要生成的节点个数:\nlen =");

scanf("%d",&len);

PNODE pTail = pHead;                            //定义一个尾节点。当只有一个头节点时这个头节点就是尾节点

for(i=0;i

{

printf("您输入的第%d个节点的数为:",i+1);

scanf("%d",&val);

PNODE pNew = (PNODE) malloc(sizeof(NODE));    //定义一个临时节点,并将临时节点的地址赋值给pNew

//判断内存是否分配成功

if(NULL == pNew)

{

printf("内存分配失败,程序结束!!!\n");

exit(-1);

}

pNew->data = val;

pNew->pNext = NULL;

pTail->pNext = pNew;                        //将新节点挂到尾节点的后面

pTail = pNew;

}

printf("\n");

return pHead;

}

//遍历一个链表

void traverse_list(PNODE pHead)

{

PNODE p = pHead->pNext;                            //定义一个结构体指针变量p,并赋值为链表头节点的指针域,也就是说指向了第一个有效节点

while(p != NULL)

{

printf("%d ",p->data);

p = p->pNext;

}

printf("\n\n");

return;

}

//判断一个函数是否为空

/*

注意注意注意,重要的事说三遍

C语言没有bool函数,bool函数是C++里面添加的

如果文件的类型是.c,编译器会报错 [Error] unknown type name 'bool'

若文件的扩展类型是.cpp,则可正常编译通过

若一定要用纯C的话,可以在程序开头进行宏定义或类型定义

*/

//判断函数是否为空

bool is_empty(PNODE pHead)

{

if(pHead->pNext == NULL)

return true;        //若函数为空,返回真,否则返回假

else

return false;

}

//计算一个链表的长度(有效节点的个数)

int length_list(PNODE pHead)

{

int length = 0;

PNODE p = pHead->pNext;                //定义一个结构体指针变量p,并赋值为链表头节点的指针域,也就是说指向了第一个有效节点

while(p != NULL)

{

length++;

p = p->pNext;

}

return length;

}

//对链表进行排序 (升序排列)

void sort_list(PNODE pHead)

{

int i,j,t;

int len = length_list(pHead);

PNODE p,q;

for(i=0,p = pHead->pNext; ipNext )

{

for(j = i+1,q = p->pNext;jpNext)

{

if(p->data>q->data)                    //类似于数组中的 a[i]>a[j]

{

t = p->data;                    //类似于数组中的    t=a[i];

p->data = q->data;                //类似于数组中的    a[i]=a[j];

q->data = t;                    //类似于数组中的    a[j]=t;

}

}

}

return;

}

三、程序说明

1、这是我第二次在CSDN写博客,也是刚开始学习数据结构这门课,肯定在一些名词上说的不准确,但我也尽量在注意这个问题,请碰巧看到这篇博客的前辈们能指出不足,必定感激不尽。 2、程序在dev C++中可以通过编译并运行。 3、程序需要注意的问题都在注释里面解释清楚了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值