您的位置:首页 > 其它

链表操作错误分析

2009-07-16 22:55 197 查看
删除单链表结点,在删除头结点时容易出错。

代码如下:

int DeleteStudent( ST_STU *pstHead, const int iNo )
{
int GetStudentCount( ST_STU *pstHead, int *piCount );

int iCount = 0;
int iRet = -2;
int i = 0;
ST_STU *pstData = pstHead;
ST_STU *pstTmp = pstData;

//check
if( NULL == pstHead )
{
printf("[pstHead] is NULL!/n");
return -1;
}

iRet = GetStudentCount( pstHead, &iCount );
if( -1 == iRet )
{
return -1;
}

//check iNo
if( 0 >= iNo || iNo > iCount )
{
printf("Wrong: [iNo] = %d/n", iNo);
return -1;
}

//Delete Node: Find Node-------1
while( pstData && i < iNo-1 )
{
pstTmp = pstData;
pstData = pstData->pNext;
i++;
}

//Delete Node: Delete Node-------2
//非头结点
if(pstData != pstHead)
{
pstTmp->pNext = pstData->pNext;
}
//头结点
else
{
pstData = pstData->pNext;
//pstHead = pstHead->pNext;
memcpy(pstHead, pstData, sizeof(ST_STU));
}

return 0;
}


显然在删除头结点上有2种方案:

1:pstHead = pstHead->pNext;

2:pstData = pstData->pNext;

memcpy(pstHead, pstData, sizeof(ST_STU));

方案1:只是修正了头结点所在的内存单元地址,原来的链表结构仍然有效,头结点仍然指向Next结点。

方案2:修正了头结点的内容,修正成Next结点的内容,这样头结点就成为Next结点了。

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