链式存储:
typedef struct OLNode
{
int i,j;
ElemType e;
struct OLNode *right,*down;
}OLNode;*OLink;
typedef struct
{
OLink *rhead,*chead;
int mu,,nu,tu;
}CrossList;
M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))
M.chead=(OLink *)malloc((m+1)*sizeof(OLink)))
这是为了创建头指针,便于指向下面的节点,为什么不用头结点,因为要节省开辟的内存。
M.rhead[i]->i==*(M.rhead+i)->i;
M.rhead可以看成是数组的首地址,M.rhead[i]就是M.rhead数组里面的一个元素 ,M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))就是数组开辟的内存。M.rhead[i]就是一个OLink(OLNode)类型。
所以在上一篇里面:
typedef struct
{
int i, j;
char v;
} str;
typedef struct
{
str *data;
int row, col, count; //矩阵的行数,列数,和非零元素个数
} Array;
void print_array(Array *p)
{
int j;
j = p->count;
for (int i = 0; i < j; i++)
printf("%d %d %c\n", p->data[i].i, (p->data + i)->j, (p->data + i)->v);
}
p->data = (str *)malloc(n * sizeof(str));
p->data[i].i和(p->data+i)->j都可以,p->data[i]类型是 str类型。