十字链表c语言实验报告,十字链表的建立(C语言实现)

#include //创建非零元素结点

typedef struct OLNode

{

int row,col;

Elemtype value;

struct OLNode *right,*down;

}OLNode,*OLink;

//指向非零行列的数组指针

typedef struct

{

OLink *rowhead,*colhead;

int rows,cols,nums;

}*CrossList;

int InitCrossList(CrossList *CL,Elemtype *A,int m,int n)

{

int i,j;

OLNode p,q;

(*CL) = (CrossList)molloc(sizeof(CrossList));

if(!(*CL)->rowhead)

{

printf("无法生成十字链表!");

return 0;

}

//初始化行

(*CL)->rows = m;

//初始化列

(*CL)->cols = n;

//记录非零个数

(*CL)->nums = 0;

(*CL)->rowhead = (OLink *)malloc(m * sizeof(OLink));

if(!(*CL) -> rowhead)

{

printf("无法生成行指针数组!");

return 0;

}

for(i = 0; i < m; i++)

(*CL)->rowhead[i] = NULL;//初始化

(*CL)->colhead = (OLink *)malloc(n * sizeof(OLink));

if(!(*CL)->colhead)

{

printf("无法生成列指针数组!");

return 0;

}

for(i = 0; i < m; i++)

for(j = 0; j < n;j++)

{

if(A[i*n+j]!=0)//判断是否非零

{

p = (OLink *)malloc(sizeof(OLNode));

//填入所在行数

p -> row = i++;

//填入所在列数

p -> col = j++;

//填入数字

p -> value = A[i*n+j];

p -> right = NULL;

p -> down = NULL;

(*CL) -> nums++;

//判断是否是这一行的第一个非零元素

if((*CL) -> rowhead[i]!=NULL)

{

//从本行头遍历

q=(*CL) -> rowhead[i];

while(q->right!=NULL&&q->col < j+1)

q=q->right;

//遍历到本行最后一个非零元素

p->right = q->right;//尾插法

q->right = p;

}

//如果是本行第一个非零元素则行头直接是新创造的结点

else(*CL)->rowhead[i] = p;

//与行操作类似

if((*CL) -> colhead[j]!=NULL)

{

q=(*CL)->colhead[j];

while (q->down!=NULL && q->row < i+1)

q = q->down;

p->down = q->down;

q->down = p;

}

else(*CL)->colhead[j] = p;

}

}

return 1;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值