十字链表M

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define TRUE 1
  4 #define FALSE -1
  5 #define ERROR 0
  6 #define OK 1
  7 #define OVERFLOW -2
  8 #define LEN1 sizeof(OLink)
  9 #define LEN2 sizeof(OLNode)
 10 typedef int Status;
 11 typedef int ElemType;
 12 typedef struct OLNode{
 13     int i,j;
 14     ElemType e;
 15     OLNode *right,*down;
 16 }OLNode,*OLink;
 17 typedef struct{
 18     OLink *rhead,*chead;
 19     int mu,nu,tu;
 20 }CrossList;
 21 ElemType GetElemSMatrix_OL(CrossList M,int i,int j)
 22 {
 23     OLink p;
 24     for(p=M.rhead[i];p&&p->j<j;p=p->right);
 25     if(p==NULL||p->j!=j) return ERROR;
 26     return p->e;
 27 }
 28 Status CreateSMatrix_OL(CrossList &M)
 29 {
 30     int i,j,e,m,n,t;
 31     OLink p,q;
 32     puts("请输入稀疏矩阵的行值列值及非零元个数:"); 
 33     scanf("%d%d%d",&m,&n,&t);
 34     M.mu=m;
 35     M.nu=n;
 36     M.tu=t;
 37     if(!(M.rhead=(OLink *)malloc((M.mu+1)*LEN1))) exit(FALSE);
 38     if(!(M.chead=(OLink *)malloc((M.nu+1)*LEN1))) exit(FALSE);
 39     for(i=0;i<=m;i++)
 40     M.rhead[i]=NULL;
 41     for(i=0;i<=n;i++)
 42     M.chead[i]=NULL;
 43     puts("请依次输入元素的行号列号及数值:"); 
 44     while(t--)
 45     {
 46         if(!(p=(OLink)malloc(LEN2))) exit(FALSE);
 47         scanf("%d%d%d",&i,&j,&e);
 48         while(i>M.mu||j>M.nu)
 49         {
 50             puts("当前行号列号不合法,请重新输入行号和列号:");
 51             scanf("%d%d",&i,&j);
 52         }
 53         getchar();
 54         while(GetElemSMatrix_OL(M,i,j))
 55         {
 56             puts("当前位置已存在元素,是否替换此元素:(Y/N)");
 57             if(getchar()=='N')
 58             {puts("请重新输入:");scanf("%d%d%d",&i,&j,&e);}
 59             else
 60             {
 61                 for(q=M.rhead[i];q->j<j;q=q->right);
 62                 q->e=e;
 63                  scanf("%d%d%d",&i,&j,&e);
 64                 break;
 65             }
 66         }
 67         p->i=i;p->j=j;p->e=e;
 68         p->right=p->down=NULL;
 69         if(M.rhead[i]==NULL||M.rhead[i]->j>j)//行插入 
 70         {
 71             p->right=M.rhead[i];
 72             M.rhead[i]=p;
 73         }
 74         else
 75         {
 76             for(q=M.rhead[i];(q->right)&&q->right->j<j;q=q->right);
 77             p->right=q->right;
 78             q->right=p;
 79         }
 80         if(M.chead[j]==NULL||M.chead[j]->i>i)//列插入 
 81         {
 82             p->down=M.chead[j];
 83             M.chead[j]=p;
 84         }
 85         else
 86         {
 87             for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down);
 88             p->down=q->down;
 89             q->down=p;
 90         }
 91     }
 92     return OK;
 93 }
 94 Status IsertSMatrix_OL(CrossList &M,int i,int j,ElemType e)
 95 {
 96     OLink p,q;
 97     if(!(p=(OLink)malloc(LEN2))) exit(FALSE);
 98     while(i>M.mu||j>M.nu)
 99     {
100         puts("当前行号列号不合法,请重新输入行号和列号:");
101         scanf("%d%d",&i,&j);
102     }
103     getchar();
104     while(GetElemSMatrix_OL(M,i,j))
105     {
106         puts("当前位置已存在元素,是否替换此元素:(Y/N)");
107         if(getchar()=='N')
108         {puts("请重新输入:");scanf("%d%d%d",&i,&j,&e);}
109         else
110         {
111             for(q=M.rhead[i];q->j<j;q=q->right);
112             q->e=e;
113             break;
114         }
115     }
116     p->i=i;p->j=j;p->e=e;
117     if(M.rhead[i]==NULL||M.rhead[i]->j>j)//行插入 
118     {
119         p->right=M.rhead[i];
120         M.rhead[i]=p;
121     }
122     else
123     {
124         for(q=M.rhead[i];(q->right)&&q->right->j<j;q=q->right);
125         p->right=q->right;
126         q->right=p;
127     }
128     if(M.chead[j]==NULL||M.chead[j]->i>i)//列插入 
129     {
130         p->down=M.chead[j];
131         M.chead[j]=p;
132     }
133     else
134     {
135         for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down);
136         p->down=q->down;
137         q->down=p;
138     }
139     return OK;
140 }
141 Status DeleteSMatrix_OL(CrossList &M,int i,int j,ElemType &e)
142 {
143     OLink p,q;
144     while(i>M.mu||j>M.nu)
145     {
146         puts("当前行号列号不合法,请重新输入行号和列号:");
147         scanf("%d%d",&i,&j);
148     }
149     while(!GetElemSMatrix_OL(M,i,j))
150     {
151         puts("当前位置不是非零元,请重新输入行号和列号:");
152          scanf("%d%d",&i,&j);
153     }
154     if(M.rhead[i]->j==j)
155     {
156         e=M.rhead[i]->e;
157         M.rhead[i]=M.rhead[i]->right;
158     }
159     else
160     {
161         for(q=M.rhead[i];q->j<j;p=q,q=q->right);
162         p->right=q->right;e=q->e;
163     }
164     if(M.chead[j]->i==i)
165         M.chead[j]=M.chead[j]->down;
166     else
167     {
168         for(q=M.chead[j];q->i<i;p=q,q=q->down);
169         p->down=q->down;
170     }
171     free(q);
172     return OK;
173 }
174 Status PrintSMatrix_OL(CrossList M)
175 {
176     puts("稀疏矩阵为:");
177     for(int i=1;i<=M.mu;i++)
178     {
179         for(int j=1;j<=M.nu;j++)
180         printf("%3d",GetElemSMatrix_OL(M,i,j));
181         putchar('\n');
182     }
183     return OK;
184 }
185 Status main()
186 {
187     int i,j;
188     CrossList M;
189     ElemType e;
190     CreateSMatrix_OL(M);
191     PrintSMatrix_OL(M);
192     puts("请输入你要插入的元素的位置及数值:");
193     scanf("%d%d%d",&i,&j,&e);
194     IsertSMatrix_OL(M,i,j,e);
195     PrintSMatrix_OL(M);
196     puts("请输入你要删除的非零元的位置:");
197     scanf("%d%d",&i,&j);
198     DeleteSMatrix_OL(M,i,j,e);
199     printf("你所删除的元素为:%d\n",e);
200     PrintSMatrix_OL(M);
201     system("pause"); 
202     return OK;
203 }

posted on 2012-08-03 08:16  mycapple  阅读(631)  评论(0编辑  收藏  举报

导航