壹些解釋:
矩陣A,矩陣B,矩陣C。
用p和q控制a的等級
使用u和v來控制b的等級。
以下是程序的代碼
# include & ltstdio.h & gt
# include & ltmalloc.h & gt
#定義smax 100
typedef int數據類型;
Typedef結構lnode //結構的定義和* * *
{
int i,j;
struct lnode *cptr,* rptr
聯盟
{
struct lnode * next
數據類型v;
} uval
}鏈接;
int flag = 0;
//建立稀疏矩陣的函數,返回交叉鏈表的頭指針。
link *creatlinkmat()
{
link *p、*q、*head、* CP【smax】;
int i,j,k,m,n,t,s;
數據類型v;
Printf(“輸入行和列,非零元素的數量(m,n,t數字用逗號分隔)“);
scanf(“%d、%d、% d“、& ampm & amp;n & amp;t);//輸入行數、列數和非零元素數。
if(m & gt;n)s = m;else s = n;
head =(link *)malloc(sizeof(link);//創建交叉鏈表的頭節點
head-》;I = m;head-》;j = n;
CP【0】= head;//cp【】是壹個指針數組,分別指向行和列表的頭節點和頭節點。
for(I = 1;我& lt= s;i++)//建立頭節點循環鏈表。
{
p =(link *)malloc(sizeof(link);
p-》;I = 0;p-》;j = 0;
p-》;rptr = p;p-》;cptr = p;
CP【I】= p;CP【I-1】-& gt;uval . next = p;
}
CP【s】-& gt;uval.next = head
for(k = 1;k & lt= t;k++)
{
printf(“/t element % d(行號I,列號J,值V,用空格分隔的數字:\“,k);
scanf(“% d % d % d“,& amp我& ampj & amp;五);
p =(link *)malloc(sizeof(link);
p-》;i = ip-》;j = jp-》;uval.v = v
q = CP【I】;
while((q-》;rptr!= CP【I】)& amp;& amp(問-》;rptr-& gt;j & ltj)
q = q-》;rptr
p-》;rptr = q-& gt;rptr
q-》;rptr = p;
q = CP【j】;
while((q-》;cptr!= CP【j】)& amp;& amp(問-》;cptr-& gt;我& lt我)
q = q-》;cptr
p-》;cptr = q-& gt;cptr
q-》;cptr = p;
}
回程頭;
}
//插入節點函數
void insert(int I,int j,int v,link *cp【】)
{
link *p,* q;
p =(link *)malloc(sizeof(link);
p-》;i = ip-》;j = jp-》;uval.v = v
//下面通過*p節點插入到第I個鏈表中。
q = CP【I】;
while((q-》;rptr!= CP【I】)& amp;& amp(問-》;rptr-& gt;j & ltj)
q = q-》;rptr//在第I行*(q-& gt;rptr)
//如果沒有找到,*q是該行表的尾節點。
p-》;rptr = q-& gt;rptr
q-》;rptr = p;//*p插入在* q之後。
//下面是將節點插入第J個鏈表。
q = CP【j】;//取第j個列表的頭節點
while((q-》;cptr!= CP【j】)& amp;& amp(問-》;cptr-& gt;我& lt我)
q = q-》;cptr//在j *(q-》)行中查找第壹列編號大於I的節點;cptr)
//如果沒有找到,*q是該行表的尾節點。
p-》;cptr = q-& gt;cptr
q-》;cptr = p;//*p插入在* q之後。
}
//輸出交叉鏈表的功能
無效打印(鏈接*A)
{
link *p、*q、* r;//p是控制線q、控制列r和控制輸出的格式。
int k,col,t,row
col = A-& gt;j;//矩陣A的列數
Printf(“矩陣是:/n“);
p = A-& gt;uval.next//p指向第壹個節點(不是頭節點)
而(p!=A)
{
q = p-》;rptr//p指向這行中的壹個值。
if(q = = A-》;cptr)中斷;//如果行或列已經處理,則跳出。
r = p;//r指向這壹行的頭節點。
而(q!=p)
{
for(k = 1;k & ltq-》;j-(r-& gt;j);k++)//在同壹行的兩個非零數據之間輸出零。
printf(“0“);
printf(“% 3d“,q-& gt;uval . v);//輸出非零值
q = q-》;rptr//q指向本行的下壹個元素。
r = r-& gt;rptr//r指向q之前的非零元素。
}
k = r-& gt;j;//k的值是壹行中最後壹個非零元素的列數。
for(t = k;t & ltcolt++)//輸出壹行最後壹個非零元素後的零。
printf(“0“);
printf(“/n“);
p = p-& gt;uval.next//p指向下壹行。
}
}
鏈接*添加(鏈接*a,鏈接*b)
{
link *p、*q、*u、*v、*r、* CP【smax】、* c;//p,q控制跨鏈A的等級,u,v控制跨鏈b的等級。
int s,I;
if(a-》gt;我!= b-》;我| | a-》;j!= b-》;j)
{ flag = 1;返回NULL}
//創建c的頭環鏈。
c =(link *)malloc(sizeof(link);
c-》;I = a-& gt;我;c-》;j = a-& gt;j;
if(c-》;我& gtc-》;j)s = c-》;我;else s = c-& gt;j;
CP【0】= c;
for(I = 1;我& lt= s;i++)
{
r =(link *)malloc(sizeof(link);
r-& gt;I = 0;r-& gt;j = 0;
r-& gt;rptr = r;r-& gt;cptr = r;
CP【I】= r;
CP【I-1】-& gt;uval . next = r;
}
CP【s】-& gt;uval . next = c;
//矩陣加法
p = a-& gt;uval.nextu = b-& gt;uval.next
而(p!= a & amp& ampu!=b)
{
q = p-》;rptrv = u-》;rptr
if(q = = p & amp;& ampv!= u)//矩陣A的行p為空,矩陣B的行u不為空。
while(v!= u)//將B的所有行復制到求和矩陣中。
{ insert(v-& gt;我,v-& gt;j,v-》;uval.v,CP);v = v-& gt;rptr}
else if(v = = u & amp;& ampq!= p)//矩陣A中的p行不為空,矩陣B中的u行為空。
而(q!=p)
{ insert(q-& gt;我,q-》;j,q-》;uval.v,CP);q = q-》;rptr}
else if(q!=寶潔公司。& ampv!= U)//矩陣B的行U和矩陣A的行P都不是空的。
{
而(q!=寶潔公司。& ampv!=u)
{
if(q-》;j & ltv-》;j)//如果A中某個元素的列數小於B,則將A中小於B的所有值插入c中。
{ insert(q-& gt;我,q-》;j,q-》;uval.v,CP);q = q-》;rptr}
else if(q-》;j & gtv-》;j)//如果B中元素的列數小於A中的列數,則將A中小於B的所有值插入c中。
{ insert(v-& gt;我,v-& gt;j,v-》;uval.v,CP);v = v-& gt;rptr}
Else//a和B當前處於相同的位置。判斷相加的和是否為零,只有不為零時才進行加法運算。
{ if(q-& gt;uval . v+ v-& gt;uval.v!=0)插入(q-》;我,q-》;j,(q-》;uval . v+ v-& gt;uval.v)、CP);
q = q-》;rptrv = v-& gt;rptr
}
}
if(q = = p & amp;& ampv!= u)//如果B未處理,則將B中所有未處理的值插入求和矩陣。
while(v!=u)
{ insert(v-& gt;我,v-& gt;j,v-》;uval.v,CP);v = v-& gt;rptr}
else if(v = = u & amp;& ampq!= p)//如果A未處理,則將A中所有未處理的值插入求和矩陣。
而(q!=p)
{ insert(q-& gt;我,q-》;j,q-》;uval.v,CP);q = q-》;rptr}
else//都做了,什麽都沒做。
}
else//矩陣B的第U行和矩陣A的第P行都是空的,什麽都不做。
p = p-& gt;uval.nextu = u-& gt;uval.next//a和B都指向下壹行。
}
返回c;
}
//
void main()
{
鏈接*A、*B、* C;
a = creat link mat();打印(壹份);
b = creat link mat();打印(B);
c = add(A,B);
if(flag = = 1)printf(“矩陣A和B不能相加!!");
Else printf(“和矩陣c為:/n“);打印(C);
}