十字链表实现问题

yu3350360 2009-12-08 07:24:51
十字链表实现及相加代码如下:

#include <iostream>
#include "malloc.h"
#include "stdlib.h"

using namespace std;

#define OVERFLOW 0
#define OK 1

typedef struct OLNode
{
int i,j; //该非零元的行和列下标
int e;
struct OLNode * right, * down; //该非零元所在行表和列表的后继链域
}*OLink;OLNode;

typedef struct
{
OLink *rhead,* chead; //行和链表头指针向量基址由createSmatrix分配
int mu,nu,tu; //系数矩阵的行数和列数及非零元个数
}CrossList,OLMatrix;

int CreateSMatrix_OL (CrossList &M)
{
//创建稀疏矩阵
int m=0,n=0,t=0;
int i=0,j=0,e=0;
OLink p,q;
//if(M) free(M);
cin>>m>>n>>t; //Scanf (&m,&n,&t);//输入M的函数,列数和非零元的个数
M.mu=m;
M.nu=n;
M.tu=t;
if(!(M.rhead=(OLink * )malloc((m+1) *sizeof(OLink)))) exit (OVERFLOW);
if(!(M.chead=(OLink * )malloc((n+1) *sizeof(OLink)))) exit (OVERFLOW);
M.rhead=NULL; // 初始化行列头指针向量;各行列链表为空链表
M.chead=NULL;
for (cin>>i>>j>>e;i!=0;cin>>i>>j>>e) //按任意次序输入非零元
{
if(!(p=(OLNode*)malloc(sizeof(OLNode)))) exit( OVERFLOW );
p->i=i; //生成节点
p->j=j;
p->e=e;
if(M.rhead[i]==NULL||M.rhead[i]->j>j)
{
p->right=M.rhead[i];
M.rhead[i] = p;
}

else
{ //寻找在行表中的插入位置
for(q =M.rhead[i];(q->right)&&q->right->j<j;q=q->right)
{
p->right =q->right;
q->right=p;
} //完成插入
if (M.chead[j] ==NULL||M.chead[j]->i>i)
{
p->down=M.chead[j];
M.chead[j]=p;
}
else
{ //寻找在行表中的插入位置
for(q=M.chead [j]; (q->down) && q->down->i<i;q= q->down)
{
p->down = q->down;
q->down = p;
}
}
}

}
return OK;
}//CreateSMatrix_OL
//============================实现矩阵相加========================================
void OLMatrix_Add(OLMatrix &A,OLMatrix B) //把十字链表表示的矩阵B加到A上
{
int i=0,j=0;
OLink *cp;
OLink p,pa,pb,pre;
for(j=1;j<=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针
for(i=1;i<=A.mu;i++)
{
pa=A.rhead[i];
pb=B.rhead[i];
pre=NULL;
while(pb)
{
if(pa==NULL||pa->j>pb->j) //新插入一个结点
{
p=(OLNode*)malloc(sizeof(OLNode));
if(!pre)
A.rhead[i]=p;
else
pre->right=p;
p->right=pa;
pre=p;
p->i=i;
p->j=pb->j;
p->e=pb->e; //插入行链表中
if(!A.chead[p->j])
{
A.chead[p->j]=p;
p->down=NULL;
}
else
{
while(cp[p->j]->down)
cp[p->j]=cp[p->j]->down;
p->down=cp[p->j]->down;
cp[p->j]->down=p;
}
cp[p->j]=p; //插入列链表中
}//if
else if(pa->j<pb->j)
{
pre=pa;
pa=pa->right;
} //pa右移一步
else if(pa->e+pb->e)
{
pa->e+=pb->e;
pre=pa;
pa=pa->right;
pb=pb->right;
} //直接相加
else
{
if(!pre)
A.rhead[i]=pa->right;
else
pre->right=pa->right;
p=pa;
pa=pa->right; //从行链表中删除
if(A.chead[p->j]==p)
A.chead[p->j]=cp[p->j]=p->down;
else
cp[p->j]->down=p->down; //从列链表中删除
free (p);
}//else
}//while
}//for
}//OLMatrix_Add
//========================以三元组格式输出十字链表表示的矩阵=======================
void Print_OLMatrix(OLMatrix A)//以三元组格式输出十字链表表示的矩阵
{
OLink p;
for(int i=0;i<A.mu;i++)
{
if(A.rhead[i])
for(p=A.rhead[i];p;p=p->right) //逐次遍历每一个行链表
//printf("%d %d %d\n",i,p->j,p->e;
cout<<p->i<<p->j<<p->e<<endl;
}
}//Print_OLMatrix
int main()
{
CrossList ma,mb;

CreateSMatrix_OL(ma);
CreateSMatrix_OL(mb);
OLMatrix_Add(ma,mb);
Print_OLMatrix(ma);
return 0;
}

在实现的时候会出现问题,即插入行,列和数据后会出现好像是内存冲突。实现一下就晓得了。。。
调试好久也没搞懂
...全文
277 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yu3350360 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 donkey301 的回复:]
M.rhead=NULL;
这句话应该错了,这样直接导致M.rhead变成了一个野指针,
应该是
C/C++ codefor (int i=0; i< m;++i)
{
M.rhead[i]= NULL;
}
没人顶呦 自己继续顶。。。
[/Quote]
donkey301 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yu3350360 的回复:]
引用 4 楼 donkey301 的回复:
M.rhead=NULL;
这句话应该错了,这样直接导致M.rhead变成了一个野指针,
应该是
C/C++ codefor (int i=0; i < m;++i)
{
    M.rhead[i]= NULL;
}
没人顶呦  自己继续顶。。。

