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 }