数据结构---第五章:数组

目录

1.三元组表示稀疏矩阵(下面是ARRAY.h头文件)

2.下面是main函数的测试

3.十字链表存储稀疏矩阵,下面是Cross-Chain.h头文件

4.下面是测试

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值