(数据结构)C语言稀疏矩阵存储之十字链表 —— 2022/3/27

十字链表

  • —— 头文件
  • 利用结构体声明元素节点
  • 利用结构体声明矩阵节点
  • 构造初始化十字链表矩阵的函数
  • 构造展示十字链表的函数
  • —— 主函数

—— 头文件

#include 
#include 

利用结构体声明元素节点

// 元素节点 
typedef struct OLNode{
    int i, j, e;  // 矩阵三元组 i代表行,j代表列,e代表当前位置的数据
    struct OLNode *right, *down;  // 指针域 右指针 下指针
} OLNode, *OLink;

利用结构体声明矩阵节点

// 矩阵节点 
typedef struct{
    OLink *rhead, *chead;  // 行和列链表头指针
    int mu, nu, tu;  // 矩阵的行数,列数和非零元的个数
} CrossList;

构造初始化十字链表矩阵的函数

// 初始化十字链表矩阵 
CrossList CreateMatrix_OL(CrossList M){
    int i, j, e;  // i代表行,j代表列,e代表元素值 
    OLNode *p, *q;
    
    int m, n, t;
    printf("输入矩阵的行数、列数和非0元素个数:");
    scanf("%d%d%d", &m, &n, &t);  // 默认以空格分开 
    M.mu = m, M.nu = n, M.tu = t;
    M.rhead = (OLink*)malloc((m+1)*sizeof(OLink));  // 行链表头指针 
    M.chead = (OLink*)malloc((n+1)*sizeof(OLink));  // 列链表头指针
    if (!(M.rhead) || !(M.chead)){
        printf("初始化矩阵失败");
        exit(0);
    }
    for (i = 1; i <= m; i++){
        M.rhead[i] = NULL;  // 将m行链表的头指针均指向 NULL 
    }
    for (j = 1; j <= n; j++){
        M.chead[j] = NULL;  // 将n列链表的头指针均指向 NULL 
    }
    for (scanf("%d%d%d", &i, &j, &e); 0 != i; scanf("%d%d%d", &i, &j, &e)){  
        p = (OLNode*)malloc(sizeof(OLNode)); 
		if(!p){
            printf("初始化三元组失败");
            exit(0);
        }
        p->i = i, p->j = j, p->e = e;
        // 链接到行的指定位置
        if (NULL == M.rhead[i] || 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 (NULL == M.chead[j] || M.chead[j]->i > i){  // 2 2 3/3 2 5 
            p->down = M.chead[j];
            M.chead[j] = p;
        }else{  // M.chead[j]->i < i 
            for(q = M.chead[j]; (q->down)&&(q->down->i) < i; q = q->down);
            p->down = q->down;
            q->down = p;
        }
    }
    return M;
}

构造展示十字链表的函数

// 展示此矩阵 
void display(CrossList M){
    for(int i = 1; i <= M.nu; i++){  // 列数遍历输出元素,列靠前优先输出 
        if (NULL != M.chead[i]){
            OLink p = M.chead[i];
            while (NULL != p){
                printf("%d\t%d\t%d\n", p->i, p->j, p->e);
                p = p->down;
            }
        }
    }
}

—— 主函数

// 主函数 
int main(){
    CrossList M;
    M.rhead = NULL;
    M.chead = NULL;
    M = CreateMatrix_OL(M);
    printf("输出矩阵M:\n");
    display(M);
    return 0;
}

你可能感兴趣的:(数据结构与C,数据结构,链表,顺序表,十字链表)