链表操作,帮忙找下问题所在~~~

mwj09 2010-11-24 11:42:29
链表TempStruBegin 有数据,现在要将满足条件的数据写到另一个链表m_TempStruBegin1中,代码如下:
现在发现的问题是,在写完新的链表后,原始链表m_TempStruBegin中的数据有丢失现像,请帮忙看一下,哪里修改了原始链表??

m_Stru =m_TempStruBegin;
while(m_Stru)
{
if(m_Stru->NextCol!=NULL)
{
m_StruNext =m_Stru->NextCol;
if((m_Stru->ix==m_StruNext->ix)&&(m_Stru->iy == m_StruNext->iy))
{
if (m_TempStruBegin1 == NULL)
{
m_uiTempCount1 = 1;
m_TempStruBegin1 = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
m_Stru = m_StruNext;
}
else
{
if (m_TempStruBegin1 == NULL)
{
m_uiTempCount1 = 1;
m_TempStruBegin1 = m_Stru;
m_TempStruEnd1 = m_Stru;
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_Stru;
m_TempStruEnd1 = m_Stru;
}
}
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_Stru;
m_TempStruEnd1 = m_Stru;
}
m_Stru = m_Stru->NextCol;

}
...全文
117 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mwj09 的回复:]
有谁能讲讲链表数据怎么加到加一个链表数据后面而又不改变当前链表数据?
或者哪有相关内容,先谢了~
[/Quote]这个找本数据结构的书看看就好
很基础的东西
但是这么回贴恐怕说不太清楚
mwj09 2010-11-29
  • 打赏
  • 举报
回复
请高手给点建议啊~
mwj09 2010-11-29
  • 打赏
  • 举报
回复
我在原本链表上做了修改,学习一下,再看两个链表的相关操作,谢谢大家~
mwj09 2010-11-26
  • 打赏
  • 举报
回复
有谁能讲讲链表数据怎么加到加一个链表数据后面而又不改变当前链表数据?
或者哪有相关内容,先谢了~
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
这种情况下你的node2和 node3还需要做相邻的判断么?如果不需要就是说链表的移动需要跳过node2即可。所以代码还是非常简单的。
你的链表指向比较无序,比如
m_TempStruEnd1->NextCol = m_StruNext;
m_TempStruEnd1 = m_StruNext;
这时候你操作的实际是原始链表,注意指针的操作是随指针指向而变换的,你不能把原始链表和新链表混合操作。对于原始链表你只能遍历不能操作,这样就可以保证原始链表的完整性。其实你就需要遍历原始链表而已。
while(pNode->Next)
{
//数据操作

//如果查找到满足条件的node,直接跳过2个即可
if(bFind)
{
pNode = pNodex->NextCol;
if (pNodex->Next)
{
pNode = pNodex->NextCol;
continue;
}
else
{
break;
}
}
//下一个
pNodex = pNodex->NextCol;
}

[Quote=引用 12 楼 mwj09 的回复:]

引用 10 楼 teleinfor 的回复:
你很多地方都操作了原始链表的内部数据连接指向,当然会破坏原始链表结构了。
所以,你的需求并不是很复杂。如果你仅仅是这样的需求:
List1: node1->node2->node3->node4->node5->node6->NULL
List2: 初始化为NULL
比如如果node2和node3的坐标相同,就把node3放入List2,这……
[/Quote]
mwj09 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 teleinfor 的回复:]
你很多地方都操作了原始链表的内部数据连接指向,当然会破坏原始链表结构了。
所以,你的需求并不是很复杂。如果你仅仅是这样的需求:
List1: node1->node2->node3->node4->node5->node6->NULL
List2: 初始化为NULL
比如如果node2和node3的坐标相同,就把node3放入List2,这样list2就变成了
List2: node3-……
[/Quote]

