c语言单向链表排序函数,C语言单向链表的实现

采用VS2013编辑器编写的C语言单向链表代码:

#include

#include

typedef  int TypeData;

#define  NODE_LENGTH sizeof(NODE)

/**定义链表的结构体*/

typedef struct tagNode

{

TypeData tdData;

struct tagNode *plNext;

}NODE;

/*******函数声明****************************/

NODE* createList(TypeData tdInData);

int forEachList(NODE* pstInHead);

int insertListTail(NODE* pstInHead, TypeData tdInData);

int insertListHead(NODE* pstInHead, TypeData tdInData);

int getListLength(NODE* pstInHead);

int delListHead(NODE* pstInHead);

int delListTail(NODE* pstInHead);

int sortList(NODE* pstInHead, int nInFlag);

int clearList(NODE* pstInHead);

/*****************************************

函数功能:创建一个新的链表,带头节点

函数入参:tdInData 头结点的值

返回值: 非NULL 成功

NULL 失败

******************************************/

NODE* createList(TypeData tdInData)

{

NODE* pstNewNode = (NODE*)malloc(NODE_LENGTH);

if (NULL == pstNewNode)

{

printf("createList: malloc failed");

return NULL;

}

pstNewNode->plNext = NULL;

pstNewNode->tdData = tdInData;

return pstNewNode;

}

/*****************************************

函数功能:遍历整个链表,把链表的值都显示出来,

函数入参:pstInHead 链表的头结点

返回值:0 成功

1 失败

******************************************/

int forEachList(NODE* pstInHead)

{

if (NULL == pstInHead)

{

printf("forEachList: the parameter pstInHead is NULL");

return 1;

}

while (NULL != pstInHead->plNext)

{

printf("%d-->", pstInHead->tdData);

pstInHead = pstInHead->plNext;

}

printf("%d\n", pstInHead->tdData);

return 0;

}

/*****************************************

函数功能:在链表的尾部插入数据

函数入参:pstInHead 链表的头结点

tdInData 在尾部插入数据的值

返回值: 0 成功

1 失败

******************************************/

int insertListTail(NODE* pstInHead, TypeData tdInData)

{

if (NULL == pstInHead)

{

printf("insertListTail: the parameter pstInHead is NULL");

return 1;

}

while (NULL != pstInHead->plNext)

{

pstInHead = pstInHead->plNext;

}

NODE* pstNewNode = (NODE*)malloc(NODE_LENGTH);

if (NULL == pstNewNode)

{

printf("insertListTail: malloc pstNewNode failed");

return 1;

}

pstNewNode->plNext = NULL;

pstNewNode->tdData = tdInData;

pstInHead->plNext = pstNewNode;

return 0;

}

/*****************************************

函数功能:在链表的首部插入数据,就是在头结点的后面插入数据

函数入参:pstInHead 链表的头结点

tdInData 在尾部插入数据的值

返回值: 0 成功

1 失败

******************************************/

int insertListHead(NODE* pstInHead, TypeData tdInData)

{

if (NULL == pstInHead)

{

printf("insertListHead: the parameter pstInHead is NULL");

return 1;

}

NODE* pstNewNode = (NODE*)malloc(NODE_LENGTH);

if (NULL == pstNewNode)

{

printf("insertListTail: malloc pstNewNode failed");

return 1;

}

pstNewNode->tdData = tdInData;

/**将该节点插入头部*/

pstNewNode->plNext = pstInHead->plNext;

pstInHead->plNext = pstNewNode;

return 0;

}

/*****************************************

函数功能:删除头结点

函数入参:pstInHead 链表的头结点

返回值: 0 成功

1 失败

******************************************/

int delListHead(NODE* pstInHead)

{

if (NULL == pstInHead)

{

printf("delListHead: the parameter pstInHead is NULL");

return 1;

}

int nListLen = getListLength(pstInHead);

NODE* pstTempNode = NULL;

/**链表的长度至少为2的时候,才能删除头部*/

if (nListLen >= 2)

{

pstTempNode = pstInHead->plNext;

pstInHead->plNext = pstInHead->plNext->plNext;

free(pstTempNode);

}

return 0;

}

/*****************************************

函数功能:获得链表的长度,包括头结点

函数入参:pstInHead 链表的头结点

返回值: 0 成功

1 失败

******************************************/

int getListLength(NODE* pstInHead)

{

int nLen = 0;

if (NULL == pstInHead)

{

printf("getListLength: the parameter pstInHead is NULL");

return 1;

}

while (NULL != pstInHead)

{

nLen++;

pstInHead = pstInHead->plNext;

}

return nLen;

}

/*****************************************

函数功能:删除链表的尾节点

函数入参:pstInHead 链表的头结点

返回值: 0 成功

1 失败

******************************************/

int delListTail(NODE* pstInHead)

{

if (NULL == pstInHead)

{

printf("delListTail: the parameter pstInHead is NULL");

return 1;

}

int nListLen = getListLength(pstInHead);

/**如果只有头结点直接返回*/

if (1 == nListLen)

{

return 0;

}

while (NULL != pstInHead->plNext->plNext)

{

pstInHead = pstInHead->plNext;

}

NODE* pstTempNode = pstInHead->plNext;

pstInHead->plNext = NULL;

free(pstTempNode);

return 0;

}

