⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smatrix.cpp

📁 数据库课程设计
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int k=0;
	
	p=sm[n].h;
	if(p->right==NULL)
	{
	    cout<<"矩阵不存在,请确定输入!"<<endl;
        return 0;
     }//确认要打印的矩阵存在
	p=p->right;//为按行打印矩阵做准备
	for(i=1;i<=sm[n].mu;i++)
	{
		for(j=1;j<=sm[n].nu;j++)
		{
			if(p->row==i&&p->col==j)//若i行,j列的元素存在,则打印
			{
				cout<<setw(4)<<p->value;//打印四个空格
				p=p->right;
				k++;
			}
			else 
				cout<<setw(4)<<"0";//否则输出零
		}
		cout<<endl;
	}
	return k;//返回矩阵非零元的个数
}//PrintSMatrix

/********************  显示函数  ***********************/
int show()
{
	int i,c;
	do
	{
		for(i=0;i<MaxNum;i++)
		{
			if((sm[i].h)->right!=NULL)
				cout<<i<<" : "<<sm[i].mu<<"X"<<sm[i].nu<<endl;
			else
				cout<<i<<" : "<<"NULL"<<endl;
		}
		cout<<"请选择输出矩阵(0--9,退出-1):";
		cin>>c;
		if((c<0||c>9)&&c!=-1)
			cout<<"输入错误,请重新输入!"<<endl;
		if(c>=0&&c<=9) break;
	}while(c!=-1);
	return c;//显示要用到的函数的标号,并返回其标号
}



/********************  加法函数  ***********************/
void AddSMatrix()
{
    SMLink p,q;
    int i,j,m,e;
    int a,b;

    a=show();//输入第一个用来进行加法的矩阵标号
    b=show();//输入另一个用来进行加法的矩阵标号
    if((sm[a].mu!=sm[b].mu)||(sm[a].nu!=sm[b].nu))
    {
        cout<<"矩阵行列不匹配,请重新输入!"<<endl;
        return;
    }//判断矩阵的形状是否相同
    else
    {
        for(m=0;m<MaxNum;m++)
            if((sm[m].h)->right==NULL) break;
        if(m==MaxNum)
        {
            cout<<"内存已满!"<<endl;
            return;
        }//判断是否有存储空间
        sm[m].mu=sm[a].mu;
        sm[m].nu=sm[a].nu;//对结果矩阵进行初始化:给出其行数和列数。
    }
    p=(sm[a].h)->right;
    q=(sm[b].h)->right;//为按行实现加法做准备
    for(i=1;i<=sm[a].mu;i++)
        for(j=1;j<=sm[a].nu;j++)
        {
            if((p->row==i&&p->col==j)&&(q->row==i&&q->col==j))//如果两个矩阵i行,j列的元素都不为零,相加
            {
                e=p->value+q->value;
                if(e!=0) InsertSMatrix(sm[m],i,j,e);//相加结果若不为零,则调用插入函数,将该节点插入新的矩阵中
                p=p->right;
                q=q->right;//两指针右移
            }
            else if(p->row==i&&p->col==j)//仅仅第一个矩阵的i行,j列元素不为零,直接将其插入新的矩阵即可
            {
                e=p->value;
                InsertSMatrix(sm[m],i,j,e);
                p=p->right;
            }
            else if(q->row==i&&q->col==j)//第二个矩阵的 i行,j列元素不为零,处理同上
            {
                e=q->value;
                InsertSMatrix(sm[m],i,j,e);
                q=q->right;
            }
        }
    p=sm[m].h;
	while(p->right!=NULL)
		p=p->right;
	p->right=sm[m].h;
	p=sm[m].h;
	while(p->down!=NULL)
		p=p->down;
	p->down=sm[m].h; //将新矩阵的最后一个节点的RIGHT或DOWN域连在头节点上,形成循环链表
	cout<<"矩阵相加结果为:"<<endl;
    sm[m].tu=PrintSMatrix(m);//调用打印函数,返回新的矩阵的非零元的个数
}//AddSMatrix


/********************  减法函数  ***********************/
void SubSMatrix()//核心算法与加法完全相同,不加赘述
{
    SMLink p,q;
    int i,j,m,e;
    int a,b;
    
    a=show();
    b=show();
    if((sm[a].mu!=sm[b].mu)||(sm[a].nu!=sm[b].nu))
    {
        cout<<"矩阵行列不匹配,请重新输入!"<<endl;
        return;
    }
    else
    {
        for(m=0;m<MaxNum;m++)
            if((sm[m].h)->right==NULL) break;
        if(m==MaxNum)
        {
            cout<<"内存已满!"<<endl;
            return;
        }
        sm[m].mu=sm[a].mu;
        sm[m].nu=sm[a].nu;
    }
    p=(sm[a].h)->right;
    q=(sm[b].h)->right;
    for(i=1;i<=sm[a].mu;i++)
        for(j=1;j<=sm[a].nu;j++)
        {
            if((p->row==i&&p->col==j)&&(q->row==i&&q->col==j))
            {
                e=p->value-q->value;
                if(e!=0) InsertSMatrix(sm[m],i,j,e);
                p=p->right;
                q=q->right;
            }
            else if(p->row==i&&p->value==j)
            {
                e=p->value;
                InsertSMatrix(sm[m],i,j,e);
                p=p->right;
            }
            else if(q->row==i&&q->value==j)
            {
                e=0-q->value;
                InsertSMatrix(sm[m],i,j,e);
                q=q->right;
            }
        }
    p=sm[m].h;
	while(p->right!=NULL)
		p=p->right;
	p->right=sm[m].h;
	p=sm[m].h;
	while(p->down!=NULL)
		p=p->down;
	p->down=sm[m].h;
	cout<<"矩阵相减结果为:"<<endl;
    sm[m].tu=PrintSMatrix(m);
}//SubSMatrix

