读书人

请教两个链表中的元素怎么比较找出两

发布时间: 2012-12-24 10:43:14 作者: rapoo

请问两个链表中的元素如何比较,找出两个链表中不同字符串
我创建了两个链表
CList<CString,CString> List;
CList<CString,CString> List1;
两个链表均存储我遍历指定文件夹后得到的文件,List存储第一次遍历得到的文件,此时我在指定文件夹下增加或删除文件时,就在执行一次遍历指定目录得到的新数据存到List1中,请问我如何将这两个链表进行对比找出其中不同的部分(就是新加入或删除的文件)。
我写了如下的方法: 其中的num与num1是这两个链表的结点个数
POSITION pos = List.GetHeadPosition();
POSITION pos1 = List1.GetHeadPosition();
if(num > num1)
{
CString str;
str = "有文件被删除,删除的文件为:";
SetDlgItemText(IDC_EDIT3,str);
CString str2="";
CString str3="";
for(int i=0;i<num1;i++)
{
str2 = List1.GetNext(pos1);
for(int j=0;j<num;j++)
{
str3 = List.GetNext(pos);
//SetDlgItemText(IDC_EDIT10,str3);
if(strcmp(str2,str3) != 0)
{
SetDlgItemText(IDC_EDIT10,str3);
}
}

}
这样做没有得到我想要的数据,而且执行按钮功能的时候程序还会崩溃,求大神指教,该如何修改
[最优解释]
CString str1,str2;
POSITION pi=list.GetHeadPosition();
POSITION pi2=list1.GetHeadPosition();
bool bFind = false;
CString str;

while(pi!=NULL)
{
bFind = false;
str1=list.GetAt(pi);
while (pi2!=NULL)
{
str2 = list1.GetAt(pi2);
if (str1 == str2)
{
bFind=true;
str=str1;
break;
}
list1.GetNext(pi2);
}
if(bFind)
{
//str为删除文件,该干嘛干嘛
}
list.GetNext(pi);
}



pi=list.GetHeadPosition();
pi2=list1.GetHeadPosition();

while(pi2!=NULL)
{
bFind=false;
str2=list1.GetAt(pi2);
while (pi!=NULL)
{
str1 = list.GetAt(pi);
if (str1 == str2)
{
str = str1;
bFind = true;
break;
}
list.GetNext(pi);
}
if(bFind)
{
//str为新增文件,该干嘛干嘛
}
list1.GetNext(pi2);
}


[其他解释]
需要遍历2次 第一次 先遍历list 里面去和list1比较 这样可以得到删除的文件(在list不在list1)

然后先遍历list1 里面去和list比较 这样可以得到新增的文件(在list1不在list)
[其他解释]
if(num > num1) 不能用个数来做条件 如果我删一个加一个 你这个逻辑不是认为没改变了?


[其他解释]

引用:
if(num > num1) 不能用个数来做条件 如果我删一个加一个 你这个逻辑不是认为没改变了?

这个我知道,我只是把程序的一个if语句贴了上来,重要的是我现在得不到我想要的数据,而且执行按钮功能的时候程序会崩溃,请问该如何正确的得到我想要的数据啊?
[其他解释]
引用:
引用:
if(num > num1) 不能用个数来做条件 如果我删一个加一个 你这个逻辑不是认为没改变了?
这个我知道,我只是把程序的一个if语句贴了上来,重要的是我现在得不到我想要的数据,而且执行按钮功能的时候程序会崩溃,请问该如何正确的得到我想要的数据啊?


遍历你会么? 按我说的逻辑遍历2次就行了...
[其他解释]
引用:
引用:引用:
if(num > num1) 不能用个数来做条件 如果我删一个加一个 你这个逻辑不是认为没改变了?
这个我知道,我只是把程序的一个if语句贴了上来,重要的是我现在得不到我想要的数据,而且执行按钮功能的时候程序会崩溃,请问该如何正确的得到我想要的数据啊?

遍历你会么……

恩 遍历我都做完了,也存进去了,并且也判断了链表是否为空。我也是遍历了两次,分别存在Clist与Clist1中,现在我想知道如何做比较,像我那种比较方法对不对
[其他解释]
最好用stl的List,你的问题是差集/对称差集:

http://blog.csdn.net/jianzhanger/article/details/6677631

http://blog.sina.com.cn/s/blog_51e1db6b0100iz28.html
[其他解释]
引用:
引用:
引用:引用:
if(num > num1) 不能用个数来做条件 如果我删一个加一个 你这个逻辑不是认为没改变了?
这个我知道,我只是把程序的一个if语句贴了上来,重要的是我现在得不到我想要的数据,而且执行按钮功能的时候程序会崩溃,请问该如何正确的得到我想要……


CString 直接用==号比较就行了
[其他解释]
这种要求还是用map,否则效率太低。
[其他解释]
引用:
引用:引用:
引用:引用:
if(num > num1) 不能用个数来做条件 如果我删一个加一个 你这个逻辑不是认为没改变了?
这个我知道,我只是把程序的一个if语句贴了上来,重要的是我现在得不到我想要的数……

可能是我描述的有问题??? 我想知道的是如何正确比较找出新增加或删除的数据,就是如果有删除操作就将List中的数据与List1中的数据做对比,如果比较的数据在List1中没有,那么这个就是被删除的文件,我想知道用代码如何实现,我写的代码有问题,我现在想知道如何才能正确的找出我想要的文件。
[其他解释]
CString str1,str2;
POSITION pi=list.GetHeadPosition();
POSITION pi2=list1.GetHeadPosition();

while(pi!=NULL)
{

str1=list.GetAt(pi);
i=0;
while (pi2!=NULL)
{
str2 = list1.GetAt(pi2);
if (str1 != str2)
{
// str1文件已经删除
}
list1.GetNext(pi2);
}
list.GetNext(pi);
}


[其他解释]
pi=list.GetHeadPosition();
pi2=list1.GetHeadPosition();
bool bFind = false;
CString str;
while(pi2!=NULL)
{
bFind=false;
str2=list1.GetAt(pi2);
while (pi!=NULL)
{
str1 = list.GetAt(pi);
if (str1 == str2)
{


str = str1;
bFind = true;
break;
}
list.GetNext(pi);
}
if(bFind)
{
//str为新增文件
}
list1.GetNext(pi2);
}


[其他解释]
删除的照着新增的逻辑改下就行了
[其他解释]

引用:
CString str1,str2;
POSITION pi=list.GetHeadPosition();
POSITION pi2=list1.GetHeadPosition();

while(pi!=NULL)
{

str1=list.GetAt(pi);
i=0;
while (pi2!=NULL)
{
st……

这个跟我使用的循环判断不是一样吗,但是你的循环判断条件要比我的简单,这个最后输出的结果是一样的啊。
[其他解释]
求高手回复,判断啊,哪里有逻辑问题吗
[其他解释]
CString str1,str2;
POSITION pi=list.GetHeadPosition();
POSITION pi2=list1.GetHeadPosition();
bool bFind = false;
CString str;

while(pi!=NULL)
{
bFind = false;
str1=list.GetAt(pi);
i=0;
while (pi2!=NULL)
{
str2 = list1.GetAt(pi2);
if (str1 == str2)
{
bFind=true;
str=str1;
}
list1.GetNext(pi2);
}
if(bFind)
{
//str为删除文件,该干嘛干嘛
}
list.GetNext(pi);
}



pi=list.GetHeadPosition();
pi2=list1.GetHeadPosition();

while(pi2!=NULL)
{
bFind=false;
str2=list1.GetAt(pi2);
while (pi!=NULL)
{
str1 = list.GetAt(pi);
if (str1 == str2)
{
str = str1;
bFind = true;
break;
}
list.GetNext(pi);
}
if(bFind)
{
//str为新增文件,该干嘛干嘛
}
list1.GetNext(pi2);
}


[其他解释]
引用:
引用:
CString str1,str2;
POSITION pi=list.GetHeadPosition();
POSITION pi2=list1.GetHeadPosition();

while(pi!=NULL)
{

str1=list.GetAt(pi);
i=0;
while (pi2!=NULL)……


看我最后合一起的

------其他解决方案--------------------


引用:
CString str1,str2;
POSITION pi=list.GetHeadPosition();
POSITION pi2=list1.GetHeadPosition();
bool bFind = false;
CString str;

while(pi!=NULL)
{
bFind = false;
str1=list.Get……

额 是点像你这样判断 但是 if (str1 == str2) 应该判断 != 要不不是想要的结构,可是这样还有点问题当结点个数小于等于两个的时候就无法输出正确的结果了,是什么原因啊

[其他解释]
引用:
不用模板会死人吗?
花一个星期好好做个链表类
一辈子都得用,还没这些个鸟事情

恩 好的 我下步的打算就是写一个链表的类,到时候有问题的话还请多多指教,谢谢!
[其他解释]
不用模板会死人吗?
花一个星期好好做个链表类
一辈子都得用,还没这些个鸟事情
[其他解释]
引用:
引用:
CString str1,str2;
POSITION pi=list.GetHeadPosition();
POSITION pi2=list1.GetHeadPosition();
bool bFind = false;
CString str;

while(pi!=NULL)
{
bFind = false;
……


就是判断==啊 等于了bFind就标记为true遍历完退出来就知道 根据bFind就知道外面的list这个元素是不

是在里面的list里


[其他解释]
楼主这个需求看下来,还不如用钩子hook住CreateFile,DeleteFile这些API

然后用Map映射左值文件名,右值文件名对应结构体。

这样你就做到同步了。上面的遍历对比全部再见。
[其他解释]
引用:
楼主这个需求看下来,还不如用钩子hook住CreateFile,DeleteFile这些API

然后用Map映射左值文件名,右值文件名对应结构体。

这样你就做到同步了。上面的遍历对比全部再见。

由于还是新手,还不知道钩子是什么,感谢你的指点,以后会注意的。
[其他解释]
给你写那么多遍代码 你又知道你自己的需求 还看不懂???
[其他解释]
引用:
引用:
给你写那么多遍代码 你又知道你自己的需求 还看不懂???
额,先谢谢你的指点,我明白你的意思 但是判断 “==” 真取不出我想要的值(要不我把代码发给你你帮我看看?),结点个数小于两个输出的结果不正确的问题我已经解决了,但是同时删除或添加多个还是有点问题啊。


周末了 休息... 你用我最后给的代码应该是没问题的
[其他解释]
引用:
给你写那么多遍代码 你又知道你自己的需求 还看不懂???

额,先谢谢你的指点,我明白你的意思 但是判断 “==” 真取不出我想要的值(要不我把代码发给你你帮我看看?),结点个数小于两个输出的结果不正确的问题我已经解决了,但是同时删除或添加多个还是有点问题啊。
[其他解释]
引用:
引用:引用:
给你写那么多遍代码 你又知道你自己的需求 还看不懂???
额,先谢谢你的指点,我明白你的意思 但是判断 “==” 真取不出我想要的值(要不我把代码发给你你帮我看看?),结点个数小于两个输出的结果不正确的问题我已经解决了,但是同时删除或添加多个还是有点问题啊。

周末……

恩 我在研究研究 要不你给我个QQ号吧
[其他解释]
引用:
引用:楼主这个需求看下来,还不如用钩子hook住CreateFile,DeleteFile这些API

然后用Map映射左值文件名,右值文件名对应结构体。

这样你就做到同步了。上面的遍历对比全部再见。
由于还是新手,还不知道钩子是什么,感谢你的指点,以后会注意的。


钩子:四川方言,指女人的性器官
锤子:四川方言,指男人的性器官
[其他解释]
引用:

楼主这个需求看下来,还不如用钩子hook住CreateFile,DeleteFile这些API

然后用Map映射左值文件名,右值文件名对应结构体。

这样你就做到同步了。上面的遍历对比全部再见。


要是他会这些 还需要发这个贴么...
[其他解释]
引用:
引用:引用:楼主这个需求看下来,还不如用钩子hook住CreateFile,DeleteFile这些API

然后用Map映射左值文件名,右值文件名对应结构体。

这样你就做到同步了。上面的遍历对比全部再见。
由于还是新手,还不知道钩子是什么,感谢你的指点,以后会注意的。

钩子:四川方……

受教了.......
[其他解释]
下载下来参考
[其他解释]
该回复于2012-12-08 21:41:09被管理员删除

读书人网 >VC/MFC

热点推荐