谁敢跟我挑战?

heartup 2003-08-10 07:31:31
谁敢跟我挑战?我相信没有人能赢我!万一我真的输了(那是不可能的)。100分一分不少的送你。
题目很简单:
严蔚敏数据结构,数组那一章,稀疏矩阵的十字链表存储,写一个算法实现A=A+B(其中A,B是稀疏矩阵)。书中只是给出了大体思路,如果谁以为自己聪明写出了具体实现,就让我看看,我发誓必发现其中的错误。敢挑者来!!!!!!!!!!!!!!!!

//矩阵元素节点类型
typedef struct OLNode {
int i,j; // 元素在矩阵中的下标,以0开始。
int e; //非零元素值
struct OLNode *down, *right;
/*同一列、行中下一个非零节点的指针,最后一列、行的指针域为0;i行,j列的节点形成一个链表链表的第一个节点的指针存储在rhead[i]和chead[j]中(0<=i<=mu-1,0<=j<=nu-1)。*/
}OLNode;

typedef struct {
OLNode *rhead,*chead;
/*数组rhead和chead在创建是分配空间,其长度是mu和nu*/
int mu,nu,tu; /*行数,列数和非零元个数*/
}CrossList;


bool Add_CrossList(CrossList& A, CrossList B) {
/* 有种的就来填*/
}
...全文
29 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
heartup 2003-09-07
  • 打赏
  • 举报
回复
这么久才结贴,对不起,分数应该全给it工人。
flyingbug 2003-09-01
  • 打赏
  • 举报
回复
mark一下,先回去看看严的书,都忘的差不多了
laughcry2002 2003-09-01
  • 打赏
  • 举报
回复
有人,但不愿意看那个程序了。。。
heartup 2003-08-28
  • 打赏
  • 举报
回复
请问有没有人?
gantj 2003-08-19
  • 打赏
  • 举报
回复
估计你们都上当了。一楼那小子其实是不会做题目,然后用激将法骗的你们前仆后继。哎呀,计算机专业的人的脸都让你们丢光了。
wbh0360 2003-08-19
  • 打赏
  • 举报
回复
啊,想找别人帮你解吧!
heartup 2003-08-19
  • 打赏
  • 举报
回复
我是说谁来帮我看看我上面写的那个算法有哪些地方是错误的(那个确实是我写的),严书习题集,我正在做,遇到不会的问题来请教大家,还请大家多支持支持,前些天再往上找了个一具版的习题集答案,因为发现有太多的错误,所以才来请教大家,请大家认真看看我写的算法。
ZhangYv 2003-08-19
  • 打赏
  • 举报
回复
真要挑战的话,先把严书课后的练习都做完再来也不迟...
heartup 2003-08-18
  • 打赏
  • 举报
回复
怎么没有人给我挑战了?
我要挑战!!!!
happycock 2003-08-15
  • 打赏
  • 举报
回复
唉,都用matlab就没这么多烦心事了,去研究一下DX9不是更好?
heartup 2003-08-15
  • 打赏
  • 举报
回复
不要意思还是要修改一下:
void Add_CrossList(CrossList &A, CrossList B) {
hl = malloc(..);
hl[0..A.nu-1] = A.chead[0..A.nu-1];
for(i=0; i<A.mu; i++) {
preA = 0; pA = A.rhead[i]; pB = B.rhead[i];
while(pB) {
if(!pA || pB->j < pA->j) {
e = malloc(..);
*e = {pB->j, pB->j, pB->e, 0, 0};
if(!preA) {
A.rhead[i] = e;
e->right = pA;
}
else {
preA->right = e;
e->right = pA;
}
if(hl[e->j] == 0) {
A.chead[e->j] = e;
}
else {
e->down = hl[e->j]->down;
hl[e->j]->down = e;
}
preA = e; pB = pB->right; hl[e->j] = e;
}
else if(pA->j == pB->j) {
sum = pA->e + pB->e;
if(!sum) {
if(!preA)
A.rhead[i] = pA->right;
else
preA->right = pA->right;
if(A.chead[pA->j] == pA)
A.chead[pA->j] = pA->down;
else
hl[pA->j]->down = pA->down;
pA = pA->right; pB = pB->right;
free(pA);
}
else {
pA->e = sum;
hl[pA->j] = pA; pA = pA->right; pB = pB->right; /*修改的地方在这里*/
}
}
else {
hl[pA->j] = pA; pA = pA->right;
}
}
    while(pA) {
hl[pA->j] = pAp; pA = pA->right;
}
}
delete hl;
}
heartup 2003-08-15
  • 打赏
  • 举报
