【创建】
CrossList* Create(int A[][maxSize], int m, int n)
{
CrossList* cl = (CrossList*)malloc(sizeof(CrossList));
cl->m = m;
cl->n = n;
cl->k = 0;
int i, j, k;
OLNode* r, *p;
//申请头结点数组
if (!(cl->rhead = (OLNode*)malloc(sizeof(OLNode)*m)))
return NULL;
if (!(cl->chead = (OLNode*)malloc(sizeof(OLNode)*n)))
return NULL;
//初始化行结点数组
for (i = 0; i < m; ++i)
{
cl->rhead[i].right = NULL;
cl->rhead[i].down = NULL;
}
//初始化列结点数组
for (j = 0; j < n; ++j)
{
cl->chead[j].right = NULL;
cl->chead[j].down = NULL;
}
//设置指向每个列结点的尾指针
OLNode* temp_c[maxSize];
for (j = 0; j < n; ++j)
{
temp_c[j] = &cl->chead[j];
}
//存储非零元素
k = 0;
for (i = 0; i < m; ++i)
{
//设置指向行结点的指针
r = &cl->rhead[i];
for (j = 0; j < n; ++j)
{
if (A[i][j] != 0)
{
p = (OLNode*)malloc(sizeof(OLNode));
p->val = A[i][j];
p->row = i;
p->col = j;
p->down = p->right = NULL;
//插入行链表中
r->right = p;
r = p;
//插入列链表中
temp_c[j]->down = p;
temp_c[j] = p;
k++;
}
}
}
cl->k = k;
return cl;
}
【查找】
int Find(CrossList* cl, int i, int j)
{
OLNode*p, *q;
p = cl->rhead[i].right;
while (p != NULL )
{
if (p->col == j)
return p->val;
p = p->right;
}
return 0;
}
查找操作错误代码:
int Find(CrossList* cl, int i, int j)
{
OLNode*p, *q;
p = cl->rhead[i].right;
q = cl->chead[j].down;
while (p != NULL && q != NULL)
{
if (p == q)
return p->val;
p = p->right;
q = q->down;
}
return 0;
}
【打印】
void PrintList(CrossList*cl)
{
int i, j;
for (i = 0; i < cl->m; ++i)
{
for (j = 0; j < cl->n; ++j)
printf("%d ", Find(cl, i, j));
printf("\n");
}
}
【数据测试】
#include <stdio.h>
#include <stdlib.h>
#define maxSize 100
typedef struct OLNode
{
int row, col, val;
struct OLNode *right, *down;
}OLNode;
typedef struct
{
OLNode* rhead, *chead;
int m, n, k;//行数、列数和非零元素个数
}CrossList;
CrossList* Create(int A[][maxSize], int m, int n)
{
CrossList* cl = (CrossList*)malloc(sizeof(CrossList));
cl->m = m;
cl->n = n;
cl->k = 0;
int i, j, k;
OLNode* r, *p;
//申请头结点数组
if (!(cl->rhead = (OLNode*)malloc(sizeof(OLNode)*m)))
return NULL;
if (!(cl->chead = (OLNode*)malloc(sizeof(OLNode)*n)))
return NULL;
//初始化行结点数组
for (i = 0; i < m; ++i)
{
cl->rhead[i].right = NULL;
cl->rhead[i].down = NULL;
}
//初始化列结点数组
for (j = 0; j < n; ++j)
{
cl->chead[j].right = NULL;
cl->chead[j].down = NULL;
}
//设置指向每个列结点的尾指针
OLNode* temp_c[maxSize];
for (j = 0; j < n; ++j)
{
temp_c[j] = &cl->chead[j];
}
//存储非零元素
k = 0;
for (i = 0; i < m; ++i)
{
//设置指向行结点的指针
r = &cl->rhead[i];
for (j = 0; j < n; ++j)
{
if (A[i][j] != 0)
{
p = (OLNode*)malloc(sizeof(OLNode));
p->val = A[i][j];
p->row = i;
p->col = j;
p->down = p->right = NULL;
//插入行链表中
r->right = p;
r = p;
//插入列链表中
temp_c[j]->down = p;
temp_c[j] = p;
k++;
}
}
}
cl->k = k;
return cl;
}
int Find(CrossList* cl, int i, int j)
{
OLNode*p, *q;
p = cl->rhead[i].right;
while (p != NULL)
{
if (p->col == j)
return p->val;
p = p->right;
}
return 0;
}
void PrintList(CrossList*cl)
{
int i, j;
for (i = 0; i < cl->m; ++i)
{
for (j = 0; j < cl->n; ++j)
printf("%d ", Find(cl, i, j));
printf("\n");
}
}
int main()
{
int A[maxSize][maxSize];
int m, n;
m = 3, n = 4;
int i, j;
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
A[i][j] = 0;
A[1][0] = 1;
A[1][3] = 3;
A[2][3] = 6;
A[0][1] = 9;
CrossList* M = Create(A, m, n);
PrintList(M);
return 0;
}
【结果】