十字链表(写的很漂亮呀!)

 

十字链表(写的很漂亮呀!)

分类: ACM_数据结构基础   403人阅读  评论(2)  收藏  举报
[cpp]  view plain copy
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #define ok 1  
  4. #define error 0  
  5.   
  6. typedef struct node{  
  7.     int i, j;  
  8.     int e;  
  9.     struct node *right, *down;  
  10. }node, *linklist;  
  11.   
  12. typedef struct{  
  13.     int mu, nu, tu;  
  14.     linklist *rhead, *chead;  
  15. }crosslist;  
  16.   
  17. int init_crosslist(crosslist &M){  
  18.     M.rhead = M.chead = NULL;  
  19.     M.nu = M.mu = M.tu = 0;  
  20.     return ok;  
  21. }  
  22.   
  23. int creat_crosslist(crosslist &M){  
  24.     linklist bulid, p, judge;//pointer  
  25.     int  m, n, t, i, j, e, k, judge_number;  
  26.     printf("输入稀疏矩阵的行,列以及非零元素个数\n");  
  27.     scanf("%d%d%d",&m, &n, &t);  
  28.     M.mu = m;  
  29.     M.nu = n;  
  30.     M.tu = t;  
  31. //  行,和列进行初始化  
  32.     M.rhead = (linklist *)malloc((m+1)*sizeof(linklist));  
  33.     for(k=1; k <= m; k++){  
  34.         M.rhead[k] = NULL;  
  35.     }  
  36.     M.chead = (linklist *)malloc((n+1)*sizeof(linklist));  
  37.     for(k = 1; k <= n; k++){  
  38.         M.chead[k] = NULL;  
  39.     }  
  40.     printf("输入非零元素行,列,非零元素\n");  
  41.     for(k=0; k<t; k++){  
  42.         scanf("%d%d%d",&i,&j,&e);  
  43. //      判断 是否重复的输入数据,如果重复则程序结束  
  44.         for(judge_number = 1; judge_number <= m; judge_number++){  
  45.             judge = M.rhead[judge_number];  
  46.             while(judge!=NULL){  
  47.                 if(judge->i == i && judge->j ==j ){  
  48.                     printf("此位置已经存在元素,程序将结束\n");  
  49.                     system("pause");  
  50.                     exit(0);  
  51.                 }  
  52.                 judge = judge->right;  
  53.             }  
  54.         }  
  55. //      判断是不是超出范围  
  56.         if(i>M.mu || j>M.nu){  
  57.             printf("位置不合法!  无法完成操作!\n");  
  58.             system("pause");  
  59.             exit(0);  
  60.         }  
  61. //      新建立的结点进行初始化  
  62.         bulid=(linklist)malloc(sizeof(node));  
  63.         bulid->i = i;  
  64.         bulid->j = j;  
  65.         bulid->e = e;  
  66.         bulid->right = NULL;  
  67.         bulid->down = NULL;  
  68. //      完成行插入  
  69.         if(M.rhead[i] == NULL || M.rhead[i]->j > j){  
  70.             bulid->right = M.rhead[i];  
  71.             M.rhead[i] = bulid;  
  72.         }  
  73.         else{  
  74.             p = M.rhead[i];  
  75.             while(p->right != NULL && p->right->j < j){  
  76.                 p = p->right;  
  77.             }  
  78.             bulid->right = p->right;  
  79.             p->right = bulid;  
  80.         }  
  81. //      完成列插入  
  82.         if(M.chead[j] == NULL || M.chead[j]->i > i){  
  83.             bulid->down = M.chead[j];  
  84.             M.chead[j] = bulid;  
  85.         }  
  86.         else{  
  87.             p=M.chead[j];  
  88.             while(p->down != NULL && p->down->i < i){  
  89.                 p=p->down;  
  90.             }  
  91.             bulid->down = p->down;  
  92.             p->down = bulid;  
  93.         }  
  94.     }  
  95.     return ok;  
  96. }  
  97.   
  98. void print_list(crosslist &M){  
  99.     int row_i, col_j;  
  100.     linklist print;  
  101.     printf("稀疏矩阵为\n");  
  102.     for(row_i = 1; row_i <= M.mu; row_i++){  
  103.         print=M.rhead[row_i];  
  104.         for(col_j = 1; col_j <= M.nu; col_j++){  
  105.             if(print != NULL && print->j == col_j){  
  106.                 printf("%d\t", print->e);  
  107.                 print = print->right;  
  108.             }  
  109.             else{  
  110.                 printf("%d\t",NULL);  
  111.             }  
  112.         }  
  113.         printf("\n");  
  114.     }  
  115. }  
  116. int main()  
  117. {  
  118.     crosslist M;  
  119.     char choice;  
  120.     while(choice!='n'&&choice!='N'){  
  121.         init_crosslist(M);  
  122.         creat_crosslist(M);  
  123.         print_list(M);  
  124.         printf("是否要继续操作? Y/N\n");  
  125.         choice = getchar();  
  126.         choice = getchar();  
  127.         system("cls");  
  128.     }  
  129.     return 0;  
  130. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值