我的意思和上面的说法还有点不同,即
List1: node1->node2->node3->node4->node5->node6->NULL
List2: 初始化为NULL
如果node1和node2坐标相同,把node2放入List2,这样list2就变成了
List2: node2-……
再接着判断node3和node4坐标是否相同
相同:List2: node2->node4-......
不相同:List2: node2->node3-......

再请问一下,我的代码中哪些地方破坏了原始链表结构??请指明一下,谢谢~
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
不好意思,新的链表节点指针需要后移。

m_Stru =m_TempStruBegin;
m_uiTempCount1 = 0;
while(m_Stru)
{
if(m_Stru->NextCol!=NULL)
{
m_StruNext =m_Stru->NextCol;//next node
if((m_Stru->ix==m_StruNext->ix)&&(m_Stru->iy == m_StruNext->iy))
{
m_uiTempCount1 ++;
m_TempStruBegin1->NextCol = m_StruNext;//转移满足条件的node到m_TempStruBegin1
m_TempStruBegin1 = m_TempStruBegin1->NextCol;//后移新链表指针
}
}
m_Stru = m_Stru->NextCol;//后移
}
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
你很多地方都操作了原始链表的内部数据连接指向,当然会破坏原始链表结构了。
所以,你的需求并不是很复杂。如果你仅仅是这样的需求:
List1: node1->node2->node3->node4->node5->node6->NULL
List2: 初始化为NULL
比如如果node2和node3的坐标相同,就把node3放入List2,这样list2就变成了
List2: node3->NULL
那么我刚刚的代码就是这个意图。不知道我是不是理解了你的意思。
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
这个是不是你要的结果?

m_Stru =m_TempStruBegin;
m_uiTempCount1 = 0;
while(m_Stru)
{
if(m_Stru->NextCol!=NULL)
{
m_StruNext =m_Stru->NextCol;//next node
if((m_Stru->ix==m_StruNext->ix)&&(m_Stru->iy == m_StruNext->iy))
{
m_uiTempCount1 ++;
m_TempStruBegin1 = m_StruNext;//转移满足条件的node到m_TempStruBegin1
}
}
m_Stru = m_Stru->NextCol;//后移
}
mwj09 2010-11-24
  • 打赏
  • 举报
回复
谢谢楼上~

原始链表数据为什么为会丢失??还是在找到坐标相同数据之后????
m_Stru =m_TempStruBegin;

while(m_Stru)
{
if(m_Stru->NextCol有效)
{
m_StruNext =m_Stru->NextCol;
if(当前数据与下一项数据坐标相同)
{
if (m_TempStruBegin1是新链表为空)
{
将后面的数据写入新链表
}
else
{
将后面的数据写入新链表
}
m_Stru = m_StruNext;//这里是对的吗????????
}
else//坐标不相同
{
if (m_TempStruBegin1是新链表为空)
{
将当前数据写入新链表
}
else
{
将当前数据写入新链表
}
}
}
else//最后一项,直接放在新链表的最后
{
最后一项,直接放在新链表的最后
}
m_Stru = m_Stru->NextCol;
}
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
这么发代码比较合适:

m_Stru =m_TempStruBegin;
while(m_Stru)
{
if(m_Stru->NextCol!=NULL)
{
m_StruNext =m_Stru->NextCol;
if((m_Stru->ix==m_StruNext->ix)&&(m_Stru->iy == m_StruNext->iy))
{
if (m_TempStruBegin1 == NULL)
{
m_uiTempCount1 = 1;
m_TempStruBegin1 = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
m_Stru = m_StruNext;
}
else
{
if (m_TempStruBegin1 == NULL)
{
m_uiTempCount1 = 1;
m_TempStruBegin1 = m_Stru;
m_TempStruEnd1 = m_Stru;
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_Stru;
m_TempStruEnd1 = m_Stru;
}
}
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_Stru;
m_TempStruEnd1 = m_Stru;
}
m_Stru = m_Stru->NextCol;

}
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
你可以把你的逻辑需求这里描述出来,大家可以给你代码的编写建议和实现技巧。
你的逻辑并不复杂,是设计不清楚而已。别急。
[Quote=引用 3 楼 mwj09 的回复:]

主要目的是判断m_TempStruBegin链表中,相连的两项是否坐标相同,如果坐标相同,取后面那项数据放入m_TempStruBegin1链表中,初始m_TempStruBegin1链表为空。我知道是下面代码有些问题?但是就是不明白问题出在哪?
if((m_Stru->ix==m_StruNext->ix)&&(m_Stru->iy == m_StruNext->iy))
……
[/Quote]
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
你最后这貌似也不对啊:
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_Stru;//是不是应该是NULL?
m_TempStruEnd1 = m_Stru;
}

