为什么指针赋值不成功?急!!!

learnboy007 2008-11-05 10:04:52
学到数据结构的十字链表,写了一个两个矩阵相加的程序,编译没报错。但是运行时发生错误。
进行跟踪发现在函数Plus中,指针pa的值不能被初始化,而与之类似的指针pb的值却没有问题。困惑啊!!实在是搞得我头都大了!就是不明白为什么。各位帮我看看。
代码如下:
#include<iostream>
using namespace std;
typedef struct mnode//十字链表结点定义
{
int row,col;
union
{
mnode *next;
int val;
} v_next;
mnode *right,*down;
} *mlink;
mlink create()
{
mnode *hd[20],*p,*q,*t;
int k;
mnode *HA=new mnode;
hd[0]=HA;
cout<<"请输入稀疏矩阵的行,列数和非零元素的个数;\n";
cin>>HA->row>>HA->col>>k;
for(int j=1;j<=((HA->col)>(HA->row)?(HA->col):(HA->row));++j) //创建各个头结点
{
p=new mnode;
p->row=0;
p->col=0;
p->right=p;
p->down=p;
hd[j]=p;
hd[j-1]->v_next.next=hd[j];
}
hd[j-1]->v_next.next=HA;
for(int i=1;i<=k;++i)//处理每个非零元素
{
q=new mnode;
cout<<"请依次输入第"<<i<<"个非零元素的行标,列标和值:\n";
cin>>q->row>>q->col>>q->v_next.val;
p=hd[q->row];//行
t=p;
while(p->down!=hd[q->row]&&p->row<q->row)//寻找位置插入链表的列里
{t=p;p=p->down;}
q->down=t->down;
t->down=q;
p=hd[q->col];//列
t=p;
while(p->right!=hd[q->col]&&p->col<q->col)//寻找位置插入链表的行里
{t=p;p=p->right;}
q->right=t->right;
t->right=q;
}
return HA;
}
mlink FindB(mlink A,mlink p) //找p节点的前驱
{
mlink q=p->down;
while(q->down!=p) q=q->down;
return q;
}
mlink FindJH(mlink A,int j) //找p节点所在列头结点
{
mlink q=A;
while(j>0) {q=q->v_next.next;j--;}
return q;
}
mlink Plus(mlink A,mlink B)//A,B相加,结果存放到A里面
{
if(A->row!=B->row||A->col!=B->col) {cout<<"A和B不能相加!\n";return NULL;}
mlink a,b,qa,qb,p,pb,pa;
qa=A;
qb=B;
a=A->v_next.next;
b=B->v_next.next;
while(a!=A)
{
pa=a->right;
pb=b->right;
while(pa!=A&&pb!=B)
{
if(pa->col==pb->col&&pa->v_next.val+pb->v_next.val!=0)//跟踪显示此处pa的值不确定
{
pa->v_next.val+=pb->v_next.val;
qa=pa;pa=pa->right;
qb=pb;pb=pb->right;
}

else
if(pa->col==pb->col&&pa->v_next.val+pb->v_next.val==0)
{
qa->right=pa->right;
p=FindB(A,pa);//还要删除down域
p->down=pa->down;
delete pa;
qa=pa;pa=pa->right;
qb=pb;pb=pb->right;
}
else
if(pa->col>pb->col)//把pb插入A中
{
qb->right=qa->right;
qa->right=qb;
p=FindJH(A,pb->col);//也要处理down域
while(p->row<pb->row) p=p->down;
p=FindB(A,p);
pb->down=p->down;
p->down=pb;
qa=pa;pa=pa->right;
qb=pb;pb=pb->right;
}
else
if(pa->col<pb->col)//pa后移
{qa=pa;pa=pa->right;}
}
a=a->v_next.next;
b=b->v_next.next;
}
return A;
}
void show(mlink A)
{
mlink p,q;
p=A->v_next.next;
for(int i=1;i<=A->row,p!=A;++i)
{
for(int j=1;j<=A->col;++j)
{
int work=0;
q=p->right;
while(q!=p)
{
if(q->col==j) {work=1;break;}
else q=q->right;
}
if(work) cout<<" "<<q->v_next.val;
else cout<<" "<<0;
}
p=p->v_next.next;
cout<<endl;
}
}
int main()
{
cout<<"创建并显示矩阵A:\n";
mlink A=create();
show(A);
cout<<"创建并显示矩阵B:\n";
mlink B=create();
show(B);
cout<<"显示矩阵A+B:\n";
A=Plus(A,B);
show(A);
return 0;
}
给位帮帮忙吧!!小弟先谢过了。
...全文
387 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
learnboy007 2008-11-06
  • 打赏
  • 举报
回复
十分感谢各位!
问题解决了,正如五楼所说的,问题是由死循环引起的。
learnboy007 2008-11-06
  • 打赏
  • 举报
回复
五楼说的对!
cyj626 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hqin6 的回复:]
C/C++ code

mlink FindB(mlink A,mlink p) //找p节点的前驱
{
mlink q=p->down;
while(q!=NULL && q->down!=p) q=q->down; //这里没考虑q为NULL
return q;
}
while(pa!=NULL && pb!=NULL && pa!=A && pb!=B)

while(p->row <pb->row) p=p->down;
p=FindB(A,p);

上面的地方都要注意!

还有,lz在new出来一个节点后,应该把right、down初始化为NULL嘛,这样我上面的判断条件才成…
[/Quote]

up
xian
holidiess 2008-11-06
  • 打赏
  • 举报
回复

CSkLogic::StartDeal();
return;

BOOL bRead = FALSE;
int nCards[MAX_TOTAL_CHAIRS][MAX_CHAIR_CARDS];
int nBottomCards[MAX_BOTTOM_CARDS];
memset(nCards, INVALID_OBJECT_ID, sizeof(nCards));
memset(nBottomCards, INVALID_OBJECT_ID, sizeof(nBottomCards));

bRead = ReadCardsFromFile(nCards, nBottomCards);//ini文件中读取牌
太乙 2008-11-06
  • 打赏
  • 举报
回复


mlink FindB(mlink A,mlink p) //找p节点的前驱
{
mlink q=p->down;
while(q!=NULL && q->down!=p) q=q->down; //这里没考虑q为NULL
return q;
}
while(pa!=NULL && pb!=NULL && pa!=A && pb!=B)

while(p->row <pb->row) p=p->down;
p=FindB(A,p);

上面的地方都要注意!

还有,lz在new出来一个节点后,应该把right、down初始化为NULL嘛,这样我上面的判断条件才成立!

还有,delete掉了后,也应该置空!!


zxg0404 2008-11-06
  • 打赏
  • 举报
回复
while(pa!=A&&pb!=B) 死循环了
帅得不敢出门 2008-11-05
  • 打赏
  • 举报
回复
星羽 2008-11-05
  • 打赏
  • 举报
回复
先up
overbai 2008-11-05
  • 打赏
  • 举报
回复
顶!
九宫飞泊 2008-11-05
  • 打赏
  • 举报
回复
帮你帖一下,这样看起来才舒服

#include <iostream>
using namespace std;
typedef struct mnode//十字链表结点定义
{
int row,col;
union
{
mnode *next;
int val;
} v_next;
mnode *right,*down;
} *mlink;
mlink create()
{
mnode *hd[20],*p,*q,*t;
int k;
mnode *HA=new mnode;
hd[0]=HA;
cout < <"请输入稀疏矩阵的行,列数和非零元素的个数;\n";
cin>>HA->row>>HA->col>>k;
for(int j=1;j <=((HA->col)>(HA->row)?(HA->col):(HA->row));++j) //创建各个头结点
{
p=new mnode;
p->row=0;
p->col=0;
p->right=p;
p->down=p;
hd[j]=p;
hd[j-1]->v_next.next=hd[j];
}
hd[j-1]->v_next.next=HA;
for(int i=1;i <=k;++i)//处理每个非零元素
{
q=new mnode;
cout < <"请依次输入第" < <i < <"个非零元素的行标,列标和值:\n";
cin>>q->row>>q->col>>q->v_next.val;
p=hd[q->row];//行
t=p;
while(p->down!=hd[q->row]&&p->row <q->row)//寻找位置插入链表的列里
{t=p;p=p->down;}
q->down=t->down;
t->down=q;
p=hd[q->col];//列
t=p;
while(p->right!=hd[q->col]&&p->col <q->col)//寻找位置插入链表的行里
{t=p;p=p->right;}
q->right=t->right;
t->right=q;
}
return HA;
}
mlink FindB(mlink A,mlink p) //找p节点的前驱
{
mlink q=p->down;
while(q->down!=p) q=q->down;
return q;
}
mlink FindJH(mlink A,int j) //找p节点所在列头结点
{
mlink q=A;
while(j>0) {q=q->v_next.next;j--;}
return q;
}
mlink Plus(mlink A,mlink B)//A,B相加,结果存放到A里面
{
if(A->row!=B->row||A->col!=B->col) {cout < <"A和B不能相加!\n";return NULL;}
mlink a,b,qa,qb,p,pb,pa;
qa=A;
qb=B;
a=A->v_next.next;
b=B->v_next.next;
while(a!=A)
{
pa=a->right;
pb=b->right;
while(pa!=A&&pb!=B)
{
if(pa->col==pb->col&&pa->v_next.val+pb->v_next.val!=0)//跟踪显示此处pa的值不确定
{
pa->v_next.val+=pb->v_next.val;
qa=pa;pa=pa->right;
qb=pb;pb=pb->right;
}

else
if(pa->col==pb->col&&pa->v_next.val+pb->v_next.val==0)
{
qa->right=pa->right;
p=FindB(A,pa);//还要删除down域
p->down=pa->down;
delete pa;
qa=pa;pa=pa->right;
qb=pb;pb=pb->right;
}
else
if(pa->col>pb->col)//把pb插入A中
{
qb->right=qa->right;
qa->right=qb;
p=FindJH(A,pb->col);//也要处理down域
while(p->row <pb->row) p=p->down;
p=FindB(A,p);
pb->down=p->down;
p->down=pb;
qa=pa;pa=pa->right;
qb=pb;pb=pb->right;
}
else
if(pa->col <pb->col)//pa后移
{qa=pa;pa=pa->right;}
}
a=a->v_next.next;
b=b->v_next.next;
}
return A;
}
void show(mlink A)
{
mlink p,q;
p=A->v_next.next;
for(int i=1;i <=A->row,p!=A;++i)
{
for(int j=1;j <=A->col;++j)
{
int work=0;
q=p->right;
while(q!=p)
{
if(q->col==j) {work=1;break;}
else q=q->right;
}
if(work) cout < <" " < <q->v_next.val;
else cout < <" " < <0;
}
p=p->v_next.next;
cout < <endl;
}
}
int main()
{
cout < <"创建并显示矩阵A:\n";
mlink A=create();
show(A);
cout < <"创建并显示矩阵B:\n";
mlink B=create();
show(B);
cout < <"显示矩阵A+B:\n";
A=Plus(A,B);
show(A);
return 0;
}




是这样嘛? 哈哈

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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