求助:如何用c语言实现删除数组中指定的行和列

数组是二维的,且删除的行列不是固定的,删除行或列后,数组的维数也要相应降低

首先,你这是乱来,完全违背c语言的原则。数组是用来存放空间固定、顺序较不重要的内容的。
如果要插入删除的话,最起码也应该用个链表什么的。
可以用链表套链表的方式完成,一个链表A的元素B们也是链表,这样元素在A的序号就是行,在B的序号就是列,这样无论插入删除都有据可依。

但是,如果你一定要这样做,可以考虑这样,每次进行所谓的删除操作时就重新malloc一块内存,并且把相应的数据抄进去。

假设我原先有个数组 int arrold[5][6];
我现在需要删掉一行,那么我就要算一下,新数组的大小。
比如新数组应为 int arrnew[4][6];
那么这个新数组要malloc(sizeof(int)*4*6)出来,并且抄写一下,除了被删除的那行,其他的都要原封不动的抄进去。

也可以,删除第四行就用第五行盖掉第四行,第六行盖掉第五行...一直到最后一行盖掉倒数第二行,原先最后一行清零,并且设变量记录最大行数,这样虽然内存被浪费了,却能达到效果追问

首先呢,我要解释一下,我想实现的就是矩阵降维,所以删除行或者列是必须的。大侠我是c初学,能不能给个代码实现啊,小例子就成~~不胜感激啊

追答

我觉得还是用链表实现吧,
数组的话太麻烦了。
说实话我不爱用多维数组,逻辑上有点乱。
还是用链表的好,如果打现实比喻,就像是珠子的门帘。
去掉一列就是拆下一根链条,去掉一行就是把所有链条的指定相同位置的珠子拆下来。

温馨提示:答案为网友推荐,仅供参考
第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;
}本回答被提问者采纳
第2个回答  2012-05-05
用memmove追问

能详细点不啊

相似回答