C语言实现双向链表(删除任意位置节点)
Implementing doubly linked list in C(deleteing a node at any position)
我有这个功能可以删除双向链表任意位置的节点。如果您只有一个节点,它工作正常。我试图插入 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;
}
这个功能。只处理中间的节点,
所以只要确保添加边缘情况 - 如果节点是第一个或最后一个。
我有这个功能可以删除双向链表任意位置的节点。如果您只有一个节点,它工作正常。我试图插入 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;
}
这个功能。只处理中间的节点, 所以只要确保添加边缘情况 - 如果节点是第一个或最后一个。