能否把你的code用语法高亮下?
mwj09 2010-11-24
  • 打赏
  • 举报
回复
再发一遍代码,还是有点乱~~
m_Stru =m_TempStruBegin;

while(m_Stru)
{
if(m_Stru->NextCol!=NULL)
{
m_StruNext =m_Stru->NextCol;
if((m_Stru->ix==m_StruNext->ix)&&(m_Stru->iy == m_StruNext->iy))
{
if (m_TempStruBegin1 == NULL)
{
m_uiTempCount1 = 1;
m_TempStruBegin1 = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
m_Stru = m_StruNext;
}
else
{
if (m_TempStruBegin1 == NULL)
{
m_uiTempCount1 = 1;
m_TempStruBegin1 = m_Stru;
m_TempStruEnd1 = m_Stru;
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_Stru;
m_TempStruEnd1 = m_Stru;
}
}
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_Stru;
m_TempStruEnd1 = m_Stru;
}
m_Stru = m_Stru->NextCol;

}
mwj09 2010-11-24
  • 打赏
  • 举报
回复
主要目的是判断m_TempStruBegin链表中,相连的两项是否坐标相同,如果坐标相同,取后面那项数据放入m_TempStruBegin1链表中,初始m_TempStruBegin1链表为空。我知道是下面代码有些问题?但是就是不明白问题出在哪?
if((m_Stru->ix==m_StruNext->ix)&&(m_Stru->iy == m_StruNext->iy))
{
if (m_TempStruBegin1 == NULL)
{
m_uiTempCount1 = 1;
m_TempStruBegin1 = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
else
{
m_uiTempCount1 ++;
m_TempStruEnd1->NextCol = m_StruNext;
m_TempStruEnd1 = m_StruNext;
}
m_Stru = m_StruNext;
}

逻辑上是有些繁琐,我再想想怎么改善~
teleinfor 2010-11-24
  • 打赏
  • 举报
回复
你这个逻辑太不清晰了!建议楼主你先把自己的业务逻辑描述清楚,你的实现有点繁琐啊。。。
ouyh12345 2010-11-24
  • 打赏
  • 举报
回复
为什么要这么多判断?

是在m_TempStruBegin1的后头添加吗?
伪代码:
while (TempStruBegin)
{
if (数据符合)
{
把数据添加到m_TempStruBegin1
}
TempStruBegin = next
}
mwj09 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 teleinfor 的回复:]
这种情况下你的node2和 node3还需要做相邻的判断么?如果不需要就是说链表的移动需要跳过node2即可。所以代码还是非常简单的。
你的链表指向比较无序,比如
m_TempStruEnd1->NextCol = m_StruNext;
m_TempStruEnd1 = m_StruNext;
这时候你操作的实际是原始链表,注意指针的操作是随指针指向而变换的,你不能把原始链表和新链……
[/Quote]

还是不太明白,如何把数据加到新链表中而又不操作原始链表呢?
m_TempStruEnd1->NextCol = m_StruNext;
m_TempStruEnd1 = m_StruNext;
上面这两句该如何修改?

//如果查找到满足条件的node,直接跳过2个即可
我的代码做了上述操作:m_Stru = m_StruNext;
.....
m_Stru = m_Stru->NextCol;
和你的是一个意思,我理解的没错吧~


19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