當前位置:成語大全網 - 書法字典 - 稀疏字典代碼

稀疏字典代碼

想法:首先,建立壹個交叉鏈表來生成a和b .然後添加(註意,要考慮所有情況!!)。

壹些解釋:

矩陣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);

}