关于链表的初始化、查找、删除等问题
程序代码:
/****************************************************************************** 链表部分 ******************************************************************************/ #define LIST_OK 0 #define LIST_FAILED -1 #include<stdlib.h> #include<stdio.h> /* 链表节点结构 */ typedef struct ListNode { struct ListNode *pstPrev; /* 上一个节点 */ struct ListNode *pstNext; /* 下一个节点 */ unsigned long ulUserData; /* 用户数据 */ unsigned long ulRefNum; /* 引用计数, 即如果两个节点的用户数据相同的话, 则系统中 只保留一个节点, 但是引用计数加1, 如果释放一个用户数据, 则引用计数减1, 当引用计数减为0时才真正释放节点 */ }LIST_NODE_S; /* 链表头结构 */ typedef struct ListHead { struct ListNode pstFirstNode; /* 第一个节点 */ struct ListNode pstLastNode; /* 最后一个节点 */ unsigned long ulListSize; /* 链表大小,即不包括表头的链表节点数 */ }LIST_HEAD_S; LIST_HEAD_S g_stTestListHead; void List_Init(LIST_HEAD_S* pstListHead)//链表初始化 { pstListHead = (LIST_HEAD_S*)malloc(sizeof(LIST_HEAD_S)); if(!pstListHead) { exit(LIST_FAILED); } pstListHead->pstFirstNode = NULL; pstListHead->pstLastNode = NULL; pstListHead->ulListSize = 0; } void List_AddNode(LIST_HEAD_S* pstListHead, unsigned long ulUserData)//添加结点 { LIST_NODE_S *s,*p; s = (LIST_NODE_S *)malloc(sizeof(LIST_NODE_S)); if(!s) { exit(LIST_FAILED); } pstListHead->pstFirstNode = p; s->ulUserData = ulUserData; s->pstNext = p; s->pstPrev = p->pstPrev; p->pstPrev->pstNext = s; p->pstPrev = s; pstListHead->ulListSize++; s->ulRefNum++; } long List_DelNode(LIST_HEAD_S* pstListHead, unsigned long ulData)//删除节点 { LIST_NODE_S *p,*s; pstListHead->pstFirstNode = p; p->pstNext = s; if(p->ulRefNum != ulData) { p = s; s = s->pstNext; } p->pstPrev->pstNext = s; p->pstNext->pstPrev = p->pstPrev; free(p); pstListHead->ulListSize--; return 1; } LIST_NODE_S* List_FindNode(LIST_HEAD_S* pstListHead, unsigned long ulData)//查找节点 { LIST_NODE_S *p,*s; pstListHead->pstFirstNode = p; p->pstNext = s; if(p->ulUserData != ulData) { p = s; s = s->pstNext; } if(p->ulUserData = ulData) { return p->ulUserData; } else return -1; } void List_ClearList(LIST_HEAD_S* pstListHead)//清空链表 { LIST_NODE_S *p,*s; pstListHead->pstFirstNode = p; p->pstNext = s; if(s->pstNext != pstListHead) { p = s; s = s->pstNext; } while(pstListHead->pstFirstNode) { p->pstNext = pstListHead; free(s); s = p; p = p->pstPrev; } }
其中,各个函数名是要求的,不能改动,函数内容是我写的,但是有类似的几处错误,我不知道怎么改。
不用写主函数。