我有这个函数,可以在双向链表的任何位置删除节点。如果您只有一个节点,则工作正常。我尝试插入 3 个节点,然后删除最后一个节点,它只是冻结。
以下是我使用的功能:
int getpos(char ln[20])
{
int pos=1;
temp3=h;
if(temp3 == NULL)
{
printf("List empty");
return;
}
while(temp3->next!=NULL)
{
if(strcmp(temp3->lname,ln)==0)
{
break;
}
else
{
pos++;
}
}
return pos;
}
获取要删除的节点位置的函数。
void del()
{
int i = 1, pos=0;
char ln[20];
temp2 = h;
printf("enter lname: ");
gets(ln);
pos=getpos(ln);
if ((pos < 1) || (pos >= count + 1))
{
printf("n Error : Position out of range to delete");
return;
}
if (h == NULL)
{
printf("n Error : Empty list no elements to delete");
return;
}
else
{
while (i < pos)
{
temp2 = temp2->next;
i++;
}
if (i == 1)
{
if (temp2->next == NULL)
{
printf("Node deleted from list");
free(temp2);
temp2 = h = NULL;
return;
}
}
if (temp2->next == NULL)
{
temp2->prev->next = NULL;
free(temp2);
printf("Node deleted from list");
return;
}
temp2->next->prev = temp2->prev;
if (i != 1)
temp2->prev->next = temp2->next; /* Might not need this statement if i == 1 check */
if (i == 1)
h = temp2->next;
printf("n Node deleted");
free(temp2);
}
count--;
}
用于删除节点的函数。
在函数getpos
中,你没有递增temp3->next
,所以while
循环永远运行。
顺便说一下,一个简单的调试尝试可以省去问这个问题的麻烦。
你可以写这样的东西:
void delete_node(Node* pNode)
{
pNode->Data = pNode->Next->Data;
pNode->Next->Next->Previous = pNode;
Node* pTemp = pNode->Next;
delete(pNode->Next);
pNode->Next = pTemp;
}
这个函数只处理中间的节点,所以只要确保添加边缘情况 - 如果节点是第一个或最后一个。