/*****************************************

函数功能:对整个链表进行排序,头结点不参与排序

函数入参:pstInHead 链表的头结点

nInFlag 0 降序,1升序

返回值: 0 成功

1 失败

******************************************/

int sortList(NODE* pstInHead, int nInFlag)

{

if (NULL == pstInHead)

{

printf("sortList: the parameter pstInHead is NULL");

return 1;

}

int nListLen = getListLength(pstInHead);

/**如果只有头结点,不用比较,直接返回*/

if (1 == nListLen)

{

return 0;

}

NODE* pstTempNode = NULL;

pstInHead = pstInHead->plNext;

TypeData tdTempData = 0;

/**如果是正序排列*/

if (0 == nInFlag)

{

while (NULL != pstInHead->plNext)

{

pstTempNode = pstInHead->plNext;

while (NULL != pstTempNode)

{

if (pstInHead->tdData > pstTempNode->tdData)

{

tdTempData = pstInHead->tdData;

pstInHead->tdData = pstTempNode->tdData;

pstTempNode->tdData = tdTempData;

}

pstTempNode = pstTempNode->plNext;

}

pstInHead = pstInHead->plNext;

}

}

/**如果是反序排列*/

else if (1 == nInFlag)

{

while (NULL != pstInHead->plNext)

{

pstTempNode = pstInHead->plNext;

while (NULL != pstTempNode)

{

if (pstInHead->tdData < pstTempNode->tdData)

{

tdTempData = pstInHead->tdData;

pstInHead->tdData = pstTempNode->tdData;

pstTempNode->tdData = tdTempData;

}

pstTempNode = pstTempNode->plNext;

}

pstInHead = pstInHead->plNext;

}

}

else

{

printf("You choice is wrong.Please input (0 | 1)\n");

}

return 0;

}

/*****************************************

函数功能:清空整个链表

函数入参:pstInHead 链表的头结点

返回值: 0 成功

1 失败

******************************************/

int clearList(NODE* pstInHead)

{

if (NULL == pstInHead)

{

printf("clearList: the parameter pstInHead is NULL");

return 1;

}

int nListLen = getListLength(pstInHead);

/**暂存链表的头结点*/

NODE* pstTempHead = pstInHead;

/**如果只有头结点直接返回*/

if (1 == nListLen)

{

return 0;

}

NODE* pstTempNode = NULL;

pstInHead = pstInHead->plNext;

while (NULL != pstInHead)

{

pstTempNode = pstInHead;

pstInHead = pstInHead->plNext;

free(pstTempNode);

}

pstTempHead->plNext = NULL;

return 0;

}

int main()

{

NODE* pstListHead = createList(-1);

/**测试插入头部、尾部函数*/

insertListTail(pstListHead, 11);

insertListTail(pstListHead, 12);

insertListTail(pstListHead, 13);

insertListTail(pstListHead, 5);

insertListHead(pstListHead, 22);

/**遍历整个链表*/

forEachList(pstListHead);

/**测试删除头部节点*/

delListHead(pstListHead);

forEachList(pstListHead);

/**测试删除尾部节点*/

delListTail(pstListHead);

forEachList(pstListHead);

/**测试清空链表*/

clearList(pstListHead);

forEachList(pstListHead);

/**测试插入头部、尾部函数*/

insertListTail(pstListHead, 101);

insertListTail(pstListHead, 2);

insertListTail(pstListHead, 76);

insertListTail(pstListHead, 43);

insertListHead(pstListHead, 22);

insertListHead(pstListHead, 333);

forEachList(pstListHead);

/*测试正排序函数**/

sortList(pstListHead, 0);

forEachList(pstListHead);

/*测试反排序函数**/

sortList(pstListHead, 3);

forEachList(pstListHead);

system("PAUSE");

return 0;

}

0b1331709591d260c1c78e86d0c51c18.png

整数链表排序的c源代码 说明:试按以下给出的排序算法为整数链表编写一个排序函数: 该算法是按表元键值的各位值进行排序。 设有一个整数链表,其中表元的键值为不超过三位数的整数,不妨设键值形式ABC。其中A表示键值的百位数,B为十位数,C为个位数。首先按键值中的个位值C对链表作分拆和链接,先把链表分拆成10个队列链表,然后以C的值从0至9的顺序把分拆后的十个队列链表重新收集成一个链表。接着依次对键值中的B和A进行同样的分拆和链接操作,则最后收集起来的链表是按键值从小到大排序链接的。如有一个链表按它们的键值其表元的链接顺序依次为: 153 678 56 288 457 653 721 876 433 254 按它们的键值的个位分拆,得到十个队列链表,列出它们的键值顺序有: 0: 空链表 1: 721 2: 空链表 3: 153 653 433 4: 254 5: 空链表 6: 56 876 7: 457 8: 678 288 9: 空链表 顺序将它们收集一起后,链表的键值顺序有: 721 153 653 433 254 56 876 457 678 288 再按它们键值的十位分拆,得到十个队列链表,列出它们的键值顺序有: 略。 顺序将它们收集在一起后,链表的键值顺序有: 略。 再按它们键值的百位分拆,得到十个队列链表,列出它们的键值顺序有: 略。 顺序将它们收集一起后,链表的键值顺序有: 56 153 254 288 433 457 653 678 721 876 要求: 1、 试用C语言编程实现以上功能 2、 10个数字随机生成 3、 程序可读性好 ps:头文件#include 中包含 #include #include #include #include
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值