稀疏矩阵十字链表表示

类型定义

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX 100
/*
 稀疏矩阵的十字链表表示:
 非零元素节点与表头节点公用一种类型
*/
typedef struct matrixnode
{
    int row,col;
    struct matrixnode *right,*down;
    union
    {
        int val;//非零元素节点的值
        struct matrixnode*next;//指向下一个表头节点
    }tag;
}matrixnode;
typedef matrixnode*spmatrix;
typedef spmatrix headspmatrix[MAX];//保存i行/i列的表头节点指针
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("矩阵的行数.列数.和非零元素的个数:\n");
    scanf("%d%d%d",&m,&n,&t);
    //初始化一个表头节点,储存链表的行数,列数
    p=(spmatrix)malloc(sizeof(matrixnode));
    h[0]=p;

    p->row=m;p->col=n;
    s=m>n?m:n;//表头节点个数取行列数的较大值
    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;//将上一个表头节点与该表头节点连接
        p->row=p->col=0;//表头节点的row和col置空
        p->down=p->right=p;//当前表头节点初始化为空,down和right指向自身。
    }
    h[s]->tag.next=h[0];//最后一个表头节点与头节点连接,形成环
    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];//取得该行表头节点指针
        //printf("49\n");

        while(q->right!=h[r]&&q->right->col<c)//连接到相应行
            {
                q=q->right;
                //printf("52\n");
            }
       // printf("51\n");
        p->right=q->right;
        q->right=p;
        q=h[c];//取得该列表头节点指针
        while(q->down!=h[c]&&q->down->row<r)//连接到相应列
            q=q->down;
        p->down=q->down;
        q->down=p;
    }
}

相关操作

//在十字链表中查找元素,通过指针返回对应坐标,函数返回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;
}
//遍历稀疏矩阵的十字链表并按行优先输出
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;
    }
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/Thereisnospon/p/4768518.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值