数据结构--数组--稀疏矩阵的建立

 稀疏矩阵的建立

#include "stdio.h"
#define MAX_SIZE  50   /* 最大的稀疏矩阵 */

typedef enum  {head, entry} tagfield; //行链表的头指针和列链表的头指针

struct entry_node  { //非零元节点
      int  row;  //非零元所在行的下标
      int  col;  //非零元所在列的下标
      int  value;  //非零元的数值
};

typedef struct Matrix  {   //矩阵
      struct Matrix	*  down;   //非零元所在列表的后继区域
      struct Matrix  *	right; //非零元所在行表的后继区域
      tagfield  tag;  //行列头指针
      union   {
      	   struct Matrix  *  next;
		   struct entry_node  entry;
      } u;
}matrix_node;

typedef matrix_node * matrix_pointer;
matrix_pointer  hdnode [ MAX_SIZE ];

matrix_pointer new_node(void) //定义新node,并分配存储空间
{      
	matrix_pointer temp;
	temp = (matrix_pointer)malloc(sizeof(matrix_node));
	if (temp==NULL) 
	{
	  printf("The memory is full\n");
	  exit(1);
	}
	return temp;
}             

matrix_pointer Create(void)
{   
    int num_rows, num_cols, num_terms, num_heads, i,current_row;
    int col,value,row;
	matrix_pointer	node,temp,last;
    printf("Enter the number of rows, columns and number of nonzero terms: ");
    scanf("%d%d%d",&num_rows,&num_cols,&num_terms);
    num_heads = (num_cols > num_rows) ? num_cols :num_rows;
		/* 建立新结点 */
    node = new_node(); 
	node->tag = entry;
    node->u.entry.row = num_rows;
    node->u.entry.col = num_cols;
	if ( !num_heads )
		node->right = node;
    else {	
        for ( i = 0; i<num_heads; i++ ) {
            temp = new_node();
            hdnode[i] = temp;
			hdnode[i]->tag = head;				
            hdnode[i]->right = temp; 
            hdnode[i]->u.next = temp;
		}
   		current_row = 0;	
		last = hdnode[0];	
		for ( i = 0; i < num_terms; i++ ) {
            printf("Enter row, column and value: ");
            scanf("%d%d%d",&row,&col,&value);
            if ( row > current_row ) {
                /* 转到row所在行去*/
                last->right = hdnode[current_row];
                current_row = row; 
				last = hdnode[row];
			}
            temp = new_node();
            temp->tag = entry; 
			temp->u.entry.row = row;
            temp->u.entry.col = col;
            temp->u.entry.value = value;
			  last->right = temp;	
            last = temp;
			/*链接到列结点上 */
            hdnode[col]->u.next->down = temp;  
            hdnode[col]->u.next = temp;  
        }
			/* 结束上一行结点 */
        last->right = hdnode[current_row]; 
			/*结束所有行结点*/
        for ( i=0; i<num_cols; i++ )
			hdnode[i]->u.next->down= hdnode[i];  
			/*链接所有的头结点 */
        for ( i=0; i<num_heads-1; i++ )
             hdnode[i]->u.next = hdnode[i+1];
        hdnode[num_heads-1]->u.next = node;
        node->right = hdnode[0];
    }
    return node;
}											     

void main()
{
	matrix_pointer matric = Create();
}

稀疏矩阵的删除

#include "stdio.h"
#define MAX_SIZE  50   /* 最大的稀疏矩阵 */
typedef enum  {head, entry} tagfield;
struct entry_node  {
      int  row;
      int  col;
      int  value;
};
typedef struct Matrix  {
struct Matrix	*  down;
      struct Matrix  *	right;
      tagfield  tag;
      union   {
      	 struct Matrix  *  next;
		 struct entry_node  entry;
      } u;
}matrix_node;
typedef matrix_node * matrix_pointer;
matrix_pointer  hdnode [ MAX_SIZE ];
matrix_pointer new_node(void)
{      
		matrix_pointer temp;
		temp = (matrix_pointer)malloc(sizeof(matrix_node));
		if (temp==NULL) {
			printf("The memory is full\n");
			exit(1);
		}
		return temp;
}             
matrix_pointer Create(void)
{   
    int num_rows, num_cols, num_terms, num_heads, i,current_row;
    int col,  value,row;
	matrix_pointer	node,temp,last;
    printf("Enter the number of rows, columns and number of nonzero terms: ");
    scanf("%d%d%d",&num_rows,&num_cols,&num_terms);
    num_heads = (num_cols > num_rows) ? num_cols :num_rows;
		/* 建立新结点 */
    node = new_node(); 
	node->tag = entry;
    node->u.entry.row = num_rows;
    node->u.entry.col = num_cols;
	if ( !num_heads )
		node->right = node;
    else {	/*初始化头结点如图5-5-4*/
        for ( i = 0; i<num_heads; i++ ) {
            temp = new_node();
            hdnode[i] = temp;
			hdnode[i]->tag = head;				
            hdnode[i]->right = temp; 
            hdnode[i]->u.next = temp;
		}
   		current_row = 0;	
		last = hdnode[0];	
		for ( i = 0; i < num_terms; i++ ) {
            printf("Enter row, column and value: ");
            scanf("%d%d%d",&row,&col,&value);
            if ( row > current_row ) {
                /* 转到row所在行去*/
                last->right = hdnode[current_row];
                current_row = row; 
				last = hdnode[row];
			}
            temp = new_node();
            temp->tag = entry; 
			temp->u.entry.row = row;
            temp->u.entry.col = col;
            temp->u.entry.value = value;
			/* 链接到行结点上如图5-5-5所示 */
            last->right = temp;	
            last = temp;
			/*链接到列结点上 */
            hdnode[col]->u.next->down = temp;  
            hdnode[col]->u.next = temp;  
        }
			/* 结束上一行结点 */
        last->right = hdnode[current_row]; 
			/*结束所有行结点*/
        for ( i=0; i<num_cols; i++ )
			hdnode[i]->u.next->down= hdnode[i];  
			/*链接所有的头结点 */
        for ( i=0; i<num_heads-1; i++ )
             hdnode[i]->u.next = hdnode[i+1];
        hdnode[num_heads-1]->u.next = node;
        node->right = hdnode[0];
    }
    return node;
}											     
void erase(matrix_pointer *node)
{
		matrix_pointer x,y,head = (*node)->right;
		int i;
		/* 遍历每行,删除元素结点和头结点 */
		for ( i = 0; i< (*node)->u.entry.row; i++ ) {
			y = head->right;
			while ( y != head ) {
				x = y; y = y->right; 
				free(x);
			}
			x = head; head = head->u.next; free(x);
		}
		/* 删除剩余的头结点*/
		y = head;
		while ( y != *node ) {
			x = y; 
			y = y->u.next; 
			free(x);
		}
		free(*node); 
		*node = NULL;
}
void main()
{
	matrix_pointer matric=Create();
	erase(&matric);
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值