| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1408 人关注过本帖
标题:十字链表实现2个矩阵的加法 求解法严维明数据结构p105
只看楼主 加入收藏
企鹅
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2006-7-14
收藏
 问题点数:0 回复次数:2 
十字链表实现2个矩阵的加法 求解法严维明数据结构p105

#include <iostream>
#include <malloc.h>
using namespace std;

typedef int Status;
typedef int ElemType;

#define OK 1

typedef struct OLNode
{
int i,j;
ElemType e;
struct OLNode *right,*down;
} OLNode, *OLink;

typedef struct
{
OLink *rhead,*chead;
int mu,nu,tu;
} CrossList;

Status CreatSMatrix_OL(CrossList &M);
void PrintSMatrix(CrossList &M);
Status AddSMatrix(CrossList &M,CrossList &N);

int main()
{
CrossList M,N;
CreatSMatrix_OL(M);
PrintSMatrix(M);
CreatSMatrix_OL(N);
PrintSMatrix(N);
AddSMatrix(M,N);
PrintSMatrix(M);
return 0;
}

Status CreatSMatrix_OL(CrossList &M)
{
OLink temp,p1,p2;
int i,j;
ElemType e;
cout<<"M.mu=? M.nu=?"<<endl;
cin>>M.mu>>M.nu;
M.tu=0;
M.rhead=(OLink *)malloc(sizeof(OLink)*(M.mu+1));
M.chead=(OLink *)malloc(sizeof(OLink)*(M.nu+1));
for(i=0;i<=M.mu;i++)
M.rhead[i]=NULL;
for(i=0;i<=M.nu;i++)
M.chead[i]=NULL;
cin>>i>>j>>e;
while(i!=0)
{
temp=(OLNode *)malloc(sizeof(OLNode));
(*temp).i=i;
(*temp).j=j;
(*temp).e=e;
if(M.rhead[i]==NULL||M.rhead[i]->j>j)
{
temp->right=M.rhead[i];
M.rhead[i]=temp;
}
else
{
p1=M.rhead[i];
while(p1->right&&p1->right->j<j)
p1=p1->right;
temp->right=p1->right;
p1->right=temp;
}
if(M.chead[j]==NULL||M.chead[j]->i>i)
{
temp->down=M.chead[j];
M.chead[j]=temp;
}
else
{
p1=M.chead[j];
while(p1->down&&p1->down->i<i)
p1=p1->down;
temp->down=p1->down;
p1->down=temp;
}
M.tu++;
cin>>i>>j>>e;
}
return OK;
}

void PrintSMatrix(CrossList &M)
{
OLink temp;
int i;
cout<<"M.mu="<<M.mu<<" M.nu="<<M.nu<<" M.tu="<<M.tu<<endl;
for(i=1;i<=M.mu;i++)
{
temp=M.rhead[i];
while(temp)
{
cout<<"i="<<temp->i<<" j="<<temp->j<<" e="<<temp->e<<endl;
temp=temp->right;
}
}
}

Status AddSMatrix(CrossList &M,CrossList &N)
{
OLink *a,pa,pb,pre;
OLNode *temp;
a=(OLink *)malloc((M.nu+1)*sizeof(OLink));
int i;
for(i=1;i<=M.nu;i++)
a[i]=M.chead[i];
for(i=1;i<=M.mu;i++)
{
pa=M.rhead[i];
pb=N.rhead[i];
pre=NULL;
while(pb!=NULL)
{
if(pa==NULL||pa->j>pb->j)
{
temp=(OLNode *)malloc(sizeof(OLNode));
temp->i=pb->i;
temp->j=pb->j;
temp->e=pb->e;
//pb=pb->right;
if(pre==NULL)
M.rhead[i]=temp;
else pre->right=temp;
temp->right=pa;
pre=temp;
if(M.chead[pb->j]==NULL||M.chead[pb->j]->i>pb->i)
{
temp->down=M.chead[pb->j];
M.chead[pb->j]=temp;
}
else
{
while(a[pb->j]->down!=NULL&&a[pb->j]->down->i<pb->i)
a[pb->j]=a[pb->j]->down;
temp->down=a[pb->j]->down;
a[pb->j]->down=temp;
}
a[pb->j]=temp;
M.tu++;
pb=pb->right;
}
else if(pa!=NULL&&pa->j<pb->j)
{
pre=pa;
pa=pa->down;
}
else if(pa->j==pb->j)
{
pa->e+=pb->e;
if(pa->e==0)
{
if(pre==NULL)
M.rhead[i]=M.rhead[i]->right;
else
pre->right=pa->right;
temp=pa;
pa=pa->right;
while(a[pa->j]->down->i!=pa->i)
a[pa->j]=a[pa->j]->down;
if(M.chead[pa->j]==pa)
{
M.chead[pa->j]=pa->down;
a[pa->j]=pa->down;
}
else a[pa->j]->down=pa->down;
free(pa);
M.tu--;
}
}
pb=pb->right;
}
}
return OK;
}
按书写的。错了。求写过的人贴下代码对比一下

搜索更多相关主题的帖子: 严维明 字链 数据结构 加法 int 
2007-10-25 22:19
企鹅
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2006-7-14
收藏
得分:0 

花了一个晚上,今天终于改好了,虽然没有人回复,但是也贴一下自己改好的代码。希望有人需要
#include <iostream>
#include <malloc.h>
using namespace std;

typedef int Status;
typedef int ElemType;

#define OK 1