/****************  乘法函数   ********************/
void MultSMatrix()
{
    int c1,c2;
    c1=show();
    c2=show();//输入两个已存储的矩阵
    int i,j,m,sum;
    SMLink p,q,r;
    p=sm[c1].h;
    q=sm[c2].h;
        if(p->right==NULL||q->right==NULL||sm[c1].nu!=sm[c2].mu)
             cout<<"矩阵为空或行列不匹配,其检查错误!" <<endl;
             else
             {
            	for(m=0;m<MaxNum;m++)
                    if((sm[m].h)->right==NULL)
        	           break;
                 if(m==MaxNum)
                 {
                    cout<<"内存已满请删除!" ;
                    return;
                 }
                 sm[m].mu=sm[c1].mu;
                 sm[m].nu=sm[c2].nu;//结果矩阵的特征值:行数和列数
                 p=p->right;//第一个矩阵按行搜索
                 q=q->down;//第二个矩阵安列搜索
                    for(i=1;i<=sm[c1].mu;i++)
                       for(j=1;j<=sm[c2].nu;j++)
                          {
                              sum=0;
                              while(p->row==i&&q->col==j)
                               {
                                   while(p->col>q->row)
                                        q=q->down;
                                   while(p->col<q->row)
                                        p=p->right;//以上两个循环用来寻找两个矩阵i行,j列的元素都不为零
                                   sum=sum+p->value*q->value;
                                   p=p->right;
                                   q=q->down;
                               }
                              if(sum!=0)
                                  InsertSMatrix(sm[m],i,j,sum);
                           }
    p=sm[m].h;
	while(p->right!=NULL)
		p=p->right;
	p->right=sm[m].h;
	p=sm[m].h;
	while(p->down!=NULL)
		p=p->down;
	p->down=sm[m].h;
	cout<<"矩阵相乘结果为:"<<endl;//链表头,形成循环链表
    sm[m].tu=PrintSMatrix(m); //调用打印函数,返回新的矩阵的非零元的个数
    }
}//MultSMatrix

/****************  转置函数   ********************/
void TransposeSMatrix(int n)
{
    int m;
    int ti,tj,te,k;
    SMLink p;
    if((sm[n].h)->right==NULL)
    {
        cout<<"矩阵不存在,请确认输入!"<<endl;
        return;
    }
    else
    {
        for(m=0;m<MaxNum;m++)
            if((sm[m].h)->right==NULL) break;
        if(m==MaxNum)
        {
            cout<<"内存已满!"<<endl;
            return;
        }
        sm[m].mu=sm[n].nu;
        sm[m].nu=sm[n].mu;
        sm[m].tu=sm[n].tu;//矩阵转置的初始化,行数列数调换 ,非零元个数不改变
    }
    p=sm[n].h;
    for(k=0;k<sm[n].tu;k++)
    {
        p=p->right;
        ti=p->row;
        tj=p->col;
        te=p->value;
        InsertSMatrix(sm[m],tj,ti,te);
    }//利用插入函数轻松搞定
    p=sm[m].h;
	while(p->right!=NULL)
		p=p->right;
	p->right=sm[m].h;
	p=sm[m].h;
	while(p->down!=NULL)
		p=p->down;
	p->down=sm[m].h;
    cout<<"矩阵转置结果为:"<<endl;
    PrintSMatrix(m);
}//TransposeSMatrix

int main()
{
	int n;
	char c;
	InitSMatix();
	do
	{
		cout<<"\n\t\t\t  ******************************\n";
		cout<<"  \t\t\t  *    稀 疏 矩 阵 运 算 器    *\n";
		cout<<"  \t\t\t  ******************************\n";
		cout<<"  \t\t\t  *         1-->创建矩阵       *\n";
		cout<<"  \t\t\t  *         2-->输出矩阵       *\n";
		cout<<"  \t\t\t  *         3-->删除矩阵       *\n";
		cout<<"  \t\t\t  *         4-->加法运算       *\n";
		cout<<"  \t\t\t  *         5-->减法运算       *\n";
		cout<<"  \t\t\t  *         6-->乘法运算       *\n";
		cout<<"  \t\t\t  *         7-->转置运算       *\n";
		cout<<"  \t\t\t  *         8-->退出           *\n";
		cout<<"  \t\t\t  ******************************\n";
		cout<<"\t\t\t\t请输入(1--8):";
		cin>>c;
		switch(c)
		{
			case '1':CreateSMatrix();break;
			case '2':n=show();PrintSMatrix(n);break;
			case '3':n=show();DestroySMatrix(n);break;
			case '4':AddSMatrix();break;
			case '5':SubSMatrix();break;
			case '6':MultSMatrix();break;
			case '7':n=show();TransposeSMatrix(n);break;
			case '8':break;
			default:cout<<"输入错误!请重新输入!"<<endl;
		}
		if(c=='8') break;
	}while(c!='8');
}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -