稀疏矩阵——数据结构

本文介绍了稀疏矩阵的两种常见表示方法——三元组表和十字链表,详细阐述了它们的结构特点,并探讨了如何对稀疏矩阵进行转置操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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


#include<stdio.h>
#include<stdlib.h>
#define maxn 100

typedef 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值