typedef struct OLNode
{
int i,j;
ElemType e;
struct OLNode *right,*down;
} OLNode, *OLink;

typedef struct
{
OLink *rhead,*chead;
int mu,nu,tu;
} CrossList;

Status CreatSMatrix_OL(CrossList &M);
void PrintSMatrix(CrossList &M);
Status AddSMatrix(CrossList &M,CrossList &N);

int main()
{
CrossList M,N;
CreatSMatrix_OL(M);
PrintSMatrix(M);
CreatSMatrix_OL(N);
PrintSMatrix(N);
AddSMatrix(M,N);
PrintSMatrix(M);
return 0;
}

Status CreatSMatrix_OL(CrossList &M)
{
OLink temp,p1,p2;
int i,j;
ElemType e;
cout<<"M.mu=? M.nu=?"<<endl;
cin>>M.mu>>M.nu;
M.tu=0;
M.rhead=(OLink *)malloc(sizeof(OLink)*(M.mu+1));
M.chead=(OLink *)malloc(sizeof(OLink)*(M.nu+1));
for(i=0;i<=M.mu;i++)
M.rhead[i]=NULL;
for(i=0;i<=M.nu;i++)
M.chead[i]=NULL;
cin>>i>>j>>e;
while(i!=0)
{
temp=(OLNode *)malloc(sizeof(OLNode));
(*temp).i=i;
(*temp).j=j;
(*temp).e=e;
if(M.rhead[i]==NULL||M.rhead[i]->j>j)
{
temp->right=M.rhead[i];
M.rhead[i]=temp;
}
else
{
p1=M.rhead[i];
while(p1->right&&p1->right->j<j)
p1=p1->right;
temp->right=p1->right;
p1->right=temp;
}
if(M.chead[j]==NULL||M.chead[j]->i>i)
{
temp->down=M.chead[j];
M.chead[j]=temp;
}
else
{
p1=M.chead[j];
while(p1->down&&p1->down->i<i)
p1=p1->down;
temp->down=p1->down;
p1->down=temp;
}
M.tu++;
cin>>i>>j>>e;
}
return OK;
}

void PrintSMatrix(CrossList &M)
{
OLink temp;
int i;
cout<<"M.mu="<<M.mu<<" M.nu="<<M.nu<<" M.tu="<<M.tu<<endl;
/*for(i=1;i<=M.mu;i++)
{
temp=M.rhead[i];
while(temp)
{
cout<<"i="<<temp->i<<" j="<<temp->j<<" e="<<temp->e<<endl;
temp=temp->right;
}
}*/
for(i=1;i<=M.nu;i++)
{
temp=M.chead[i];
while(temp)
{
cout<<"i="<<temp->i<<" j="<<temp->j<<" e="<<temp->e<<endl;
temp=temp->down;
}
}
}

Status AddSMatrix(CrossList &M,CrossList &N)
{
int k=0;
OLink *a,pa,pb,pre;
OLNode *temp;
a=(OLink *)malloc((M.nu+1)*sizeof(OLink));
int i;
for(i=1;i<=M.nu;i++)
a[i]=M.chead[i];
for(i=1;i<=M.mu&&i<=N.mu;i++)
{
pa=M.rhead[i];
pb=N.rhead[i];
pre=NULL;
while(pb!=NULL)
{
while(pa!=NULL&&pa->j<pb->j)
{
k++;
pre=pa;
pa=pa->right;
if(k==100)
break;
}
if(pa==NULL||pa->j>pb->j)
{
temp=(OLNode *)malloc(sizeof(OLNode));
temp->i=pb->i;
temp->j=pb->j;
temp->e=pb->e;
if(pre==NULL)
M.rhead[i]=temp;
else pre->right=temp;
temp->right=pa;
pre=temp;
if(M.chead[pb->j]==NULL||M.chead[pb->j]->i>pb->i)
{
temp->down=M.chead[pb->j];
M.chead[pb->j]=temp;
}
else
{
while(a[pb->j]->down!=NULL&&a[pb->j]->down->i<pb->i)
a[pb->j]=a[pb->j]->down;
temp->down=a[pb->j]->down;
a[pb->j]->down=temp;
}
a[pb->j]=temp;
M.tu++;
pb=pb->right;
}
else if(pa->j==pb->j)
{
pa->e+=pb->e;
if(pa->e==0)
{
if(pre==NULL)
M.rhead[i]=M.rhead[i]->right;
else
pre->right=pa->right;
temp=pa;
pa=pa->right;
cout<<a[temp->j]->i<<a[temp->j]->j<<a[temp->j]->e<<endl;
if(M.chead[temp->j]->i==temp->i)
{
M.chead[pb->j]=M.chead[pb->j]->down;
a[pb->j]=M.chead[pb->j];
}
else
{
while(a[pb->j]->down->i!=pb->i)
{
a[pb->j]=a[pb->j]->down;
cout<<a[pb->j]->i<<a[pb->j]->j<<a[pb->j]->e<<endl;
}
a[pb->j]->down=temp->down;
}
M.tu--;
}
pb=pb->right;
}
}
}
return OK;
}

2007-11-02 22:35
笑靥千秋
Rank: 1
来 自:大连
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-12-19
收藏
得分:0 
新手 请多关照
好多都没用过   我想问一下  
用十字链表来加两个矩阵有什么大的好处吗?
用其他的也都能实现啊
2007-12-19 16:14
快速回复:十字链表实现2个矩阵的加法 求解法严维明数据结构p105
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016897 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved