第1个回答 推荐于2016-07-28
看了你对 jinlei6394 的追问才知道,目的是降低矩阵的维度,既然这样,就不需要删除某行或某列的存储空间,只需将欲删除的行或列进行覆盖,并同时改变行、列的大小即可解决,当欲删除的行或列是最后的行或列时,只需改变行或列的上限值即可。下面是基于这样算法的例子。
/*
删除前:
68 38 4 96 54
40 20 1 77 44
38 70 17 96 17
36 12 36 99 10
91 21 83 70 73
删除第2行后:
68 38 4 96 54
40 20 1 77 44
36 12 36 99 10
91 21 83 70 73
删除第3列后:
68 38 4 54
40 20 1 44
36 12 36 10
91 21 83 73
请按任意键继续. . .
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int DelRow(int a[][5],int &m,int n,int r) {
int i,j;
if((r < 0) || (r >= m)) return 0;
for(i = r; i < m - 1; ++i) {
for(j = 0; j < n; ++j)
a[i][j] = a[i + 1][j];
}
m--;
return 1;
}
int DelColm(int a[][5],int m,int &n,int c) {
int i,j;
if((c < 0) || (c >= n)) return 0;
for(i = 0; i < m; ++i) {
for(j = c; j < n - 1; ++j)
a[i][j] = a[i][j + 1];
}
n--;
return 1;
}
int main(int argc, char *argv[]) {
int i,j,m = 5,n = 5,a[5][5];
srand((unsigned)time(NULL));
printf("删除前:\n");
for(i = 0; i < m; ++i) {
for(j = 0; j < n; ++j) {
a[i][j] = rand()%100 + 1;
printf("%5d",a[i][j]);
}
printf("\n");
}
printf("删除第2行后:\n");
DelRow(a,m,n,2);
for(i = 0; i < m; ++i) {
for(j = 0; j < n; ++j)
printf("%5d",a[i][j]);
printf("\n");
}
printf("删除第3列后:\n");
DelColm(a,m,n,3);
for(i = 0; i < m; ++i) {
for(j = 0; j < n; ++j)
printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}本回答被提问者采纳