⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smatrix_ol.h

📁 利用三元组顺序表表示稀疏矩阵
💻 H
字号:
typedef enum{ERROR,OK} Status;
typedef struct OLNode{
	int i,j;
	float e;
	struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct{
	OLink *rhead,*chead;
	int mu,nu,tu;
}CrossList;

Status CreatSMatrix_OL(CrossList &M)
{
	int m,n,t,i,j;
	float e;
	OLink p,q;
	printf("Input Row,Col and element number(3 3 4):");
	fflush(stdin);
	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)))) return ERROR;
	if(!(M.chead=(OLink*)malloc((n+1)*sizeof(OLink)))) return ERROR;
    for(i=1;i<=M.mu;i++)
		M.rhead[i]=NULL;
	for(j=1;j<=M.nu;j++)
		M.chead[j]=NULL;
	printf("input elemetn(i j e),end of(0 0 0)\n");
	fflush(stdin);
	scanf("%d %d %f",&i,&j,&e);
	if(i>M.mu||j>M.nu) {printf("index overflow!\n");return ERROR;}
	while(i!=0)
	{
		if(!(p=(OLNode *)malloc(sizeof(OLNode)))) return ERROR;
		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;
		}
		fflush(stdin);
		scanf("%d %d %f",&i,&j,&e);
		if(i>M.mu||j>M.nu) {printf("index overflow!\n");return ERROR;}
	}//while i
	return OK;
}

Status InsertNode_OL(CrossList &M,OLink t)
{
	OLink p1,p2,pre1,pre2;
	int i,j;
	i=t->i;j=t->j;
	if(M.rhead[i]==NULL||M.rhead[i]->j>j)
		{
			t->right=M.rhead[i];
			M.rhead[i]=t;
		}
	else
		{
			for(pre1=p1=M.rhead[i];(p1->right)&&p1->right->j<=j;)
			{
				pre1=p1;
				p1=p1->right;
			}
			if(p1->j==j&&p1->i==i)
			{
				t->right=p1->right;
				pre1->right=t;	
			}
			else
			{
				t->right=p1->right;
				p1->right=t;
			}
		}
	if(M.chead[j]==NULL||M.chead[j]->i>i)
		{
			t->down=M.chead[j];
			M.chead[j]=t;
		}
	else
		{
			for(pre2=p2=M.chead[j];(p2->down)&&p2->down->i<=i;)
			{
				pre2=p2;
				p2=p2->down;
			}
			if(p2->j==j&&p2->i==i)
			{
				t->down=p2->down;
				pre2->down=t;
			}
			else
			{
				t->down=p2->down;
				p2->down=t;
			}
		}
		
	M.tu++;
	return OK;
}
Status PrintSMatrix_OL(CrossList M)
{
	OLink p;
	int i,j;
	for(i=1;i<=M.mu;i++)
	{
		p=M.rhead[i];
		for(j=1;j<=M.nu;j++)
		{
			if(p!=NULL&&p->j==j)
			{
				printf("%-.2f  ",p->e);
				p=p->right;
			}
			else
				printf("0.00  ");	
		}//for j
		printf("\n");
	}//for i
	return OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -