建立十字链表

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

完整思路: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 }

 

posted @ 2016-10-30 21:23  nullxjx  阅读(3054)  评论(0编辑  收藏  举报