回复
to 西方失败:
是呀,你把h[i]修改了就等于把A.chead[i]修改了。
到最后,A.chead[i]还是需要指向列链表的头一个节点的呀!
heartup 2003-08-15
  • 打赏
  • 举报
回复
void Add_CrossList(CrossList &A, CrossList B) {
hl = malloc(..);
hl[0..A.nu-1] = A.chead[0..A.nu-1];
for(i=0; i<A.mu; i++) {
preA = 0; pA = A.rhead[i]; pB = B.rhead[i];
while(pB) {
if(!pA || pB->j < pA->j) {
/*此时需要将pB插入到适当的地方*/
/*复制pB所指向的节点*/
e = malloc(..);
*e = {pB->j, pB->j, pB->e, 0, 0};
/*修改行链表*/
if(!preA) { /*需要修改行指针*/
A.rhead[i] = e;
e->right = pA; /*因为pA有可能不是0*/
}
else {
preA->right = e;
e->right = pA;
}
/*修改列链表*/
if(hl[e->j] == 0) { /*需要修改列链指针*/
A.chead[e->j] = e;
}
else {
e->down = hl[e->j]->down;
hl[e->j]->down = e;
}
/*为下一次循环做准备pA不需要修改*/
preA = e; pB = pB->right; hl[e->j] = e;
}
else if(pA->j == pB->j) {
sum = pA->e + pB->e;
if(!sum) { /*需要删除这个节点*/
if(!preA) /*需要修改行链表指针*/
A.rhead[i] = pA->right;
else
preA->right = pA->right;
/*下面是列表的维护*/
if(A.chead[pA->j] == pA) /*需要修改列头指针*/
A.chead[pA->j] = pA->down;
else
hl[pA->j]->down = pA->down;
/*为下一次循环做准备*/
pA = pA->right; pB = pB->right; /*hl[pA->j]不需要修改*/
free(pA);
}
else {
pA->e = sum;
pA = pA->right; pB = pB->right; hl[pA->j] = pA;
}
}
else {
hl[pA->j] = pA; pA = pA->right;
}
}//while循环结束
    while(pA) {
hl[pA->j] = pAp; pA = pA->right;
}
}/*for结束*/
delete hl;
}/*end*/

先这样把,我在检查检查。
  


frankzch 2003-08-15
  • 打赏
  • 举报
回复
to happy_888:
是问题就要探讨,这样才能有进步
to heartup:
"h和A.chead共用一端内存,那原来的所有的A.chead[]的值你都不要了吗?这样怎么行?"
是h[i]和A.chead[i]共用内存,h和A.chead是不共用的
我是说修改h[i]就等于修改A.chead[i],并没有说A.chead[]的值不要了;事实上只要最开始把A.chead[]数组首地址赋给h,A.chead[]所有的值都可以由h来访问和修改
heartup 2003-08-15
  • 打赏
  • 举报
回复
没有已有的C代码,等会我把我想的写出来,大家来找找错!哈哈。
to:西方失败
h和A.chead共用一端内存,那原来的所有的A.chead[]的值你都不要了吗?这样怎么行?
onebain 2003-08-14
  • 打赏
  • 举报
回复
怎样写啊?我可是新手
Robinhoodgood 2003-08-14
  • 打赏
  • 举报
回复
昏,怎么都这么强
一套一套的,真吓人
frankzch 2003-08-14
  • 打赏
  • 举报
回复
/*列头指针为0,你为什么不修改A.chead[pb->j]?*/
h为指向指针的指针,h=A.chead,则h[i]和A.Chead[i]共用一块内存,是不是?修改h[i]就修改了A.Chead[i]
我写的还是比较乱
prea=A.rhead[i];
pa=A.rhead[i]->right;
pb=B.rhead[i]->right;
应改成:
prea=null;
pa=A.rhead[i];
pb=B.rhead[i];
另外插入或删除或移动时候都应注意行或列表头指针的维护,我总是搞忘!!
寻开心 2003-08-14
  • 打赏
  • 举报
回复
再这样斗下去就不好玩啦。
好好分析已有的代码不是更好嘛。
ejiue 2003-08-14
  • 打赏
  • 举报
回复
mark先。
回家吃完饭再来,Hoho。
加载更多回复(39)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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