链表操作错误分析
2009-07-16 22:55
197 查看
删除单链表结点,在删除头结点时容易出错。
代码如下:
显然在删除头结点上有2种方案:
1:pstHead = pstHead->pNext;
2:pstData = pstData->pNext;
memcpy(pstHead, pstData, sizeof(ST_STU));
方案1:只是修正了头结点所在的内存单元地址,原来的链表结构仍然有效,头结点仍然指向Next结点。
方案2:修正了头结点的内容,修正成Next结点的内容,这样头结点就成为Next结点了。
结论:方案2OK。
代码如下:
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。
相关文章推荐
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- “无法解决 equal to 操作的排序规则冲突。”的错误分析和解决方法
- “无法解决 equal to 操作的排序规则冲突。”的错误分析和解决方法
- [SQL]DB2数据库操作常见错误代码及分析
- 单链表中一个插入操作的分析
- 一个常见数据库操作错误的分析(一)
- C/C++中对链表操作的理解&&实例分析
- IIS托管WCF服务实际操作中常见错误分析
- C语言建立单链表出错误及其分析
- 单链表中一个插入操作的分析
- 一个常见数据库操作错误的分析(二)
- 一个常见数据库操作错误的分析(三)
- 单链表中一个插入操作的分析
- linux应用编程笔记(2)core dump分析内核链表使用后free出现的错误
- 无法解决 equal to 操作的排序规则冲突。”的错误分析和解决方法
- 链表的插入操作错误
- linux I2C设备写操作错误的分析过程
- 指针理解错误之构建链表操作
- 单链表中一个插入操作的分析
- 一个常见数据库操作错误的分析(四)