稀疏矩阵——数据结构

来源:互联网 发布:快捷支付软件 编辑:程序博客网 时间:2024/06/16 19:08


三元组表表示法和十字链表表示法及转置函数;


#include<stdio.h>#include<stdlib.h>#define maxn 100typedef struct  //三元组表表示法;{    int row,col;    int e;} Triple;typedef struct{    Triple data[maxn+1];    int m,n,len;} TSMatrix;void TransMatrix(int (*a)[10],int (*b)[10],int m,int n)  //最基本的转置;{    for(int i=0; i<m; i++)    {        for(int j=0; j<n; j++)        {            b[j][i]=a[i][j];        }    }}void TransposeTSMatrix(TSMatrix A,TSMatrix *B)  //列徐递增转置算法;{    int i,j,k;    B->m=A.n;    B->n=A.m;    B->len=A.len;    if(B->len>0)    {        j=1;        for(k=1; k<=A.n; k++)        {            for(i=1; i<=A.len; i++)            {                if(A.data[i].col==k)                {                    B->data[j].row=A.data[i].col;                    B->data[j].col=A.data[i].row;                    B->data[j].e=A.data[i].e;                    j++;                }            }        }    }}void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B)  //一次定位快速转置算法;{    int col,t,p,q;    int num[maxn],position[maxn];    B->len=A.len;    B->n=A.m;    B->m=A.n;    if(B->len)    {        for(col=1; col<=A.n; col++)        {            num[col]=0;        }        for(t=1; t<=A.len; t++)        {            num[A.data[t].col]++;        }        position[1]=1;        for(col=2; col<=A.n; col++)        {            position[col]=position[col-1]+num[col-1];        }        for(p=1; p<=A.len; p++)        {            col=A.data[p].col;            q=position[col];            B->data[q].row=A.data[p].col;            B->data[q].col=A.data[p].row;            B->data[q].e=A.data[p].e;            position[col]++;        }    }}typedef struct OLNode  //十字链表;{    int row,col;    int value;    struct OLNode *right,*down;} OLNode,*OLink;typedef struct{    OLink *row_head,*col_head;    int m,n,len;} CrossList;void CreateCrossList(CrossList *M)  //建立十字链表法的稀疏矩阵;{    int m,n,t;    OLNode *p,*q;    scanf("%d%d%d",&m,&n,&t);    M->m=m;    M->n=n;    M->len=t;    if(!(M->row_head=(OLink*)malloc((m+1)*sizeof(OLink)))) return;    if(!(M->col_head=(OLink*)malloc((m+1)*sizeof(OLink)))) return;    M->row_head=M->col_head=NULL;    int i,j,e;    for(scanf("%d%d%d",&i,&j,&e); i!=0; scanf("%d%d%d",&i,&j,&e))    {        if(!(p=(OLNode*)malloc(sizeof(OLNode)))) return;        p->row=i;        p->col=j;        p->value=e;        if(M->row_head[i]==NULL) M->row_head[i]=p;        else        {            q=M->row_head[i];            while(q->right!=NULL&&q->right->col<j) q=q->right;            p->right=q->right;            q->right=p;        }        if(M->col_head[j]==NULL) M->col_head[j]=p;        else        {            q=M->col_head[j];            while(q->down!=NULL&&q->down->row<i) q=q->down;            p->down=q->down;            q->down=p;        }    }}int main(){    int a[10][10],b[10][10];    int x=0;    for(int i=0; i<5; i++)    {        for(int j=0; j<5; j++)        {            a[i][j]=x;            x++;        }    }    TransMatrix(a,b,5,5);    for(int i=0; i<5; i++)    {        for(int j=0; j<5; j++)        {            printf("%d ",b[i][j]);        }        printf("\n");    }    TSMatrix A,B,C;    A.m=5;    A.n=5;    x=0;    for(int i=1; i<=5; i++)    {        for(int j=1; j<=5; j++)        {            x++;            A.data[x].row=i;            A.data[x].col=j;            A.data[x].e=x;        }    }    A.len=x;    TransposeTSMatrix(A,&B);    printf("%d  %d  %d\n",(A.data[2].row),(A.data[2].col),(A.data[2].e));    printf("%d  %d  %d\n\n",(B.data[2].row),(B.data[2].col),(B.data[2].e));    FastTransposeTSMatrix(A,&C);    printf("%d  %d  %d\n",(A.data[2].row),(A.data[2].col),(A.data[2].e));    printf("%d  %d  %d\n\n",(C.data[2].row),(C.data[2].col),(C.data[2].e));    CrossList L;    CreateCrossList(&L);    return 0;}


原创粉丝点击