#include<iostream>
using namespace std;
struct OLNode{
int val;
int row, col;
OLNode *right, *down;
};
struct CrossList{
int m, n, l;
OLNode** Rhead;
OLNode** Chead;
};
void Insert(OLNode* p, CrossList* m)
{
OLNode *q;
//插入行
if (m->Rhead[p->row] == NULL || p->col < m->Rhead[p->row]->col)
{//表空或插在第一个元素前
p->right = m->Rhead[p->row];
m->Rhead[p->row] = p;
}
else
{
for (q = m->Rhead[p->row]; q->right!=NULL && q->right->col < p->col; q = q->right);
p->right = q->right;
q->right = p;
}
//插入列
if (m->Chead[p->col] == NULL || p->row < m->Chead[p->col]->row)
{//表空或插在第一个元素之前
p->down = m->Chead[p->col];
m->Chead[p->col] = p;
}
else
{
for (q = m->Chead[p->col]; q->down!=NULL && q->down->row < p->row; q = q->down);
p->down = q->down;
q->down = p;
}
}
void CreateCrossList(CrossList* M)
{
cin>>M->m>>M->n>>M->l;
M->Rhead = new OLNode*[M->m];
M->Chead = new OLNode*[M->n];
for (int i = 0; i < M->m; i++)
M->Rhead[i] = NULL;
for (int i = 0; i < M->n; i++)
M->Chead[i] = NULL;
int i, j, value;
OLNode *p;
for (int k = 0; k < M->l; k++)
{
cin>>i>>j>>value;
if (value == 0)
continue;
p = new OLNode;
p->row = i;
p->col = j;
p->val = value;
Insert(p,M);
}
}
void ReverseAdd(CrossList* M)
{
OLNode *p, *q;
for (int i = 0; i < M->m; i++)
{
p = M->Rhead[i];
q = M->Chead[i];
while(p!=NULL || q!=NULL)
{
if (p==NULL)
{
cout<<i<<" "<<q->row<<" "<<q->val<<'\n';
q = q->down;
}
else if (q==NULL)
{
cout<<i<<" "<<p->col<<" "<<p->val<<'\n';
p = p->right;
}
else if (p->col < q->row)
{
cout<<i<<" "<<p->col<<" "<<p->val<<'\n';
p = p->right;
}
else if (p->col > q->row)
{
cout<<i<<" "<<q->row<<" "<<q->val<<'\n';
q = q->down;
}
else
{
if (p->val + q->val != 0)
cout<<i<<" "<<p->col<<" "<< p->val + q->val<<'\n';
p = p->right;
q = q->down;
}
}
}
}
void ReverseMul(CrossList* M)
{
OLNode *p, *q;
int value;
for (int i = 0; i < M->m; i++)
{
for (int j = 0; j < M->n; j++)
{
value = 0;
p = M->Rhead[i];
q = M->Rhead[j];
while(p!=NULL && q!=NULL)
{
if (p->col > q->col)
q = q->right;
else if (p->col < q->col)
p = p->right;
else
{
value += p->val * q->val;
p = p->right;
q = q->right;
}
}
if (value!=0)
cout<<i<<" "<<j<<" "<<value<<'\n';
}
}
}
void DestroyCrossList(CrossList* M)
{
OLNode *p, *q;
for (int i = 0; i < M->m; i++)
{
if (M->Rhead[i]!=NULL)
{
p = M->Rhead[i];
p = p->right;
while(p!=NULL)
{
q = p;
p = p->right;
delete q;
}
}
}
delete M->Chead;
delete M->Rhead;
delete M;
}
void ShowCrossList(CrossList* M)
{
OLNode *p;
for (int i = 0; i < M->m; i++)
{
if (M->Rhead[i]!=NULL)
{
p = M->Rhead[i];
cout<<p->row<<" "<<p->col<<" "<<p->val<<'\n';
while (p->right!=NULL)
{
p = p->right;
cout<<p->row<<" "<<p->col<<" "<<p->val<<'\n';
}
}
}
}
void ShowReverseCrossList(CrossList* M)
{
OLNode* p;
for (int i = 0; i < M->n; i++)
{
p = M->Chead[i];
while (p!=NULL)
{
cout<<p->col<<" "<<p->row<<" "<<p->val<<'\n';
p = p->down;
}
}
}
int main()
{
CrossList* M = new CrossList;
CreateCrossList(M);
ShowReverseCrossList(M);
ReverseAdd(M);
ReverseMul(M);
DestroyCrossList(M);
return 1;
}
xishujuzhen.rar_稀疏
版权申诉
99 浏览量
2022-09-23
17:19:32
上传
评论
收藏 1KB RAR 举报
四散
- 粉丝: 54
- 资源: 1万+
最新资源
- 通信仿真,mseed-process-master.zip
- python,python-scheduling.rar
- python,python-quantum.rar
- python,python-project-euler.rar
- Linux常用命令及用法说明
- 基于Matlab的FFT频谱分析及IIR数字滤波器设计
- AutoCAD高压低压电气开关柜设备接线图图纸
- AutoCAD电气图纸建筑电气开关柜常用cad图纸
- 使用ASP.NET Core和Entity Framework Core来构建一个基本的进销存系统.rar
- 深度学习经典数据集+FER2013面部表情识别+附带使用方法的python代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