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 }