C语言单向链表的达成
发布时间:2021-12-10 18:13:47 所属栏目:教程 来源:互联网
导读:采用VS2013编辑器编写的C语言单向链表代码: #include stdio.h #include windows.h typedef int TypeData; #define NODE_LENGTH sizeof(NODE) /**定义链表的结构体*/ typedef struct tagNode { TypeData tdData; struct tagNode *plNext; }NODE; /*******函
采用VS2013编辑器编写的C语言单向链表代码: #include <stdio.h> #include <windows.h> 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("%dn", 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; } ![]() (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |