单向链表c语言写法,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;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值