69,374
社区成员
发帖
与我相关
我的任务
分享
你有什么地方不明白?下面加点注释,你看看
struct node
{
int data;
struct node *front,*next;
};
//有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
BOOL DeteleNode(Node *pHeader, DataType Value)
{
if (pHeader == NULL) return;
BOOL bRet = FALSE;
Node *pNode = pHead;
// 循环直到链表结束
while (pNode != NULL)
{
if (pNode->data == Value)
{
// 如果是链表头
if (pNode->front == NULL)
{
// 删除当前结点
// 链表头指针指向下一结点
pHeader = pNode->next;
// 现在 pHeader指向是的链表头,上一结点当然是 NULL
pHeader->front = NULL;
}
else
{
// 如果是链表一般结点,不是链表尾结点
/*
+------------+ +-----------+
| | | |
+---+-+-+---+ +-+-+-+-+--+ +-+-+--+---+
| | f | --+--->| | | c |--+--->| | | n| |
+---+---+---+ +---+---+--+ +---+--+---+
f: 上一节点
c: 当前节点
n: 下一节点
*/
if (pNode->next != NULL)
{
// 下一结点(n)的front指向当前节点(c)的前一节点
pNode->next->front = pNode->front;
}
// 当前节点(c)的front指向的节点(f)的next指向节点n
// 也就是说,当前节点被删除
pNode->front->next = pNode->next;
}
Node *pNextNode = pNode->next;
delete pNode;
pNode = pNextNode;
bRet = TRUE;
//不要break或return, 删除所有
}
else
{
pNode = pNode->next;
}
}
return bRet;
}
void DE(Node *pHeadA, Node *pHeadB)
{
if (pHeadA == NULL || pHeadB == NULL)
{
return;
}
Node *pNode = pHeadA;
while (pNode != NULL)
{
// 如果删除pHeadB成功,pHeadA也要删除
if (DeteleNode(pHeadB, pNode->data))
{
// 和 DeleteNode算法一样
// 这样pHeadA和pHeadB相同数据都被删除
if (pNode->front == NULL)
{
pHeadA = pNode->next;
pHeadA->front = NULL;
}
else
{
pNode->front->next = pNode->next;
if (pNode->next != NULL)
{
pNode->next->front = pNode->front;
}
}
Node *pNextNode = pNode->next;
delete pNode;
pNode = pNextNode;
}
else
{
pNode = pNode->next;
}
}
}