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



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

  • 相关阅读:
    关于表格单元格溢出情况的处理(单行文本溢出或多行文本溢出)
    下拉树的公共插件(手写插件的方法)
    ztree树样式的设计
    Android学习笔记之Intent(2)
    Android学习笔记之Intent(1)
    Ajax
    Android学习笔记之ContentProvider
    Android学习笔记之Broadcast Receiver
    Android学习笔记之Service
    Android学习笔记之Intent
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768518.html
Copyright © 2011-2022 走看看