데이터 구조 (4) - 희소 행렬
35962 단어 데이터 구조 기초
3 원 그룹 을 이용 하여 희소 행렬 의 압축 저장 을 실현 하고 이 를 바탕 으로 전환 과 추가 작업 을 하 며 코드 를 첨부 합 니 다.
#include
#include
#define N 30 //
#pragma warning(disable:4996)
typedef struct mytripple//
{
int i,j;
int data;
}TR;
typedef struct mymatrix//
{
TR T[N];//
int mu,nu,tu;// , ,
}MA;
void init(MA *A,MA *B);// A,B
void showMatrix(MA *A);// A
MA reverse(MA *A);// A, , O(tu+nu)
MA addition(MA *A,MA *B);// A,B , , , O(A->tu+B->tu)
main()
{
MA A,B,C;
init(&A,&B);
showMatrix(&A);
showMatrix(&B);
C=reverse(&B);
showMatrix(&C);
C=addition(&A,&B);
showMatrix(&C);
}
void init(MA *A,MA *B)
{
A->mu=3;
A->nu=4;
A->tu=4;
A->T[1].data=3;
A->T[1].i=1;
A->T[1].j=2;
A->T[2].data=-1;
A->T[2].i=2;
A->T[2].j=2;
A->T[3].data=12;
A->T[3].i=2;
A->T[3].j=4;
A->T[4].data=9;
A->T[4].i=3;
A->T[4].j=1;
///////////////////////////////////////////////////////////////////
B->mu=3;
B->nu=4;
B->tu=5;
B->T[1].data=4;
B->T[1].i=1;
B->T[1].j=4;
B->T[2].data=1;
B->T[2].i=2;
B->T[2].j=2;
B->T[3].data=5;
B->T[3].i=2;
B->T[3].j=3;
B->T[4].data=2;
B->T[4].i=3;
B->T[4].j=1;
B->T[5].data=-6;
B->T[5].i=3;
B->T[5].j=2;
}
void showMatrix(MA *A)
{
int i,j,k;//i ,j ,k
k=1;
for(i=1;i<=A->mu;i++)
{
for(j=1;j<=A->nu;j++)
{
if(i==A->T[k].i&&j==A->T[k].j)
{
printf("%4d",A->T[k].data);
k++;
}
else
printf("%4d",0);
}
printf("
");
}
printf("
");
}
MA reverse(MA *A)// A,
{
int i;
int pos;
TR temp;
int *cpos,*cnum;//
MA B;
cnum=(int *)malloc((A->nu+1)*sizeof(int));
cpos=(int *)malloc((A->nu+1)*sizeof(int));
// cnum
for (i = 1; i <= A->nu; i++)
cnum[i]=0;
for (i = 1; i <= A->tu; i++)
cnum[A->T[i].j]++;
// cpos
cpos[1]=1;
for(i=2;i<=A->nu;i++)
cpos[i]=cpos[i-1]+cnum[i-1];
free(cnum);
// ,
B.mu=A->nu;
B.nu=A->mu;
B.tu=A->tu;
// cpos
for (i = 1; i <= A->tu; i++)
{
temp=A->T[i];
pos=cpos[temp.j];
B.T[pos].i=temp.j;
B.T[pos].j=temp.i;
B.T[pos].data=temp.data;
cpos[temp.j]++;
}
free(cpos);
return B;
}
MA addition(MA *A, MA *B)// A,B ,
{
int i,j,k;//
int temp;
int p1,p2;// A,B
int mu,nu;
MA C;
mu=A->mu;
nu=A->nu;
C.mu=mu;
C.nu=nu;
k=0;// C
for (i = 1, j = 1; i <= A->tu && j <= B->tu;)//
{
p1=(A->T[i].i-1)*nu+A->T[i].j;
p2=(B->T[j].i-1)*nu+B->T[j].j;
if (p1 < p2)
{
k++;
C.T[k]=A->T[i];
i++;
}
else if (p2 < p1)
{
k++;
C.T[k]=B->T[j];
j++;
}
else //p1==p2
{
temp=A->T[i].data+B->T[j].data;
if (temp != 0)// 0, C
{
k++;
C.T[k].i=A->T[i].i;
C.T[k].j=A->T[i].j;
C.T[k].data=temp;
}
i++;
j++;
}
}
// , C
while (i <= A->tu)
{
k++;
C.T[k]=A->T[i];
i++;
}
while (j <= B->tu)
{
k++;
C.T[k]=B->T[j];
j++;
}
// C
C.tu=k;
return C;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
양 방향 링크 질서 있 게 삽입오늘 은 본의 아니 게 데이터 구 조 를 펼 쳤 는데 갑자기 양 방향 링크 를 쓸 어 버 리 고 코드 코드 코드 를 다시 연습 하려 고 했다.3, 2 분 만 에 다 써 서 운행 할 때 어색 하 다.출력 이 없 음 을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.