十字链表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 }

你可能感兴趣的:(链表)