㈠ 稀疏矩阵的加法和乘法c语言(十字链算法)
你没有写具体要求,是用采用三元组作存储结构还是数组,下面是我们以前做过的数据结构习题你参考一下:
能区分加法、减法、乘法和转置;能处理任意输入的典型数据和进行出错数据处理(例如乘法,当第一个矩阵的列数不等于第二个矩阵的行数时);必须采用三元组作存储结构,不能采用数组等形式;输出要求用矩阵的形式输出(即习题集136页的形式),当第一个矩阵的行数不等于第二个矩阵的行数时,注意如第三个乘法的形式输出
******************************************************************************************
#include<stdio.h>
#define maxsize 100
typedef struct
{
int i,j; //该非零元的行和列
int v; //该非零元的值
}triple;
typedef struct
{
triple data[maxsize]; //非零元三元组表,data[0]未用
int rpos[maxsize];
int m,n,t; //矩阵的行数,列数和非零元个数
}tripletable;
void convert() //矩阵的转置
{
int k;
tripletable A,B;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
B.m=A.m;B.n=A.n;B.t=A.t;
if(B.t)
{
int q=1,col;
for(col=1;col<=A.n;++col)
for(int p=1;p<=A.t;++p)
if(A.data[p].j==col)
{
B.data[q].i=A.data[p].j;
B.data[q].j=A.data[p].i;
B.data[q].v=A.data[p].v;
++q;
}
}
int shuru[100][100]={0};
for(k=1;k<=B.t;k++)
{
shuru[B.data[k].j][B.data[k].i]=B.data[k].v;
}
printf("输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",shuru[k][l]);
printf("\n");
}
int result[100][100]={0};
for(k=1;k<=B.t;k++)
{
result[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("结果为:\n");
for(k=1;k<=B.n;k++)
{
for(int l=1;l<=B.m;l++)
printf("%d ",result[k][l]);
printf("\n");
}
}
void add() //矩阵的加法
{
int k;
tripletable A,B;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
printf("输入稀疏矩阵B的行数,列数和非零元个数:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
if(A.m!=B.m||A.n!=B.n)
{
printf("输入错误:A与B的行数或列数不相同,请重新输入\n");
return;
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A输入为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}
int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
{
c[k][l]=a[k][l]+b[k][l];
}
}
printf("加法结果C为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}
void jian() //矩阵的减法
{
int k;
tripletable A,B;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
printf("输入稀疏矩阵B的行数,列数和非零元个数:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
if(A.m!=B.m||A.n!=B.n)
{
printf("输入错误:A与B的行数或列数不相同,请重新输入\n");
return;
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}
int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
{
c[k][l]=a[k][l]-b[k][l];
}
}
printf("减法结果C为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}
void multi() //矩阵的乘法
{
int k;
tripletable A,B,C;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
int row=1;
for(k=1;k<=A.t;k++)
{
while(row<=A.data[k].i)
{
A.rpos[row++]=k;
}
}
while(row<=A.m)A.rpos[row++]=A.t+1;
printf("输入稀疏矩阵B的行数,列数和非零元个数:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
row=1;
for(k=1;k<=B.t;k++)
{
while(row<=B.data[k].i)
{
B.rpos[row++]=k;
}
}
while(row<=B.m)B.rpos[row++]=B.t+1;
if(A.n!=B.m)
{
printf("输入错误:A的列数不等于B的行数,请重新输入\n");
return;
}
C.m=A.m;C.n=B.n;C.t=0;
int arow,p,q,ccol,t,tp;
if(A.t*B.t!=0)
{
for(arow=1;arow<=A.m;++arow)
{
int ctemp[maxsize]={0};
C.rpos[arow]=C.t+1;
if(arow<A.m){tp=A.rpos[arow+1];}
else{tp=A.t+1;}
for(p=A.rpos[arow];p<tp;++p)
{
int brow=A.data[p].j;
if(brow<B.m){t=B.rpos[brow+1];}
else{t=B.t+1;}
for(q=B.rpos[brow];q<t;++q)
{
ccol=B.data[q].j;
ctemp[ccol]+=A.data[p].v*B.data[q].v;
}
}
for(ccol=1;ccol<=C.n;++ccol)
{
if(ctemp[ccol])
{
if(++C.t>maxsize)return;
C.data[C.t].i=arow;
C.data[C.t].j=ccol;
C.data[C.t].v=ctemp[ccol];
}
}
}
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A输入为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}
int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=C.t;k++)
{
c[C.data[k].i][C.data[k].j]=C.data[k].v;
}
printf("乘法结果C为:\n");
for(k=1;k<=C.m;k++)
{
for(int l=1;l<=C.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}
void main()
{
printf("============= 菜 单 ==============\n");
printf(" 1 矩阵转置\n");
printf(" 2 矩阵加法\n");
printf(" 3 矩阵减法\n");
printf(" 4 矩阵乘法\n");
printf("======================================\n\n");
loop: printf("请选择相应操作的序号:");
int y;
scanf("%d",&y);
switch(y)
{
case 1: convert();
printf("\n");
goto loop;
case 2: add();
printf("\n");
goto loop;
case 3: jian();
printf("\n");
goto loop;
case 4: multi();
printf("\n");
goto loop;
}
}
㈡ 用邻接表表示稀疏矩阵并实现矩阵的加法减法乘法运算!求C语言代码啊!
# include <stdio.h>
typedef struct a
{
int **arc;
int vexnum;
}table;
void createbiao(table *a)//建立邻接表
void tableplus(table *a,table *b)
{
int i,j
if(a->vexnum!=b->vexnum)
{printf("不能做加法!\n");exit(0);}
for(i=0;i<a->vexnum;i++)
for(j=0;j<a->vexnum;j++)
a->arc[i][j]+=b->arc[i][j];
}
void tablejian(table *a,table *b)
{
int i,j
if(a->vexnum!=b->vexnum)
{printf("不能做减法!\n");exit(0);}
for(i=0;i<a->vexnum;i++)
for(j=0;j<a->vexnum;j++)
a->arc[i][j]-=b->arc[i][j];
}
void tableplus(table *a,table *b)
{
int i,j,k,usum=0;
if(a->vexnum!=b->vexnum)
{printf("不能做乘法!\n");exit(0);}
for(i=0;i<a->vexnum;i++)
{
for(k=0;k<a->vexnum;k++)
{
sum=0
for(j=0;j<a->vexnum;j++)
sum=arc->arc[i][j]*b->arc[j][k];
a->arc[i][k]=sum;
}
}
}
有问题追问,写写不容易
㈢ 数据结构(C语言版)稀疏矩阵相乘程序 不能得出相乘的结果 拜托帮帮我!!
给你 另一个我自己写的 矩阵相乘的算法 你可以借鉴一下 用c语言的话 就要改一些细节地方 我是用 C++
void xiangcheng()
{ char ch;
int m,n,m1,n1;
float a[100][100],b[100][100],sum=0;
int i=0,k,flag=1,t,p;
system("cls");
printf("请输入第一个矩阵的行数m与列数n:\n\n");
printf("行数m==");
scanf("%d",&m);
if(m==0)
return;
printf("列数n==");
scanf("%d",&n);
if(n==0)
return;
printf("请输入第一个矩阵的数字:\n\n");
for(i=0;i<m;i++)
for(k=0;k<n;k++)
{scanf("%f",&a[i][k]);
}
while(flag)
{
system("cls");
printf("\n\n您输入第一个矩阵的行数m==%d与列数n==%d:\n\n",m,n);
printf("请输入第二个矩阵的行数m1与列数n1 注意行数 m1 与前一个矩阵的 列数 n 必须向等:\n\n");
printf("行数m1==");
scanf("%d",&m1);
printf("列数n1==");
scanf("%d",&n1);
if(n==m1)
break;
else if(n!=m1)
{ system("cls");
printf("你的输入有误!!!! 前一个矩阵的列(n) 与 第二个矩阵的行(m1) 必须相等\n");
printf("\n是否要再次输入(Y or N)\n");
getchar();
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
flag++;
else flag=0;
}
}
if(flag)
{
printf("请输入第二个矩阵的数字 :\n\n");
for(i=0;i<m1;i++)
for(k=0;k<n1;k++)
scanf("%f",&b[i][k]);
}
for(i=0;i<m;i++)
{ for(t=0;t<n1;t++)
{for(k=0,p=0;p<m1;p++,k++)
sum=sum+a[i][k]*b[p][t];
printf(" %f ",sum);
sum=0;
}
printf("\n\n");
}
printf("\n\n 请按ENTER键返回: \n");
getchar();
getchar();
return;
}
㈣ 求稀疏矩阵的乘法运算的C语言编程(用十字链表 ) 急急急
UDP Server程序
1、编写UDP Server程序的步骤
(1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。
(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。
(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。
2、udpserv.c程序内容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 80
#define SERV_PORT 8888
void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];
for(;;)
{
len = clilen;
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}
int main(void)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}
do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
return 0;
}
UDP Client程序
1、编写UDP Client程序的步骤
(1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。
(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。
(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。
(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。
(6)处理接收到的数据,这里是直接输出到标准输出上。
2、udpclient.c程序内容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXLINE 80
#define SERV_PORT 8888
void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE + 1];
/* connect to server */
if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)
{
perror("connect error");
exit(1);
}
while(fgets(sendline, MAXLINE, fp) != NULL)
{
/* read a line and send to server */
write(sockfd, sendline, strlen(sendline));
/* receive data from server */
n = read(sockfd, recvline, MAXLINE);
if(n == -1)
{
perror("read error");
exit(1);
}
recvline[n] = 0; /* terminate string */
fputs(recvline, stdout);
}
}
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in srvaddr;
/* check args */
if(argc != 2)
{
printf("usage: udpclient <IPaddress>\n");
exit(1);
}
/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{
printf("[%s] is not a valid IPaddress\n", argv[1]);
exit(1);
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
return 0;
}
运行例子程序
1、编译例子程序
使用如下命令来编译例子程序:
gcc -Wall -o udpserv udpserv.c
gcc -Wall -o udpclient udpclient.c
编译完成生成了udpserv和udpclient两个可执行程序。
2、运行UDP Server程序
执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:32768 0.0.0.0:*
udp 0 0 0.0.0.0:8888 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:882 0.0.0.0:*
可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。
如果这时再执行./udpserv &命令,就会看到如下信息:
bind error: Address already in use
说明已经有一个服务程序在运行了。
3、运行UDP Client程序
执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:
Hello, World!
Hello, World!
this is a test
this is a test
^d
输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。
如果服务程序没有启动,而执行客户程序,就会看到如下信息:
$ ./udpclient 127.0.0.1
test
read error: Connection refused
说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpmp程序来抓包,会发现收到的是ICMP的错误信息。
㈤ 利用稀疏矩阵的顺序存储实现稀疏矩阵的加、减、乘、转置等简单运算。 这是课题要求,求大佬用c语言。
内容
假设两个稀疏矩阵A和B,他们均为m行n列,要求表写求矩阵的加法即:C=A+B的算法(C矩阵存储A与B相加的结果)
分析
利用一维数组来存储,一维数组顺序存放非零元素的行号、列号和数值,行号-1表示结束,然后进行矩阵加法运算时依次扫描矩阵A和B的行列值,并以行优先。当行列相同的时候,将第三个元素的值相加和以及行列号三个元素存入结果数组C中;不相同时,将A或B的三个元素直接存入结果数组中。
代码
// fanchen.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; #define LINE 10 struct Node{ //行号 int row; //列号 int line; //数据 int data; }; //初始化数组 int init(Node array[]) { int row,line,data; int index = 0; while(cin>>row){ if(row == -1){ break; } cin>>line>>data; array[index].data=data; array[index].line = line; array[index].row = row; index++; } return index; } //打印数组 void printArray(Node array[],int len) { for(int i = 0;i < len;i++){ cout<<array[i].row<<" "<<array[i].line<<" "<<array[i].data<<endl; } } int calc(Node a
㈥ 十字链表表示稀疏矩阵,并求矩阵的加法,减法,乘法,运算要求用C语言
十字链的原理很简单啊。实现也比较简单。i,here, give you the defination of the node.and you can build a cross_linkList by yourself or you can take a look at what the above writing.
定义一个表头结点数据类型,实现的时候定义一个数组即可。
typedef struct node{
int vex;//顶点
struct *node *first;//指向第一个与其有联系的结点
}ListNode;
然后再定义一个结点的类型,
typedef struct node{
int vexNum;//顶点编号
int vexData;//顶点数据
struct *node *next;//指向其它与表头结点有联系的结点
}Node;
矩阵的加法是对应项相加,那么你只需要把用十字链表示的两个矩阵中,对应项相加即可。具体来说,对每个顶点,在表头表中查找,然后再查找与其有联系的结点。指针后移,比较两个十字链表中是否存在两个相同的结点,有,则相加,将结果保存到其中一个十字链表中。否则,不变。依次查找其他的顶点。就可以得到结果。
ListNode head1,head2;
Node *p,*q;
p=head1->frist;
q=head2->first;
while(!p)
{
while(!q)
{
if(p->vexNum==q->vexNum)
{
p->vexData+=q->vexData;//put the result into the first cross_linkList;
break;//
}
q=q->next;
}
p=p->next;
}
the implement of adding is just like what i writing above.
And the others are similar .you can do it by yourself.trust youself.
㈦ 稀疏矩阵运算器:c++语言
#include <iostream.h>
#define EPS 1.0E-8 //很小的数认为是零元素
class elem{ //定义矩阵元素类
int col;
float data;
public:
elem * next; //行链接
elem(int c,float d,elem * nx=NULL){col=c;data=d;next=nx;};
elem(){col=0;data=0;next=NULL;};
~elem(){cout<<"del "<<col<<" "<<data<<" ";delete next;next=NULL;};
float getdata(){return data;};
int getcol(){return col;}
int setcol(int c){return(col=c);};
float setdata(float d){return(data=d);};
};
class coeffmatrix{ //稀疏矩阵类
int N; //行数
int M; //列数
elem ** Row; //行链接点列表 全零行指针为NULL
public:
coeffmatrix(int n,int m){
N=n;
M=m;
Row=new elem * [n];
for(int i=0;i<N;i++){
Row[i]=NULL;
}
};
coeffmatrix(){ //无参构造函数 建立空矩阵
N=0;M=0;Row=NULL;
};
coeffmatrix(coeffmatrix & m){ //拷贝构造函数
N=m.N;M=m.M;Row=new elem * [N];
for(int i=0;i<N;i++){
if(m.Row[i]!=NULL){
Row[i]=NULL;
}else{
elem * p=m.Row[i];
elem * q=new elem(p->getcol(),p->getdata());
elem * s=q;
Row[i]=q;
p=p->next;
while(p){
q=new elem(p->getcol(),p->getdata());
s->next=q;
s=q;
p=p->next;
}
}
}
};
~coeffmatrix(){
if(N!=0){
if(Row!=NULL){
for(int i=0;i<N;i++){
if(Row[i]!=NULL){
delete Row[i];
Row[i]=NULL;
}
}
delete * Row;
Row=NULL;
}
}
}
bool reset(int n,int m){ //扩展行列数,原内容不破坏,
if(n==N && m==M)return true;
if(n<N || m<M)return false;
cout<<endl;
elem ** p=Row;
elem ** Rx=new elem * [n];
for(int i=0;i<n;i++){
if(i<N){
Rx[i]=Row[i];
}else{
Rx[i]=NULL;
}
}
delete * p ;
Row=Rx;
N=n;M=m;
return true;
};
float set_elem(int r,int c,float d){ //元素赋值
if ((r>N || c>M)||(r<1||c<1))return 0;
if(Row==NULL)return 0;
if(d<EPS)return 0;
elem * p;
p=Row[r-1];
if(p==NULL){
Row[r-1]=new elem(c,d);
return d;
}
do{
if(p->getcol()==c){
p->setdata(d);
return d;
}
if(p->next != NULL){
if(p->next->getcol()>c){
p->next=new elem(c,d,p->next);
return d;
}
}else{
p->next=new elem (c,d);
return d;
}
p=p->next;
}while(p);
};
float add_elem(int r,int c,float d){ //元素+数值
if(r>N || c>M)return 0;
if(d<EPS)return 0;
elem * p;
p=Row[r-1];
if(p==NULL){
Row[r-1]=new elem(c,d);
return d;
}
while(p){
if(p->getcol()==c){
p->setdata(p->getdata()+d);
return p->getdata();
}
if(p->next != NULL){
if(p->next->getcol()>c){
p->next=new elem(c,d,p->next);
return d;
}else{
p=p->next;
}
}else{
p->next=new elem (c,d);
return d;
}
};
};
void add(coeffmatrix * mat){ //加 矩阵 ;可以行列数不同 ,
//如果需要必须行列数相同才能加,则将
//以下三行改为,行列数验证
int Nx=this->N>mat->NX()?this->N:mat->NX();
int Mx=this->M>mat->MX()?this->M:mat->MX();
reset(Nx,Mx);
//----
for(int i=1;i<=mat->NX();i++){
for(int j=1;j<=mat->MX();j++){
float d=mat->ELEM(i,j);
add_elem(i,j,d);
}
}
};
void sub(coeffmatrix * mat){ //减 矩阵
int Nx=this->N>mat->NX()?this->N:mat->NX();
int Mx=this->M>mat->MX()?this->M:mat->MX();
reset(Nx,Mx);
for(int i=1;i<=mat->NX();i++){
for(int j=1;j<=mat->MX();j++){
float d=mat->ELEM(i,j);
add_elem(i,j,-d);
}
}
};
int NX(){return N;};
int MX(){return M;};
float ELEM(int n,int m){ //取矩阵元素值 A[n,m]
float a=0;
if(n<=N && n>=1){
if(m<=M && m>=1){
elem * p=Row[n-1];
while(p){
if(p->getcol()==m){a=p->getdata();break; }
p=p->next;
}
}
}
return a;
};
void fset(int n,int m){ //强行重置矩阵行列,并所有行为空,即矩阵为全零阵
if(N!=0){
if(Row!=NULL){
for(int i=0;i<N;i++){
if(Row[i]!=NULL){
delete Row[i];
Row[i]=NULL;
}
}
delete * Row;
}
}
Row=new elem * [n];
for(int i=0;i<n;i++)Row[i]=NULL;
N=n;M=m;
}
bool friend mul(coeffmatrix * result,coeffmatrix *m1,coeffmatrix *m2) //友元函数 矩阵乘法
{
if(m1->MX()!=m2->NX())return false;
int Mp=m1->MX();
int Nx=m1->NX();
int Mx=m2->MX();
result->fset(Nx,Mx);
for(int i=1;i<=Nx;i++){
for(int j=1;j<=Mx;j++){
float s=0;
for(int k=1;k<=Mp;k++){
s+=m1->ELEM(i,k)*m2->ELEM(k,j);
}
result->set_elem(i,j,s);
}
}
return true;
}
void show(){ //矩阵显示
cout<<"Matrix "<<N<<" x "<<M<<endl;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
cout<<ELEM(i,j)<<"\t";
}
cout<<endl;
}
}
};
int main()
{
int NN=5;
coeffmatrix m1(NN,NN);
coeffmatrix m2(NN,NN);
cout<<"setup the matrix"<<endl;
for(int i=1;i<=NN;i++){
for(int j=i;j<=NN;j++){
m1.set_elem(i,j,i*j);
}
m2.set_elem(i,NN-i+1,1);
}
coeffmatrix m3;
m1.show();
m2.show();
mul(&m3,&m2,&m1);
m3.show();
m3.add(&m1)
m3.show();
}
(这几天事多点,才编出来调试通过,还不大完善,搂主自己再完善一些。希望对已有帮助)
㈧ 用C语言实现稀疏矩阵的快速转置和乘法。能够在TC2.0运行的求各位大侠帮忙
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
struct S{ int i;
int j;
int v;
struct S *next;
};
struct S *B,*p,*q;
main()
{ int k,a,b,c,m,n;
c=m=n=0;
clrscr();
printf("-----------欢迎使用!-------------\n\n");
p=(struct S *)malloc(sizeof(struct S)); /*申请存储空间*/
p->next=NULL;
B=p;
while(1)
{
printf("\n请输入矩阵元素所在行:");
scanf("%d",p->i);
printf("\n请输入矩阵元素所在列:");
scanf("%d",p->j);
printf("\n请输入矩阵元素值:");
scanf("%d",p->v);
printf("\n是否继续输入?(Y/N)");
if(getchar()=='N'||getchar()=='n') break;
q=(struct S *)malloc(sizeof(struct S)); /*申请存储空间*/
q->next=NULL;
p->next=q;
p=q;
}
printf("\nthe B is:\n");
q=B;
while(q->next!=NULL)
{ printf("%5d%5d%5d\n",q->i,q->j,q->v);
q=q->next;
}
getch();
}
㈨ C语言编写稀疏矩阵的加,减,乘和转置,要求用矩阵输出
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define Max 12500
#define Elemtype int
typedef struct {
int i ,j ;
Elemtype e;
}Triple;
typedef struct {
Triple data[Max+1];
int mu,nu,tu;
}Tsmatrix;
int Createsmatrix(Tsmatrix &M)
{ int n;
cout<<"请输入稀疏矩阵的元素个数n"<<endl;
cin>>n;
M.tu=n;
cout<<"请输入稀疏矩阵的行数,列数:"<<endl;
cin>>M.mu>>M.nu;
int i;
for(i=1;i<=n;i++){
cout<<"请输入稀疏矩阵的行下标和列下标,及数据;"<<endl;
cin>>M.data[i].i>>M.data[i].j>>M.data[i].e ;
}
return 1;
}
int Transpose(Tsmatrix M , Tsmatrix &T)
{
T.mu=M.nu; T.nu=M.mu ; T.tu=M.tu;
if(T.tu){
int col , p , q=1;
for(col=1; col<=M.nu;++col)
for(p=1;p<=M.tu;++p)
if (M.data[p].j==col){
T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e ; ++q;}
}
return 1;
}
int Print(Tsmatrix M)
{
int i;int p=1;
{
for (i=1;i<=M.mu*M.nu;i++)
if(i==((M.data[p].i-1)*M.nu+M.data[p].j))
{
if(M.data[p].j==M.nu)
{ cout<<M.data[p].e<<endl; p++;}
else
{ cout<<M.data[p].e<<" "; p++;}
}
else if(i%M.nu==0) cout<<"0"<<endl;
else cout<<"0 ";
}
cout<<"\n"<<endl;
return 1;
}
int Addsmatrix(Tsmatrix a, Tsmatrix b, Tsmatrix &c)
{
int s=1,t=1,k=1; Elemtype temp;
if(a.mu!=b.mu||a.nu!=b.nu) return 0;
if(a.tu == 0) {c=b; return 1;}
if(b.tu==0) {c=a; return 1;}
if(a.tu==0 && b.tu==0) { c=a; return 1;}
while(!(s>a.tu && t>b.tu))
{
if(a.data[s].i>b.data[t].i)
{
c.data[k]=b.data[t];
k++ ;t++;
}
if(a.data[s].i<b.data[t].i)
{
c.data[k]=a.data[s];
k++ ;s++;
}
if(a.data[s].i==b.data[t].i)
{
if(a.data[s].j>b.data[t].j)
{
c.data[k]=b.data[t];
k++; t++;
}
if(a.data[s].j<b.data[t].j)
{
c.data[k]=a.data[s];
k++; s++;
}
if(a.data[s].j==b.data[t].j)
{
temp=a.data[s].e+b.data[t].e;
if(temp==0){s++;t++;}
else
{ c.data[k].e=temp;c.data[k].i=a.data[s].i;c.data[k].j=a.data[s].j;
s++;t++;k++;
}
}
}//if
if(s>a.tu&&t<=b.tu)
{
while(t<=b.tu)
{
c.data[k]=b.data[t];
k++; t++;
}
}
if(t>b.tu&&s<=a.tu)
{
while(s<=a.tu)
{
c.data[k]=a.data[s];
k++; s++;
}
}
}//while
c.tu=k-1; c.mu=a.mu; c.nu=a.nu;
}
return 1;int main()
{
Tsmatrix a,b,c;
Createsmatrix( a);
Createsmatrix( b);
Print(a);
Print(b);
Addsmatrix(a,b,c);
Print(c);
return 1;
}
㈩ 求C语言稀疏矩阵乘法的程序
看这里:http://..com/question/7712874.html