[/Quote]
你在

CreateSMatrix_OL(ma);

这句话前设置一个断点,F5调试看看运行完这个函数后ma里有多少元素,就知道是建表时错还是输出错了
yu3350360 2009-12-09
  • 打赏
  • 举报
回复
没人 顶起
自己顶起吧
yu3350360 2009-12-09
  • 打赏
  • 举报
回复
十字链表建立貌似没有问题了,可是在输出十字链表的时候,少输出一组或者两组,不晓得是建立还是输出的问题,还需要大家帮忙看看哟。。
C/C++
#include <iostream>
#include "malloc.h"
#include "stdlib.h"

using namespace std;

#define OVERFLOW 0
#define OK 1

typedef struct OLNode
{
int i,j; //该非零元的行和列下标
int e;
struct OLNode * right, * down; //该非零元所在行表和列表的后继链域
}*OLink;OLNode;

typedef struct
{
OLink *rhead,* chead; //行和链表头指针向量基址由createSmatrix分配
int mu,nu,tu; //系数矩阵的行数和列数及非零元个数
}CrossList,OLMatrix;

int CreateSMatrix_OL (CrossList &M)
{
//创建稀疏矩阵
int m=0,n=0,t=0;
int i=0,j=0,e=0;
OLink p,q;
//if(M) free(M);
cin>>m>>n>>t; //Scanf (&m,&n,&t);//输入M的函数,列数和非零元的个数
M.mu=m;
M.nu=n;
M.tu=t;
if(!(M.rhead=(OLink * )malloc((m+1) *sizeof(OLink)))) exit (OVERFLOW);
if(!(M.chead=(OLink * )malloc((n+1) *sizeof(OLink)))) exit (OVERFLOW);
// M.rhead=NULL; // 初始化行列头指针向量;各行列链表为空链表
// M.chead=NULL;
for(int a=1; a <= m; ++a) // 初始化行列头指针向量;各行列链表为空链表
M.rhead[a] = NULL; // 防止野指针
for(int b=1; b <= n; ++b)
M.chead[b] = NULL;

for (cin>>i>>j>>e;i!=0;cin>>i>>j>>e) //按任意次序输入非零元
{
if(!(p=(OLNode*)malloc(sizeof(OLNode)))) exit( OVERFLOW );
p->i=i; //生成节点
p->j=j;
p->e=e;
if(M.rhead[i]==NULL||(M.rhead[i]->j)>j)
{
p->right=M.rhead[i];
M.rhead[i] = p;
}

else
{ //寻找在行表中的插入位置
for(q =M.rhead[i];(q->right)&&q->right->j<j;q=q->right)
{
p->right =q->right;
q->right=p;
} //完成插入
if (M.chead[j] ==NULL||M.chead[j]->i>i)
{
p->down=M.chead[j];
M.chead[j]=p;
}
else
{ //寻找在行表中的插入位置
for(q=M.chead [j]; (q->down) && q->down->i<i;q= q->down)
{
p->down = q->down;
q->down = p;
}
}
}

}
return OK;
}//CreateSMatrix_OL
//============================实现矩阵相加========================================
void OLMatrix_Add(OLMatrix &A,OLMatrix B) //把十字链表表示的矩阵B加到A上
{
int i=0,j=0;
OLink *cp;
OLink p,pa,pb,pre;
cp=(OLNode**)malloc(sizeof(OLNode));
for(j=1;j<=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针
for(i=1;i<=A.mu;i++)
{
pa=A.rhead[i];
pb=B.rhead[i];
pre=NULL;
while(pb)
{
if(pa==NULL||pa->j>pb->j) //新插入一个结点
{
p=(OLNode*)malloc(sizeof(OLNode));
if(!pre)
A.rhead[i]=p;
else
pre->right=p;
p->right=pa;
pre=p;
p->i=i;
p->j=pb->j;
p->e=pb->e; //插入行链表中
if(!A.chead[p->j])
{
A.chead[p->j]=p;
p->down=NULL;
}
else
{
while(cp[p->j]->down)
cp[p->j]=cp[p->j]->down;
p->down=cp[p->j]->down;
cp[p->j]->down=p;
}
cp[p->j]=p; //插入列链表中
}//if
else if(pa->j<pb->j)
{
pre=pa;
pa=pa->right;
} //pa右移一步
else if(pa->e+pb->e)
{
pa->e+=pb->e;
pre=pa;
pa=pa->right;
pb=pb->right;
} //直接相加
else
{
if(!pre)
A.rhead[i]=pa->right;
else
pre->right=pa->right;
p=pa;
pa=pa->right; //从行链表中删除
if(A.chead[p->j]==p)
A.chead[p->j]=cp[p->j]=p->down;
else
cp[p->j]->down=p->down; //从列链表中删除
free (p);
}//else
}//while
}//for
}//OLMatrix_Add*/
//========================以三元组格式输出十字链表表示的矩阵=======================
void Print_OLMatrix(OLMatrix A)//以三元组格式输出十字链表表示的矩阵
{
OLink p;
p=(OLNode*)malloc(sizeof(OLNode));
for(int i=1;i<=A.mu;i++)
{
if(A.rhead[i])
for(p=A.rhead[i];p;p=p->right) //逐次遍历每一个行链表
//printf("%d %d %d\n",i,p->j,p->e;
cout<<p->i<<p->j<<p->e<<endl;
}
}//Print_OLMatrix
int main()
{
CrossList ma,mb;
cout<<"please input A"<<endl;
CreateSMatrix_OL(ma);
cout<<"output A:"<<endl;
Print_OLMatrix(ma);

cout<<"please input B"<<endl;
CreateSMatrix_OL(mb);
cout<<"output B:"<<endl;
Print_OLMatrix(mb);

OLMatrix_Add(ma,mb);
Print_OLMatrix(ma);
return 0;
}
code
yu3350360 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 logiciel 的回复:]
C/C++ code
OLink*cp;OLink p,pa,pb,pre;for(j=1;j<=A.nu;j++) cp[j]=A.chead[j];//向量cp存储每一列当前最后一个元素的指针

上面循环中的指针cp没有分配空间。
[/Quote]
和这没关系的吧,我把矩阵相加的那段注释掉了
还是有问题的,再说了,十字链表还没有建立起来呢
donkey301 2009-12-09
  • 打赏
  • 举报
回复
M.rhead=NULL;
这句话应该错了,这样直接导致M.rhead变成了一个野指针,
应该是

for ( int i=0; i < m; ++i)
{
M.rhead[i] = NULL;
}

这儿有个参考网页:
http://blog.csdn.net/dizuo/archive/2008/04/12/2285660.aspx
logiciel 2009-12-08
  • 打赏
  • 举报
回复

OLink *cp;OLink p,pa,pb,pre;
for(j=1;j <=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针


上面循环中的指针cp没有分配空间。

33,009

社区成员

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

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