稀疏矩阵-用十字链表实现

#include <stdio.h>
#include <stdlib.h>

typedef int Datatype;
/*十字链表表示法*/


typedef struct OLNode
{
    int i,j;
    Datatype e;
    struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct
{
    OLink *rowhead,*colhead;
    int m,n,len;
}CrossList;

void InitMatrix(CrossList *M)
{
    /*初始化矩阵*/
    M->rowhead=M->colhead=NULL;
    M->m=M->n=M->len=0;
}

 /*按行释放节点空间*/
 void DestroyMatrix(CrossList *M)
 {
     int i;
     OLink p,q;
     for(i=0;i<M->m;i++)
     {
         p=*(M->rowhead+i);     //p指向指针数组
         while(p)
         {
             q=p;               //q指向p指向的目标,即p,q在一起
             p=p->right;        //p移动向下一个
             free(q);
         }
     }
     free(M->rowhead);
     free(M->colhead);
     InitMatrix(M);
 }

void CreateMatrix(CrossList *M)
{
    int i,k;
    int m,n,num;
    OLNode *p,*q;
    if(M->rowhead)  /*神来之笔,链表不空则释放空间*/
        DestroyMatrix(M);
    printf("输入稀疏矩阵的行数,列数,非零元素个数:");
    scanf("%d%d%d",&m,&n,&num);
    M->m=m;
    M->n=n;
    M->len=num;
    M->rowhead=(OLink*)malloc(m*sizeof(OLink));
    if(!M->rowhead)                     //如果分配失败
        exit(-1);
    M->colhead=(OLink*)malloc(n*sizeof(OLink));
    if(!M->colhead)
        exit(-1);
    /*初始化十字链表*/
    for(k = 0;k<m;k++)
        M->rowhead[k]=NULL;
    for(k=0;k<n;k++)
        M->colhead[k]=NULL;

    printf("请按任意次序输入%d个非零元的行号,列号以及元素值:\n",M->len);
    for(k = 0;k<num;k++)
    {
        p = (OLink*)malloc(sizeof(OLNode));
        if(!p)
            exit(-1);
        scanf("%d%d%d",&p->i,&p->j,&p->e);
        /*将节点*p插入到行表中*/
        q=M->rowhead[p->i];
        if(!q||p->j<q->j)
        {
            p->right=M->rowhead[p->i];
            M->rowhead[p->i] = p;
        }
        else
        {
            while(q->right&&q->right->j<p->j)
                q=q->right;                     //q指向下一个节点
            p->right = q->right;                //将*p插入到*q之后
            q->right = p;
        }

        /*将节点*p插入到列表中*/
        q = M->colhead[p->j];
        if(!q||p->i < q->i)
        {
            p->down=M->colhead[p->j];
            M->colhead[p->j]=p;
        }
        else
        {
            while(q->down&&q->down->i<p->i)/*如果q的行号小于p的行号,则在链表中查找插入位置*/
                q=q->down;
            p->down=q->down;/*将p插入到q结点之下*/
            q->down=p;
        }
    }

}


void InsertMatrix(CrossList *M,OLink p)
/*按照行序将p插入到稀疏矩阵中*/
{

    OLink q=M->rowhead[p->i];/*q指向待插行表*/
    if(!q||p->j<q->j)/*待插的行表空或p所指结点的列值小于首结点的列值,则直接插入*/
        {

            p->right=M->rowhead[p->i];
            M->rowhead[p->i]=p;

        }
    else
        {

            while(q->right&&q->right->j<p->j)/*q所指不是尾结点且q的下一结点的列值小于p所指结点的列值*/
            q=q->right;
            p->right=q->right;
            q->right=p;

        }
    q=M->colhead[p->j];/*q指向待插列表*/
    if(!q||p->i<q->i)/*待插的列表空或p所指结点的行值小于首结点的行值*/
        {

            p->down=M->colhead[p->j];
            M->colhead[p->j]=p;

        }
    else
        {

            while(q->down&&q->down->i<p->i)/*q所指不是尾结点且q的下一结点的行值小于p所指结点的行值*/
            q=q->down;
            p->down=q->down;
            q->down=p;

        }
        M->len++;
}

void PrintMatrix(CrossList M)
/*按矩阵形式输出十字链表*/
{

int i,j;
OLink p;
for(i=0;i<M.m;i++)
{

p=M.rowhead[i];/*p指向该行的第1个非零元素*/
for(j=0;j<M.n;j++)/*从第一列到最后一列进行输出*/
if(!p||p->j!=j)/*已到该行表尾或当前结点的列值不等于当前列值,则输出0*/
printf("%-3d",0);
else
{

printf("%-3d",p->e);
p=p->right;

}
printf("\n");

}

}


int main()
{
    CrossList M;
    InitMatrix(&M);
    CreateMatrix(&M);
    DestroyMatrix(&M);
    return 0;
}

以上代码参考自《数据结构》陈锐

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值