学习笔记------数据结构(C语言版)数组之十字链表

//CrossList.cpp


#include"predefined.h"
#include"CrossList.h"

Status InitSMatrix(CrossList *M) /* 加 */
 { /* 初始化M(CrossList类型的变量必须初始化,否则创建、复制矩阵将出错) */
   (*M).rhead=(*M).chead=NULL;
   (*M).mu=(*M).nu=(*M).tu=0;
   return OK;
 }

Status CreateSMatrix_OL(CrossList *M)
//算法5.4:创建稀疏矩阵,采用十字链表存储表示
{
	int m,n,t,i,j,k;
	ElemType e;
	OLink p,q;
	printf("请输入行,列,非零元个数:");
	scanf("%d,%d,%d",&m,&n,&t);
	(*M).mu=m;
	(*M).nu=n;
	(*M).tu=t;
	if(!((*M).rhead=(OLink *)malloc((m+1)*sizeof(OLink))))
		exit(OVERFLOW);
	if(!((*M).chead=(OLink*)malloc((n+1)*sizeof(OLink))))
		exit(OVERFLOW);
	for(i=0;i<=m;i++)
		(*M).rhead[i]=NULL;
	for(j=0;j<=n;j++)
		(*M).chead[j]=NULL;
	printf("请按任意次序输入%d个非零元的行,列,元素值:\n",(*M).tu);
	for(k=0;k<t;k++)
	{
		scanf("%d,%d,%d",&i,&j,&e);
		if(!(p=(OLNode *)malloc(sizeof(OLNode))))
			exit(OVERFLOW);
		(*p).i=i;
		(*p).j=j;
		(*p).e=e;
		if((*M).rhead[i]==NULL||(*(*M).rhead[i]).j>j)
		{
			(*p).right=(*M).rhead[i];
			(*M).rhead[i]=p;
		}
		else
		{
			for(q=(*M).rhead[i];(*q).right&&(*(*q).right).j<j;q=(*q).right);
			(*p).right=(*q).right;
			(*q).right=p;
		}
		if((*M).chead[j]==NULL||(*(*M).chead[j]).i>i)
		{
			(*p).down=(*M).chead[j];
			(*M).chead[j]=p;
		}
		else
		{
			for(q=(*M).chead[j];(*q).down&&(*(*q).down).i<i;q=(*q).down);
			(*p).down=(*q).down;
			(*q).down=p;
		}
	}
	return OK;
}

Status PrintSMatrix(CrossList M)
 { /* 初始条件: 稀疏矩阵M存在。操作结果: 按行或按列输出稀疏矩阵M */
   int i,j;
   OLink p;
   printf("%d行%d列%d个非零元素\n",M.mu,M.nu,M.tu);
   printf("请输入选择(1.按行输出 2.按列输出): ");
   scanf("%d",&i);
   switch(i)
   {
     case 1: for(j=1;j<=M.mu;j++)
             {
               p=M.rhead[j];
               while(p)
               {
                 printf("%d行%d列值为%d\n",p->i,p->j,p->e);
                 p=p->right;
               }
             }
             break;
     case 2: for(j=1;j<=M.nu;j++)
             {
               p=M.chead[j];
               while(p)
               {
                 printf("%d行%d列值为%d\n",p->i,p->j,p->e);
                 p=p->down;
               }
             }
   }
   return OK;
 }


//CrossList.h

typedef int ElemType;
typedef struct OLNode
{
	int i,j;
	ElemType e;
	struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct
{
	OLink *rhead,*chead;
	int mu,nu,tu;
}CrossList;

Status InitSMatrix(CrossList *M);

Status CreateSMatrix_OL(CrossList *M);

Status PrintSMatrix(CrossList M);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值