zoukankan      html  css  js  c++  java
  • 稀疏矩阵十字链表表示

    类型定义

    #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
    col:%d
    ",p->row,p->col);
        printf("right---%p
    down---%p
    ",p->right,p->down);
    }
    void Createspmatrix (headspmatrix h)
    {
        int m,n,t,s,i,r,c,v;
        spmatrix p,q;
        printf("矩阵的行数.列数.和非零元素的个数:
    ");
        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("请输入非零元素的行号,列号,值:
    ");
            scanf("%d%d%d",&r,&c,&v);
            p=(spmatrix)malloc(sizeof(matrixnode));
            //printf("46
    ");
            p->row=r;p->col=c;p->tag.val=v;//printf("47
    ");
            q=h[r];//取得该行表头节点指针
            //printf("49
    ");
    
            while(q->right!=h[r]&&q->right->col<c)//连接到相应行
                {
                    q=q->right;
                    //printf("52
    ");
                }
           // printf("51
    ");
            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("
    ");
            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
    ",++s);
                q=t;
            }
            p=p->tag.next;
        }
    }



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

  • 相关阅读:
    在Fragment中保存WebView状态
    Code First下迁移数据库更改
    脚本解决.NET MVC按钮重复提交问题
    1.1C++入门 未完待续。。。
    0.0C语言重点问题回顾
    12F:数字变换
    12G:忍者道具
    12D:迷阵
    12C:未名冰场
    12B:要变多少次
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768518.html
Copyright © 2011-2022 走看看