zoukankan      html  css  js  c++  java
  • 建立十字链表

    第一次看的时候没看懂这里,几个月后回来温习,彻底搞懂了!

    完整思路:http://blog.csdn.net/zhuyi2654715/article/details/6729783

    大神讲的非常清楚,一下子就看懂了!

    下面贴上自己写的代码,代码纯手写,没有参考别人或者书上,可能有瑕疵,欢迎指出!

    注意,由于我是从相应的文件中读取数据,测试时请在相应目录放入相应文件(input.txt)

    测试数据:

    4 6 5

    1 2 3
    2 2 2
    2 4 5
    4 1 9
    4 6 1

    4 6 4

    1 3 7
    2 2 6
    2 4 -5
    3 2 4

    转载请声明!

    -------------------------------------------------代码区--------------------------------------------------

      1 #include <iostream>
      2 #include <malloc.h>
      3 #include <stdio.h>
      4 
      5 using namespace std;
      6 
      7 typedef struct OLNode
      8 {
      9     int i,j;
     10     int e;
     11     struct OLNode *right,*down;
     12 }OLNode,*OLink;
     13 
     14 typedef struct
     15 {
     16     OLink *rhead,*chead;
     17     int mu,nu,tu;
     18 }CrossList;
     19 
     20 int CreateSMatrix_OL(CrossList &M)
     21 {
     22     int i,j,k,e;
     23     OLink p,q,q1;
     24     cout<<"请分别输入该矩阵的行数,列数,所含非零元的个数:"<<endl;
     25     cin>>M.mu>>M.nu>>M.tu;
     26     if(!M.mu||!M.nu||!M.tu||M.mu*M.mu<M.tu) return 0;
     27     M.rhead=(OLink *)malloc((M.mu+1)*sizeof(OLink));//默认从第一行和第一列开始
     28     if(!M.rhead) return 0;
     29     M.chead=(OLink *)malloc((M.nu+1)*sizeof(OLink));
     30     if(!M.chead) return 0;
     31     for(k=1;k<=M.mu;k++) M.rhead[k]=NULL;
     32     for(k=1;k<=M.nu;k++) M.chead[k]=NULL;
     33     for(k=0;k<M.tu;k++)
     34     {
     35         cout<<"请输入当前元素在矩阵中的行号,列号,元素值:"<<endl;
     36         cin>>i>>j>>e;
     37         if(i<1||i>M.mu||j<1||j>M.nu||0==e) {cout<<"该元素输入错误!"; continue;}
     38         p=(OLink)malloc(sizeof(OLNode));
     39         p->i=i;
     40         p->j=j;
     41         p->e=e;
     42         //判断横行插入的位置
     43         if(!M.rhead[i]||M.rhead[i]->j>j)
     44         {
     45             p->right=M.rhead[i];
     46             M.rhead[i]=p;
     47         }
     48         else
     49         {
     50             q=M.rhead[i];
     51             q1=q->right;
     52             if(!q1) { q->right=p;p->right=NULL;}
     53             else
     54             {
     55                 while(q1->j<j)
     56                 {
     57                     q=q->right;
     58                     q1=q1->right;
     59                     if(!q1) break;
     60                 }
     61                 if(q1)
     62                 {
     63                     q->right=p;
     64                     p->right=q1;
     65                 }
     66                 else { q->right=p;p->right=NULL;}
     67             }
     68         }
     69         //判断纵行插入的位置
     70         if(!M.chead[j]||M.chead[j]->i>i)
     71         {
     72             p->down=M.chead[j];
     73             M.chead[j]=p;
     74         }
     75         else
     76         {
     77             q=M.chead[j];
     78             q1=q->down;
     79             if(!q1) { q->down=p;p->down=NULL;}
     80             else
     81             {
     82                 while(q1->i<i)
     83                 {
     84                     q=q->down;
     85                     q1=q1->down;
     86                     if(!q1) break;
     87                 }
     88                 if(q1)
     89                 {
     90                     q->down=p;
     91                     p->down=q1;
     92                 }
     93                 else { q->down=p;p->down=NULL;}
     94             }
     95         }
     96     }
     97     return 0;
     98 }
     99 int Display(CrossList M)
    100 {
    101     int k;
    102     OLink p;
    103     for(k=1;k<=M.mu;k++)
    104     {
    105         p=M.rhead[k];
    106         while(p)
    107         {
    108             cout<<"("<<k<<","<<p->j<<")  "<<"e="<<p->e<<endl;
    109             p=p->right;
    110         }
    111     }
    112     cout<<endl;
    113     return 0;
    114 }
    115 int main()
    116 {
    117     freopen( "input.txt", "r", stdin );//从input.txt中读取数据
    118     CrossList M1,M2;
    119     CreateSMatrix_OL(M1);
    120     CreateSMatrix_OL(M2);
    121     Display(M1);
    122     Display(M2);
    123     fclose(stdin);
    124     return 0;
    125 }
    只有0和1的世界是简单的
  • 相关阅读:
    3月30日
    3月29日
    3月26日
    3月24
    3月22日
    3月20日
    博弈论基础
    $burnside$引理与$pacute olya$定理
    min-max容斥
    模板
  • 原文地址:https://www.cnblogs.com/nullxjx/p/6014096.html
Copyright © 2011-2022 走看看