稀疏矩阵十字链表表示
生活随笔
收集整理的這篇文章主要介紹了
稀疏矩阵十字链表表示
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
類型定義
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX 100
/*稀疏矩陣的十字鏈表表示:非零元素節(jié)點與表頭節(jié)點公用一種類型
*/
typedef struct matrixnode
{int row,col;struct matrixnode *right,*down;union{int val;//非零元素節(jié)點的值struct matrixnode*next;//指向下一個表頭節(jié)點}tag;
}matrixnode;
typedef matrixnode*spmatrix;
typedef spmatrix headspmatrix[MAX];//保存i行/i列的表頭節(jié)點指針
void say(spmatrix p)
{printf("row:%d\ncol:%d\n",p->row,p->col);printf("right---%p\ndown---%p\n",p->right,p->down);
}
void Createspmatrix (headspmatrix h)
{int m,n,t,s,i,r,c,v;spmatrix p,q;printf("矩陣的行數(shù).列數(shù).和非零元素的個數(shù):\n");scanf("%d%d%d",&m,&n,&t);//初始化一個表頭節(jié)點,儲存鏈表的行數(shù),列數(shù)p=(spmatrix)malloc(sizeof(matrixnode));h[0]=p;p->row=m;p->col=n;s=m>n?m:n;//表頭節(jié)點個數(shù)取行列數(shù)的較大值h[0]->tag.val=s;for(i=1;i<=s;i++){p=(spmatrix)malloc(sizeof(matrixnode));h[i]=p;h[i-1]->tag.next=p;//將上一個表頭節(jié)點與該表頭節(jié)點連接p->row=p->col=0;//表頭節(jié)點的row和col置空p->down=p->right=p;//當(dāng)前表頭節(jié)點初始化為空,down和right指向自身。}h[s]->tag.next=h[0];//最后一個表頭節(jié)點與頭節(jié)點連接,形成環(huán)for(i=1;i<=t;i++){printf("請輸入非零元素的行號,列號,值:\n");scanf("%d%d%d",&r,&c,&v);p=(spmatrix)malloc(sizeof(matrixnode));//printf("46\n");p->row=r;p->col=c;p->tag.val=v;//printf("47\n");q=h[r];//取得該行表頭節(jié)點指針//printf("49\n");while(q->right!=h[r]&&q->right->col<c)//連接到相應(yīng)行{q=q->right;//printf("52\n");}// printf("51\n");p->right=q->right;q->right=p;q=h[c];//取得該列表頭節(jié)點指針while(q->down!=h[c]&&q->down->row<r)//連接到相應(yīng)列q=q->down;p->down=q->down;q->down=p;}
}相關(guān)操作
//在十字鏈表中查找元素,通過指針返回對應(yīng)坐標(biāo),函數(shù)返回1表示查找成功
int locatespmatrix(headspmatrix h,int x,int *rowx,int *colx)
{spmatrix p,q;p=h[0]->tag.next;while(p!=h[0]){q=p->right;while(p!=q){if(q->tag.val==x){*rowx=q->row;*colx=q->col;return 1;}q=q->right;}p=p->tag.next;}return 0;
}
//遍歷稀疏矩陣的十字鏈表并按行優(yōu)先輸出
void matrix_display(headspmatrix h)
{spmatrix p,q;p=h[0]->tag.next;while(p!=h[0]){q=p->right;while(p!=q){printf("%d %d %d",q->row,q->col,q->tag.val);q=q->right;}printf("\n");p=p->tag.next;}
}
//銷毀整個十字鏈表
void matrix_destory(headspmatrix h)
{spmatrix p,q,t;p=h[0]->tag.next;int s=0;while(p!=h[0]){q=p->right;while(p!=q){t=q->right;free(q);printf("%d is kill\n",++s);q=t;}p=p->tag.next;}
}版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/Thereisnospon/p/4768518.html
總結(jié)
以上是生活随笔為你收集整理的稀疏矩阵十字链表表示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 山开头的成语有哪些啊?
- 下一篇: 完璧归赵的作者是谁啊?