遇到谭浩强书上一个单链表操作的小问题, 链表建立后遍历出错,请热心人帮忙解决!!

nodefault 2007-12-20 05:32:31
void CProbabilityDlg::OnInput() //建立链表
{
....
tempNod=pNod=(struct sampleStruc *)malloc(LEN);
tempNod->sampVal=m_Sample;
tempNod->sampProb=m_SampProb;
if(n_Nod==1) headNod=tempNod;
else pNod->next=tempNod; pNod=tempNod;
}

void CProbabilityDlg::OnResult() //遍历链表
{
pNod->next=NULL;
.....
if(headNod!=NULL)
do
{
.........
tempVar+=tempVar1*tempVar1*tempN->sampProb;
tempN=tempN->next; // 这里访问headNod->next出错 ???
}while(tempN!=NULL);
......
}

插入几组数据后,为什么headNod->next域不能访问? 比如插入3组数据(1,2),(3,4),(5,6)。
哪位热心人能否留下邮箱,我把程序发你您帮我查查!
...全文
71 点赞 收藏 8
写回复
8 条回复
nodefault 2007年12月22日
感谢3位仁兄指点!

错误原因分析:

1)// tempNod=pNod=(struct sampleStruc *)malloc(LEN); //重大错误!!!!
// tempNod,pNod均指向最后一个节点,并形成自循环
// headNod 指向第一个节点,其后为非法节点
// 错误原因为本来pNod用来保存原最后一个节点,现在每次都赋新值,旧址没有保存!!!

2)tempNod->next=NULL; //如果没有的话,将导致 tempN=tempN-> next;
// 出错的原因是新节点的后面都要=NULL;
//另外NEW新节点要赋NULL

3)// UpdateData(true); // 汗颜的错误
回复 点赞
nodefault 2007年12月21日
感谢my_girlf 解决了问题!
回复 点赞
nodefault 2007年12月20日
void CProbabilityDlg::OnInput() //每点击"输入"按钮一次可以输入一个节点的数据,建立链表
{
// TODO: Add your control notification handler code here
CString strSamp,strSampProb, strtemp;
struct sampleStruc *tempNod;

UpdateData(true);

n_Nod++;
tempNod=pNod=(struct sampleStruc *)malloc(LEN);
tempNod->sampVal=m_Sample;
tempNod->sampProb=m_SampProb;

if(n_Nod==1) headNod=tempNod;
else pNod->next=tempNod;
pNod=tempNod;
sumProb+=m_SampProb;

strSamp.Format("%.3f",m_Sample);
strSampProb.Format("%.3f",m_SampProb);
strtemp=strSamp+" "+strSampProb;

m_List.AddString(strtemp);
m_SumSampProb=sumProb;

m_tempExcept+=m_Sample*m_SampProb;
UpdateData(false);
}

void CProbabilityDlg::OnResult() ////点击"计算"按钮时可以计算,遍历链表
{
// TODO: Add your control notification handler code here
pNod->next=NULL;

struct sampleStruc *tempN;
float tempVar=0;
float tempVar1;
tempN=headNod;

if(headNod!=NULL)
do
{
tempVar1=0;
tempVar1=(tempN->sampVal - m_tempExcept);
tempVar+=tempVar1*tempVar1*tempN->sampProb;
tempN=tempN->next;
}while(tempN!=NULL);

m_SampDelta=float(sqrt(tempVar));
m_Exception=m_tempExcept;

UpdateData(true);
}
回复 点赞
shakaqrj 2007年12月20日
lz可以把遍历的完整代码贴出来
回复 点赞
shakaqrj 2007年12月20日
shakaqrj@yahoo.com.cn
回复 点赞
my_girlf 2007年12月20日
yxz_06@126.com
回复 点赞
nodefault 2007年12月20日
我已经发到您邮箱里了!
回复 点赞
tcxjia 2007年12月20日
tcxssky520@163.com
我看看
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7893

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告