数据结构课程设计稀疏矩阵的三元组存储

数据结构课程设计稀疏矩阵的三元组存储

    • 要求
    • 代码实现

要求

利用C/C++语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。设计并实现稀疏矩阵的三元组存储结构,并完成如下操作。
稀疏矩阵显示。 根据行列值,显示元素值。矩阵加法。矩阵减法。矩阵乘法。

代码实现

#include
#include
#include
using namespace std;
#define MAXSIZE 100
typedef struct{
int row; //行
int col; //列
int data; //值
}triple;
typedef struct{
triple data[MAXSIZE];
int m,n; //行列数
int len; //非零个数
}matrix;
matrix *Init()
{
int j=0;
matrix A;
A=(matrix
)malloc(sizeof(matrix));
A->len=0;
A->m=0;
A->n=0;
for(j=0;j {
A->data[j].col=0;
A->data[j].row=0;
A->data[j].data=0;
}
return A;
}
void print_menu()
{
cout<<"==============================================================================="< cout<<"=============================1.创建矩阵 ======================================="< cout<<"=============================2.矩阵加法 ======================================="< cout<<"=============================3.矩阵减法 ======================================="< cout<<"=============================4.矩阵乘法 ==========="< cout<<"=5.顺序查找(根据行、列查询值) ="< cout<<"=6.折半查找(只能查找矩阵A的非零元素值):="< cout<<"=7.退出"< cout<<"="< printf("==============请输入需要进行的操作:");
}
void creat(matrix *A)
{
int col1=0,row1=0; //保存文件中矩阵的行、列
char ch1,ch2;
int n1,m=0;
int row=0,col=0,l=0; //行列数
FILE *get;
FILE *rowin;
FILE *colin;
get=fopen(“321.txt”,“r”);
if(get == NULL)
{
cout<<“文件打开失败!”< system(“pause”);
exit(0);
}
else
cout<<“文件打开成功!”< //ifstream rowin;
rowin=fopen(“321.txt”,“r”);
while(!feof(rowin)) //获取行数
{
ch1=fgetc(rowin);
if(ch1
’\n’)
row1++;
}
colin=fopen(“321.txt”,“r”); //获取列数
while(!feof(colin))
{
ch2=fgetc(colin);
if(ch2
’ ')
col1++;
else if(ch2
’\n’)
break;
}
row1=row1+1;
col1=col1+1;
cout<<"===================矩阵行数:"< cout<<"===================矩阵列数:"< cout<<"=============非零元素信息:\n";
while(!feof(get))
{
fscanf(get,"%d",&n1);
if(n1!=0)
{
A->data[m].data=n1;
A->data[m].row=row;
A->data[m].col=col;
cout<<“行:” cout<<“列:” cout<<“值:” m++;
col++;
l++;
if(col
col1)
{
col=0;
row++;
}
}
else if(n1
0)
{
col++;
if(col
col1)
{col=0;
row++;
}
}
}
A->m=row1;
A->n=col1;
A->len=l;
}

void print(matrix *A) //显示矩阵
{
int i=0;
for(int row=0;rowm;row++)
{
for(int col=0;coln;col++)
{
if(A->data[i].colcol&&A->data[i].rowrow)
{
cout i++;
}
else
cout<<“0 “;
}
cout<<”\n”;
}
}
void add(matrix *A,matrix *B,matrix **C) //加法
{
if(A->mB->m&&A->nB->n)
{
int i=0,j=0,k=0;
(*C)->m=A->m;
(*C)->n=A->n;
while(ilen||jlen)
{
if(iA->len&&jlen)
{
(*C)->data[k].col=B->data[j].col;
(*C)->data[k].row=B->data[j].row;
(*C)->data[k++].data=B->data[j].data;
j++;
}
else if(ilen&&j
B->len)
{
(*C)->data[k].col=A->data[i].col;
(*C)->data[k].row=A->data[i].row;
(*C)->data[k++].data=A->data[i].data;
(*C)->len++;
i++;
}
else
{
if(A->data[i].row>B->data[j].row)
{
(*C)->data[k].col=B->data[j].col;
(*C)->data[k].row=B->data[j].row;
(*C)->data[k++].data=B->data[j].data;
(*C)->len++;
j++;
}
else if(A->data[i].rowdata[j].row)
{
(*C)->data[k].col=A->data[i].col;
(*C)->data[k].row=A->data[i].row;
(*C)->data[k++].data=A->data[i].data;
(*C)->len++;
i++;
}
else
{
if(A->data[i].colB->data[j].col)
{
if(A->data[i].data+B->data[j].data!=0)
{
(*C)->data[k].col=A->data[i].col;
(*C)->data[k].row=A->data[i].row;
(*C)->data[k++].data=A->data[i].data+B->data[j].data;
(*C)->len++;
}
i++;
j++;
}
else if(A->data[i].col>B->data[j].col)
{
(*C)->data[k].col=B->data[j].col;
(*C)->data[k].row=B->data[j].row;
(*C)->data[k++].data=B->data[j].data;
(*C)->len++;
j++;
}
else if(A->data[i].coldata[j].col)
{
(*C)->data[k].col=A->data[i].col;
(*C)->data[k].row=A->data[i].row;
(*C)->data[k++].data=A->data[i].data;
(*C)->len++;
i++;
}
}
}
}
}
else
{
cout<<“不满足相加条件!”< system(“pause”);
}
}
void sub(matrix *A,matrix *B,matrix **C) //减法
{
int k=0;
for(k=0;klen;k++)
B->data[k].data=-B->data[k].data;
if(A->m
B->m&&A->n==B->n)
add(A,B,C);
else{
for(k=0;klen;k++)
B->data[k].data=B->data[k].data;
system(“pause”);
}
}
int value(matrix *A,int i,int j) //取出元素的值
{
int k=0;
while(k<(A->len)&&(A->data[k].row!=i||A->data[k].col!=j))
k++;
if(klen)
return A->data[k].data;
else
return 0;
}

void arr(matrix *A,matrix *B,matrix **C) //乘法
{
int i=0,j=0,k=0,p=0;
int num;
if(A->m!=B->n)
{
cout<<“不满足相乘的条件!”< system(“pause”);
exit(0);
}
for(i=0;in;i++)
{
for(j=0;jm;j++)
{
num=0;
for(k=0;km;k++)
{
num=num+value(A,i,k)*value(B,k,j);
}
if(num!=0)
{
(*C)->data[p].row=i;
(*C)->data[p].col=j;
(*C)->data[p].data=num;
p++;
}
}
(*C)->n=A->n;
(*C)->m=A->m;
(*C)->len=p;
}
}
int search_1(matrix *A,int m,int n) //顺序查找根据行、列查询
{
int i=0;
int B=0;
while(ilen)
{
if(A->data[i].coln-1&&A->data[i].rowm-1)
{
B=A->data[i].data;
break;
}
else
{
i++;
B=0;
}
}
return B;
}
int search_2(matrix *A,int value) //折半查找
{
int n=A->len;
int tump[n]; //保存非零元素
for(int i=0;i {
tump[i]=A->data[i].data;
}
int i,j,k;
for(i=0;i {
for(j=i;j if(tump[i]>tump[j])
{
k=tump[i];
tump[i]=tump[j];
tump[j]=k; // 交换值
}
}
int low=1,high=A->len;
int mid;
int tamp; //有序数组的下标
while(low<=high)
{
mid=(low+high)/2;
if(tump[mid]==value)
{
tamp=mid;
break;
}
else if(value high=mid-1;
else
low=mid+1;
}
for(int m=0;mlen;m++)
{
if(tump[mid]==A->data[m].data)
{
cout<<"==================折半查找的查询结果:";
cout<<“值:”< }
}
}

int main()
{
matrix *A;
matrix *B;
matrix *C;
matrix *D;
matrix E;
A=Init();
B=Init();
C=Init();
D=Init();
E=Init();
int num;
print_menu();
cin>>num;
while(num<=6)
{
switch(num)
{
case 1:
{
system(“cls”);
cout<<“创建矩阵…”< creat(A);
print(A);
system(“pause”);
system(“cls”);
print_menu();
break;
}
case 2:
{
int n1,n2;
system(“cls”);
cout<<“请输入参与相加运算的矩阵B:”< cout<<"=================请输入矩阵的行列数及非零元个数(行数 列数 非零元素个数):";
cin>>B->m>>B->n>>B->len;
for(int i=0;ilen;i++)
{
printf(“请输入第 %d 个非零元素的行: “,i+1);
cin>>n1;
B->data[i].row=(n1-1);
printf(“请输入第 %d 个非零元素的列: “,i+1);
cin>>n2;
B->data[i].col=(n2-1);
printf(“请输入第 %d 个非零元素的值: “,i+1);
cin>>B->data[i].data;
printf(”\n”);
}
add(A,B,&C);
print(A);
cout<<”+”< print(B);
cout<<”==================相加结果:”< print©;
system(“pause”);
system(“cls”);
print_menu();
break;
}
case 3:
{
int n1,n2;
system(“cls”);
cout<<“请输入参与相减运算的矩阵D:”< cout<<"=================请输入矩阵的行列数及非零元个数(行数 列数 非零元素个数):";
cin>>D->m>>D->n>>D->len;
for(int i=0;ilen;i++)
{
cout<<"请输入第 “< cin>>n1;
D->data[i].row=(n1-1);
cout<<“请输入第 “< cin>>n2;
D->data[i].col=(n2-1);
cout<<“请输入第 “< cin>>D->data[i].data;
printf(”\n”);
}
sub(A,D,&C);
cout<<“矩阵A-矩阵D:”< print(A);
cout<<”-”< print(D);
cout<<”====================相减结果:”< print©;
system(“pause”);
system(“cls”);
print_menu();
break;
}
case 4:
{
int n1,n2;
system(“cls”);
cout<<“请输入参与相乘运算的矩阵E:”< cout<<”=================请输入矩阵的行列数及非零元个数:”;
cin>>E->m>>E->n>>E->len;
for(int i=0;ilen;i++)
{
cout<<"请输入第 "< cin>>n1;
E->data[i].row=(n1-1);
cout<<"请输入第 "< cin>>n2;
E->data[i].col=(n2-1);
cout<<"请输入第 “< cin>>E->data[i].data;
printf(”\n”);
}
arr(A,E,&C);
print(A);
cout<<”
"< print(E);
cout<<"==================相乘结果:"< print©;
system(“pause”);
system(“cls”);
print_menu();
break;
}
case 5:
{
int m,n;
int value;
system(“cls”);
print(A);
cout<<"======================请输入需要查找的行号和列号(行 列):";
cin>>m>>n;
value=search_1(A,m,n);
cout<<“第”< system(“pause”);
system(“cls”);
print_menu();
break;
}
case 6:
{
int value;
system(“cls”);
print(A);
cout<<"=======================请输入需要A矩阵的非零元素值:";
cin>>value;
search_2(A,value);
system(“pause”);
system(“cls”);
print_menu();
break;
}
case 7:
{
exit(0);
break;
}
}
cin>>num;
}
cin>>num;
}

你可能感兴趣的:(数据结构)