您的位置:首页 > 其它

单向链表(二) 删除指定位置的节点

2014-07-31 15:35 393 查看
1、删除单向链表中的某个节点,比如删除第3个节点,如下图所示:



2、为了便于说明,将节点的位置 作为 节点的数据值。由图可知,要删除第3个节点,只要先使第2个节点指向第4个节点,构成一个新的链表1 -> 2 -> 4;接着释放第3个节点就可以了。

3、具体实现函数代码:

tagNode* DeleteNode(tagNode *pHead, int location)
{
tagNode *pNewHead = NULL;  // 新的头结点
tagNode *pTemp = pHead;    // 临时节点
tagNode *pDel = NULL;      // 待删除节点
int nCount = 1;

if (pHead == NULL)
{
printf("链表为空!\n");
return pHead;
}

// 如果要删除的是头结点(location == 1)
if (location == 1)
{
pNewHead = pTemp->pNext;
free(pTemp);

if (pNewHead == NULL)
{
return NULL;
}
else
{
return pNewHead;
}
}

nCount++;

// 删除非头结点
while (pTemp)
{
if(location == nCount)
{
pDel = pTemp->pNext;
pTemp->pNext = pTemp->pNext->pNext;
free(pDel);

return pHead;
}
else
{
pTemp = pTemp->pNext;
nCount++;
}
}

printf("位置%d处无节点!\n", location);
return pHead;
}




void DeleteNode(tagNode **pHead, int location)
{
tagNode *pNewHead = NULL;  // 新的头结点
tagNode *pTemp = *pHead;    // 临时节点
tagNode *pDel = NULL;      // 待删除节点
int nCount = 1;

if (pHead == NULL)
{
printf("链表为空!\n");
return;
}

// 如果要删除的是头结点(location == 1)
if (location == 1)
{
pNewHead = pTemp->pNext;
free(pTemp);

if (pNewHead == NULL)
{
*pHead = NULL;
}
else
{
*pHead = pNewHead;
}

return;
}

nCount++;

// 删除非头结点
while (pTemp)
{
if(location == nCount)
{
pDel = pTemp->pNext;
pTemp->pNext = pTemp->pNext->pNext;
free(pDel);

return;
}
else
{
pTemp = pTemp->pNext;
nCount++;
}
}

printf("位置%d处无节点!\n", location);
}


4、几个注意点:

一、判断待删除的节点是否为头结点;

二、注意传入的位置值(location)是否有效;

三、注意链表节点只有一个时的情况。

5、main函数中调用:

int _tmain(int argc, _TCHAR* argv[])
{
tagNode *p = NULL;
p = CreateLinkedList();
int location;

printf("\n\n遍历:\n");
TraverseNodes(p);

printf("\n\n请输入待删除的节点位置:");
scanf("%d", &location);
getchar();
//p = DeleteNode(p, location);
DeleteNode(&p, location);

printf("\n\n遍历:\n");
TraverseNodes(p);

FreeLinkedList(p);

getchar();
return 0;
}


6、运行结果:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: