64,637
社区成员
发帖
与我相关
我的任务
分享
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文件中读取牌
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掉了后,也应该置空!!
#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;
}