目录
3.十字链表存储稀疏矩阵,下面是Cross-Chain.h头文件
5.在三元组的基础上添加一个快速排序,老师说这个算我们接触的第一个真正意义上的算法:
1.三元组表示稀疏矩阵(下面是ARRAY.h头文件)
#pragma once
#include<iostream>
#include<malloc.h>
#include<cstdlib>
#include<malloc.h>
#include<ctime>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define M 4
#define N 4
const int MAXSIZE = 100; //矩阵最多的元素个数
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct {
int i, j; //i为非零元的行下标,j为非零元的列下标
ElemType e; //该非零元的值
}Triple; //三元组
typedef struct {
Triple data[MAXSIZE + 1];
int mu, nu, tu; //mu为行数,nu为列数,tu为非零元的个数
}TSMatrix; //构造出来一个三元组
void CreatMatrix(TSMatrix& T, ElemType Array[M][N])
{ //创建->填充一个三元组
T.mu = M; T.nu = N; T.tu = 0;
//下面开始扫描Array
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if (Array[i][j] != 0)
{
T.data[T.tu].i = i;
T.data[T.tu].j = j;
T.data[T.tu].e = Array[i][j];
T.tu++;
}
}
}
}
void DispMatrix(TSMatrix t)
{
if (t.tu <= 0)
{
return;
}
printf("\t%d\t%d\t%d\n", t.mu, t.nu, t.tu);
printf("\t------------------\n");
for (int i = 0; i < t.tu; i++)
{
printf("\t%d\t%d\t%d\n", t.data[i].i,t.data[i].j,t.data[i].e);
}
}
void TranMatrix(TSMatrix t, TSMatrix& tb)
{
int k1 = 0;
tb.mu = t.nu; tb.nu = t.mu; tb.tu = t.tu;
if (tb.tu != 0)
{
for (int i = 0; i < t.nu; i++)
{
for (int j = 0; j < t.tu; j++)
{
if (t.data[j].j == i)
{
tb.data[k1].i = t.data[j].j;
tb.data[k1].j = t.data[j].i;
tb.data[k1].e = t.data[j].e;
k1++;
}
}
}
}
}
bool PlusMatrix(TSMatrix a, TSMatrix b, TSMatrix& c) //c=a+b
{
int i=0 , j = 0, k=0;
ElemType v;
if (a.mu != b.mu || a.nu != b.nu)
{
return false; //行数和列数不等的矩阵不能相加
}
c.mu = a.mu; c.nu = a.nu;
while (i < a.tu && j < b.tu)
{
if (a.data[i].i == b.data[j].i) //如果行号相等时
{
if (a.data[i].j < b.data[j].j) //a的列号小于b的列号
{ //把a加到c中去
c.data[k].i = a.data[i].i;
c.data[k].j = a.data[i].j;
c.data[k].e = a.data[i].e;
k++; i++;
}
else if (a.data[i].j > b.data[j].j) //a的列号大于b的列号
{ //把b加到c中去
c.data[k].i = b.data[i].i;
c.data[k].j = b.data[i].j;
c.data[k].e = b.data[i].e;
k++; j++;
}
else //a的列号等于b的列号
{ //把a+b不为零的结果加到c中去
v = a.data[i].e + b.data[j].e;
if (v != 0)
{
c.data[k].i = a.data[i].i;
c.data[k].j = a.data[i].j;
c.data[k].e = v;
k++;
}
i++; j++;
}
}
else if (a.data[i].i < b.data[j].i) //a的行号小于b的行号
{ //把a加到c中去
c.data[k].i = a.data[i].i;
c.data[k].j = a.data[i].j;
c.data[k].e = a.data[i].e;
k++; i++;
}
else //a的行号大于b的行号
{ //把b加到c中去
c.data[k].i = b.data[i].i;
c.data[k].j = b.data[i].j;
c.data[k].e = b.data[i].e;
k++; j++;
}
c.tu = k;
}
return true;
}
int GetValue(TSMatrix t, int i, int j)
{//返回三元组t表示的A[i][j]
int k = 0;
while (k < t.tu && (t.data[k].i != i || t.data[k].j != j))
{
k++;
}
if (k < t.tu)
{
return (t.data[k].e);
}
else
{
return 0;
}
}
bool MultiplyMatrix(TSMatrix a, TSMatrix b, TSMatrix &c) //c=a X b
{
int p = 0;
ElemType s;
if (a.nu != b.mu) //a的列数不等于b的行数,二者不能相乘
{
return false;
}
for (int i = 0; i < a.mu; i++)
{
for (int j = 0; j < b.nu; j++)
{
s = 0;
for (int k = 0; k < a.nu; k++)
{
s =s+ GetValue(a, i, k) * GetValue(b, k, j);
}
if (s != 0)
{
c.data[p].i = i;
c.data[p].j = j;
c.data[p].e = s;
p++;
}
}
}
c.mu = a.mu; c.nu = b.nu; c.tu = p;
return true;
}
2.下面是main函数的测试
#include<iostream>
#include<malloc.h>
#include<cstdlib>
#include<malloc.h>
#include<ctime>
#include<cstring>
#include "ARRAY.h"
using namespace std;
#define M 4
#define N 4
int main()
{
TSMatrix a,b,c;
ElemType A[M][N] = { {1,0,3,0},{0,1,0,0,} ,{0,0,1,0},{0,0,1,1} };
ElemType B[M][N] = { {3,0,0,0},{0,4,0,0,} ,{0,0,1,0},{0,0,0,2} };
/*cout <<"-----"<<M << "X" << N << "的矩阵A" << "-----" << endl;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
cout << "第" << i + 1 << "行第" << j + 1
<< "个元素为: ";
cin >> A[i][j];
}
}
cout << "-----" << M << "X" << N << "的矩阵B" << "-----" << endl;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
cout << "第" << i + 1 << "行第" << j + 1
<< "个元素为: ";
cin >> B[i][j];
}
}*/
CreatMatrix(a, A);
CreatMatrix(b, B);
cout << "a的三元组:" << endl; DispMatrix(a);
cout << "b的三元组:" << endl; DispMatrix(b);
cout << "a的转置为c:" << endl;
TranMatrix(a, c);
cout << endl;
cout << "c的三元组:" << endl; DispMatrix(c);
cout << "c=a+b\n";
PlusMatrix(a, b, c);
cout << "c的三元组:" << endl; DispMatrix(c);
cout << "c=a X b\n";
MultiplyMatrix(a, b, c);
cout << "c的三元组:" << endl; DispMatrix(c);
cout << "\n20213002624李季鸿,终于搞出来了!!!" << endl;
system("pause");
return 0;
}
3.十字链表存储稀疏矩阵,下面是Cross-Chain.h头文件
#pragma once
#include<iostream>
#include<cstdlib>
#include<malloc.h>
#include<ctime>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define M 4
#define N 4
const int MTAXSIZE = 100; //矩阵最多的元素个数
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct OLNode {
int i, j; // 该非零元的行和列下标
ElemType e;
struct OLNode* rnext, * cnext;
// 该非零元所在行表和列表的后继链域
} OLNode, *OLink;
typedef struct {
OLink* rhead, * chead;
// 行和列链表头指针向量基址
// 在建立存储结构时分配.
int mu, nu, tu;
// 稀疏矩阵的行数、列数和非零元个数
} CrossList;
int CreateSMTatrix(CrossList* MT)
{
/* if (MT)
{
free(MT);
}*/
int m=0, n=0, t = 0;
cout << "请分别输入稀疏矩阵的行数、列数:" << endl;
cin >> m;
cin >> n;
MT->mu = m; MT->nu = n;
if (!(MT->rhead = (OLink*)malloc((m + 1) * sizeof(OLink)))) exit(OVERFLOW);
if (!(MT->chead = (OLink*)malloc((n + 1) * sizeof(OLink)))) exit(OVERFLOW);
for (int a = 1; a <= m; a++)
{
MT->rhead[a] = NULL;
}
for (int b = 1; b <= n; b++)
{
MT->chead[b] = NULL;
} //清空行和列
int e;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cout << "第" << i << "行第" << j
<< "个元素为: ";
cin >> e;
if (e != 0)
{
t++;
OLink p, q;
if (!(p = (OLNode*)malloc(sizeof(OLNode)))) exit(OVERFLOW);
p->i = i;
p->j = j;
p->e = e;
t++;
p->rnext = NULL;
p->cnext = NULL;
if (MT->rhead[i] == NULL || MT->rhead[i]->j > j)
{
p->rnext = MT->rhead[i]; MT->rhead[i] = p;
}
else
{
for (q = MT->rhead[i]; (q->rnext) && q->rnext->j < j; q = q->rnext);
p->rnext = q->rnext; q->rnext = p;
}
if (MT->chead[j] == NULL || MT->chead[j]->i > i)
{
p->cnext = MT->chead[j]; MT->chead[j] = p;
}
else
{
for (q = MT->chead[j]; (q->cnext) && q->cnext->i < i; q = q->cnext);
p->cnext = q->cnext; q->cnext = p;
}
}
}
}
MT->tu = t;
return OK;
}
void CrossSMTatrix(CrossList MT, ElemType x)
{
// 在十字链表中查找所有值为 x 的元素并输出(i,j)
int i = 1;
OLink p = MT.rhead[i]; // 从第 1 行开始扫描
while (i <= MT.mu)
{
if (!p) //如果p为空
{
i++;
p = MT.rhead[i]; // p指向下一行 的第一个非零元结点
}
else
{
if (p->e == x)
{
cout << '(' << p->i << ',' << p->j << ')' << endl;// 输出
}
p = p->rnext; // 继续查找本行的下一个结点
}
}//while
}// CrossSearch
void printSMTatrix(CrossList MT)
{
OLink pTemp;
for (int p = 1; p <= MT.mu; p++)
{
pTemp = MT.rhead[p];
for (int q = 1; q <= MT.nu; q++)
{
if (pTemp != NULL && pTemp->j == q)
{
printf("%5d", pTemp->e);
pTemp = pTemp->rnext;
}
else
{
printf("%5d", 0);
}
}
cout<<"\n";
}
return;
}
4.下面是测试
#include<iostream>
#include<malloc.h>
#include<cstdlib>
#include<malloc.h>
#include<ctime>
#include<cstring>
//#include "ARRAY.h"
//#include"Chain-ARRAY.h"
#include"Cross-Chain.h"
using namespace std;
#define M 4
#define N 4
int main()
{
int x;
CrossList MT;
CreateSMTatrix(&MT);
cout << "在十字链表中查找所有值为 x 的元素并输出(i,j),请输入x的值:";
cin >> x;
CrossSMTatrix(MT, x);
cout << "打印出全部: "<<endl;
printSMTatrix(MT);
cout << "\n20213002624李季鸿,终于搞出来了!!!" << endl;
system("pause");
return 0;
}
5.在三元组的基础上添加一个快速排序,老师说这个算我们接触的第一个真正意义上的算法:
Status FastTranMatrix(TSMatrix TS, TSMatrix& TM)//高级版本的转置
{
int col;
int num[100], cpot[50];
TM.mu = TS.nu;
TM.nu = TS.mu;
TM.tu = TS.tu;
if (TM.tu)
{
for (col = 0; col < TS.nu; col++)
{//num数组置0
num[col] = 0;
}
for (int t = 0; t < TS.tu; t++)
{//求M中每一列含非零元素个数
++num[TS.data[t].j];
}
cpot[0] = 1; //初始位置
//求第col列中第一个非零元在b.data的序号
for ( col = 1; col < TS.nu; col++)
{
cpot[col] = cpot[col - 1] + num[col - 1];//前一列的个数加上第一个的位置
}
//求出两辅助变量的值
for (int p = 0; p < TS.tu; ++p)
{
col = TS.data[p].j;
int q = cpot[col]-1;
cout << q<<" ";
TM.data[q].i = TS.data[p].j;
TM.data[q].j = TS.data[p].i;
TM.data[q].e = TS.data[p].e;
++cpot[col];
}
}
return OK;
}