头文件声明如下:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
__declspec( dllexport ) ListNode* CreateListNode(int value);//创建链表函数
__declspec( dllexport ) void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);//连接链表节点函数
__declspec( dllexport ) void PrintListNode(ListNode* pNode);//打印链表节点函数
__declspec( dllexport ) void PrintList(ListNode* pHead);//打印链表函数
__declspec( dllexport ) void DestroyList(ListNode* pHead);//销毁链表函数
__declspec( dllexport ) void AddToTail(ListNode** pHead, int value);//在链表队尾插入节点函数
__declspec( dllexport ) void RemoveNode(ListNode** pHead, int value);//移除节点函数
实现文件如下:
#include "list.h"
#include <stdio.h>
#include <stdlib.h>
//创建链表函数 方便于新建链表
ListNode* CreateListNode(int value)
{
ListNode* pNode = new ListNode();//每次新建一个链表节点并分配内存。
pNode->m_nValue = value;
pNode->m_pNext = NULL;
return pNode;
}
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
{
if(pCurrent == NULL)
{
printf("Error to connect two nodes.\n");
exit(1);
}
pCurrent->m_pNext = pNext;
}
void PrintListNode(ListNode* pNode)
{
if(pNode == NULL)
{
printf("The node is NULL\n");
}
else
{
printf("The key in node is %d.\n", pNode->m_nValue);
}
}
void PrintList(ListNode* pHead)
{
printf("PrintList starts.\n");
ListNode* pNode = pHead;
while(pNode != NULL)
{
printf("%d\t", pNode->m_nValue);
pNode = pNode->m_pNext;
}
printf("\nPrintList ends.\n");
}
void DestroyList(ListNode* pHead)
{
ListNode* pNode = pHead;
while(pNode != NULL)
{
pHead = pHead->m_pNext;
delete pNode;
pNode = pHead;
}
}
void AddToTail(ListNode** pHead, int value)
{
ListNode* pNew = new ListNode();
pNew->m_nValue = value;
pNew->m_pNext = NULL;
if(*pHead == NULL)
{
*pHead = pNew;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != NULL)
pNode = pNode->m_pNext;
pNode->m_pNext = pNew;
}
}
void RemoveNode(ListNode** pHead, int value)
{
if(pHead == NULL || *pHead == NULL)
return;
ListNode* pToBeDeleted = NULL;
if((*pHead)->m_nValue == value)
{
pToBeDeleted = *pHead;
*pHead = (*pHead)->m_pNext;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
pNode = pNode->m_pNext;
if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value)
{
pToBeDeleted = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext;
}
}
if(pToBeDeleted != NULL)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}