• 数据结构学习--稀疏矩阵的三元组表示


    // 稀疏矩阵的三元组表示
    
    #include <stdio.h>
    
    
    #define M 6
    #define N 7
    #define MaxSize M*N
    typedef int ElemType;
    struct TupNode
    {
    
    	int i, j;
    	ElemType data;
    
    
    };
    
    
    
    
    class TSMatrix
    {
    private:
    	int rows, cols, nums;
    	struct TupNode data[MaxSize];
    public:
    
    	TSMatrix(ElemType A[M][N]);
    	TSMatrix(const TSMatrix &other);
    	TSMatrix()
    	{
    		nums = 0;
    	}
    	bool SetValue(int i, int j, ElemType x);
    	bool GetValue(int i, int j, ElemType &x) const;
    	void print() const;
    	TSMatrix Trans() const; //转置
    
    };
    
    
    template <typename T>
    void inline Swap(T &a, T &b)
    {
    	T tmp = a;
    	a = b;
    	b = tmp;
    }
    
    
    
    TSMatrix::TSMatrix(const TSMatrix &other)
    {
    	rows = other.rows;
    	cols = other.cols;
    	nums = other.nums;
    	for (int i = 0; i<nums; i++)
    	{
    		data[i] = other.data[i];
    
    	}
    
    
    }
    
    TSMatrix TSMatrix::Trans() const {  //求转置矩阵
    	TSMatrix value;
    	if (nums != 0){
    		for (int k = 0; k<cols; k++)
    		{
    			for (int w = 0; w<nums; w++)
    			{
    				if (data[w].j == k)
    				{
    					value.data[value.nums].i = data[w].j;
    					value.data[value.nums].j = data[w].i;
    					value.data[value.nums].data = data[w].data;
    					value.nums++;
    
    				}
    
    
    			}
    
    		}
    	}
    	return value;
    }
    
    
    
    TSMatrix::TSMatrix(ElemType A[M][N]) //以二元数组构造稀疏矩阵
    {
    	rows = M;
    	cols = N;
    	nums = 0;
    	for (int i = 0; i<M; i++)
    	{
    		for (int j = 0; j<N; j++)
    		{
    			if (A[i][j] != 0)
    			{
    				data[nums].i = i;
    				data[nums].j = j;
    				data[nums].data = A[i][j];
    				nums++;
    
    			}
    
    		}
    
    	}
    }
    void TSMatrix::print() const
    //打印
    {
    
    	for (int i = 0; i<nums; i++)
    	{
    		printf("[  %d  |  %d  |  %d  ]
    ", data[i].i, data[i].j, data[i].data);
    
    	}
    
    
    }
    
    bool TSMatrix::SetValue(int i, int j, ElemType x) 
    {
    	int  k, w;
    	if (i >= rows || j >= cols) return false;
    	if (x == 0) //有可能出现设定值为0的情况(删除)
    	{
    		for (k = 0; data[k].i<i || data[k].j<j&&k < nums; k++);
    		if (data[k].i == i&&data[k].j == j)
    		{
    			//删除第k个元素
    			nums--;
    			for (w = k; w<nums; w++)
    			{
    				Swap(data[w], data[w + 1]);
    			}
    			return true;
    
    
    
    		}
    		else  //本来就是0了
    		{
    			return true;
    		}
    
    	}
    	else
    	{
    
    		for (k = 0; data[k].i<i || data[k].j<j&&k < nums; k++);  //空循环直接查找待插入的位置
    
    		if (data[k].i == i&&data[k].j == j)
    		{
    			data[k].data = x;
    			return true;
    		}
    		else
    		{
    			data[nums].data = x;
    			data[nums].i = i;
    			data[nums].j = j;
    			nums++;
    			for (w = k; w<nums; w++)
    			{
    				Swap(data[w], data[k]);
    			}
    			return true;
    
    		}
    
    	}
    
    
    }
    
    
    
    
    bool TSMatrix::GetValue(int i, int j, ElemType &x) const
    {
    	int k;
    
    	if (i >= rows&&j >= cols) return false;
    	for (k = 0; k<rows&&data[k].i<i || data[k].j<j; k++);
    	if (data[k].i == i&&data[k].j == j)
    	{
    		x = data[k].data;
    
    
    	}
    	else {
    		x = 0;
    
    	}
    
    	return true;
    
    }
    
    int main()
    {
    
    	ElemType A[M][N] =
    	{
    		{ 0, 0, 1, 0, 0, 0, 0 },
    		{ 0, 2, 0, 0, 0, 0, 0 },
    		{ 3, 0, 0, 0, 4, 0, 0 },
    		{ 0, 0, 0, 5, 0, 0, 0 },
    		{ 0, 0, 0, 0, 6, 0, 0 },
    		{ 0, 0, 0, 0, 0, 7, 4 }
    	};
    	TSMatrix t = A;
    
    	printf("三元组为:
    ");
    	t.print();
    
    	printf("设定2,0,1;2,3,9之后三元组为:
    ");
    	t.SetValue(2, 0, 1);
    	t.SetValue(2, 3, 9);
    	t.print();
    	printf("设定5,5,0;5,6,0之后三元组为:
    ");
    	t.SetValue(5, 5, 0);
    	t.SetValue(5, 6, 0);
    	t.print();
    
    	ElemType x;
    	if (t.GetValue(2, 4, x)) printf("[2,4]=%d
    ", x);
    	if (t.GetValue(1, 7, x)) printf("[1,7]=%d
    ", x);
    	printf("转置矩阵三元组为:
    ");
    	t.Trans().print();
    
    
    
    	
    	return 0;
    
    
    }
    

      

  • 相关阅读:
    类的静态成员
    QT上的Mysql编程
    将博客搬至CSDN
    ARM开发板系统移植-----rootfs的制作
    ARM开发板系统移植-----kernel的编译
    ARM开发板系统移植-----u-boot的编译
    Linux 消息队列编程
    Linux 共享内存编程
    Linux 信号量同步编程
    Linux 信号量互斥编程
  • 原文地址:https://www.cnblogs.com/xcr1234/p/4550379.html
Copyright © 2020-2023  润新知