c语言 从一个一维数组中删除指定数值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 从一个一维数组中删除指定数值相关的知识,希望对你有一定的参考价值。
想要具体的编程
如果是最后一个 那么直接长度减一如果不是最后一个,那么把所有后面值依次前移一位,然后长度减一追问
具体的编程。。。
追答void remove(void *start, int item_len, int *len, int remove_index)
//start: 数组起始地址
//item_len 每项长度,比如char 为1 int 为4, 可以用sizeof求
//len 指向总长度的指针
//remove_index 要删除的index, 从0计数
int i;
for(i = remove_index; i < *len - 1; i ++)
memcpy(start+item_len*i; start+item_len*(i+1), item_len);
*len --;
由于不知道你具体的类型,这个可以通用
如果类型确定,比如int 可以这样做
void remove(int *start, int *len, int remove_index)
int i;
for(i = remove_index; i < *len - 1; i ++)
start[i] = start[i+1];
*len --;
/*
36 75 24 50 87 98 44 10 86 79 36 31 36
75 24 50 87 98 44 10 86 79 31
Press any key to continue
*/
#include <stdio.h>int EraseNum(int a[], int n, int num) // 删除a[]中等于num的元素
int i,j;
for(i = 0; i < n; ++i)
if(a[i] == num)
for(j = i; j < n - 1; ++j)
a[j] = a[j + 1];
--n;
return n;
void Show(int a[], int n)
int i;
for(i = 0; i < n; ++i)
printf("%d ",a[i]);
printf("\\n");
int main()
int a[] = 36,75,24,50,87,98,44,10,86,79,36,31,36;
int n = sizeof(a)/sizeof(a[0]);
Show(a,n);
n = EraseNum(a,n,36);
Show(a,n);
return 0;
追问
你这个c语言的软件在哪里下的呀,给个链接吧~
追答这是我自己编的。
追问恩。。。我的意思是运行c语言的软件
追答VC++ 6.0,网上能找到。
追问win7 64旗舰版系统可以用吗,有的同学说只有xp才能用。。。
追答WIN764 不能使用 VC++ 6.0(网上传说有用于WIN 7的VC++ 6.0,我没试过),但可以用 VS 2010。
参考技术B #include <stdio.h>int main(void)
int a[10] = 2, 5, 3, 2, 1, 7, 2, 3, 2, 9;
int i, j, b;
printf("which num to delete:");
scanf("%d", &b);
for (i = j = 0; i < 10; i++)
if (a[i] != b)
a[j++] = a[i];
printf("%d ", a[i]);
printf("\\n");
return 0;
追问
你这个c语言是在哪下的呀,给个链接吧~~
追答有时候,限于提问者的能力,他分辨不出什么是好答案,什么是坏答案。
追问我还没采纳呢好不好,上面是网友采纳,麻烦你看清楚再说。有链接么
追答这里是唯一版本,作者就是我
追问真是服死你了。。。。我问的是c语言软件的下载链接!
参考技术C int a[5] = 1,2,3,4,5;int ib[5];//输出结果
int b = 3;//要删除的数据
int index = 0;
::memset(ib,0x0,sizeof(ib));
for (int i = 0;i<5;i++)
if (b == a[i])//要删除的数据
continue;
else
ib[index] = a[i];
index++;
你的需求过于简单,这是其中的一个方法,如果有其它需求,请追问!本回答被提问者和网友采纳 参考技术D 首先,你的数组的数是不是固定的?
其次,要删除的这个数,是输入的吗?
如果数组是固定的,只要查找你输入的数,查看数组里有没有这个数,如果有,就把这个数删掉就可以了。如果没有,printf一个数组里没有这个数。
js从一维数组中删除相关项
【中文标题】js从一维数组中删除相关项【英文标题】:js remove related items from one dimensional array 【发布时间】:2021-08-24 17:16:38 【问题描述】:我有一个可能看起来像这样的对象数组:
name: "A", parent: null,
name: "B", parent: "A",
name: "C", parent: "B",
name: "D", parent: "B",
name: "E", parent: "A",
这里是树形层次结构:
-A
-B
-C
-D
-E
我试图从数组中删除名称为“B”的所有项目(这也应该删除其子项,因此在这种情况下项目“C”和“D”,但是我是递归新手,我是无法自己完成这项工作,有人可以告诉我这样做的最佳方式吗?
感谢任何愿意提前提供帮助的人
【问题讨论】:
您只需使用forEach
就可以做到这一点
@Goubermouche,这里有一个相关的question和answer
这是如何渲染的?
使用delete object.property
,它将删除该属性(如果它是嵌套对象,那么该对象也是)
@evolutionxbox 尚未渲染它,我只是想删除一个项目及其所有“孩子”
【参考方案1】:
var array_of_object = [
name: "A", parent: null,
name: "B", parent: "A",
name: "C", parent: "B",
name: "D", parent: "B",
name: "E", parent: "A",
];
//returns array with updated value.
function deleteElementIncludingItsChildren(children, OriginalArray)
return OriginalArray.filter(function(element)
//console.log(element)
if(element.name == children || element.parent == children) return false;
else return element;
);
console.log(deleteElementIncludingItsChildren("B", array_of_object))
更新: 用于删除特定节点及其所有子节点
var arr = [
name: "A", parent: null,
name: "B", parent: "A",
name: "C", parent: "B",
name: "D", parent: "B",
name: "E", parent: "A",
];
function rm(node)
var tmp = [];
for(var i = 0; i<arr.length; i++)
if(node == arr[i].parent)
tmp.push(arr[i].name);
if(node==arr[i].name)
arr.splice(i, 1);
i--;
if(tmp.length !==0)
tmp.forEach(function(elem)
rm(elem);
);
rm("B")
console.log(arr)
【讨论】:
这个函数很好用,但它“看起来”只有 2 层深 - 所以如果我们使用我发送的数组作为示例,它似乎可以工作,但是,当我(例如)尝试删除名为“A”的项目会删除前两个级别中的所有内容(因此“C”和“D”仍保留在数组中)。有没有办法解决这个问题?【参考方案2】:编写此代码的一种方法是将其置于另一个函数之上,该函数收集捕获后代层次结构的节点列表。那就是直接递归,然后main函数就是简单的过滤:
const desc = (target, xs, node = xs .find ((name) => name == target)) => node ? [
node,
... xs .filter ((parent) => parent == node .name) .flatMap ((name) => desc (name, xs))
] : []
const removeHier = (target, xs, h = desc (target, xs)) =>
xs .filter (x => ! h.includes (x))
const records = [name: "A", parent: null, name: "B", parent: "A", name: "C", parent: "B", name: "D", parent: "B", name: "E", parent: "A", name: "F", parent: "D"]
console .log (removeHier ('B', records))
【讨论】:
【参考方案3】:解决这个问题的一种方法:
对图进行深度优先遍历并记录/建立每个元素的祖先。如果您正在检查一个叶节点并且它有 B 作为祖先或者是 B 本身,它必须离开。
深度优先:每次看到一个子元素时,对所有这些子元素重复该函数/算法。 叶节点:没有任何子节点的对象。
如何建立父子关系?
当你处理所有的元素时,将你以前没有见过的每一个都放入一个字典(也就是 JS 中的 hashmap、set 或普通对象)中,使用对象的名称作为字典键。当您遇到具有给定父对象的事物时,只需检查您的字典中是否已经存在该对象,并将当前元素添加为子元素。
如果树非常大,这种方法可能会占用大量内存,因此您可能希望将自己限制为仅从子对象对父对象进行单个引用,而不是每个父对象都指向其所有子对象。
【讨论】:
【参考方案4】:如何删除所有嵌套的子项
function deleteAll (obj , arr)
function DeleteNode (obj)
let no = [];
for(let i = 0 ;i < obj.length ; i++)
for(let j = 0 ;j < arr.length ; j++)
if(arr[j].parent === obj[i])
no.push(arr[j].name);
if(obj[i] === arr[j].name)
arr.splice(j,1);
j--
if(no.length > 0)
DeleteNode(no , arr)
DeleteNode(obj)
return arr ;
// Question
const arr = [name: "A", parent: null,
name: "B", parent: "A",
name: "C", parent: "B",
name: "D", parent: "B",
name: "E", parent: "A"];
console.log(deleteAll (["B"] , arr))
如何创建节点
const arr = [name: "A", parent: null,
name: "B", parent: "A",
name: "C", parent: "B",
name: "D", parent: "B",
name: "E", parent: "A"];
//first create a parent oblect
function createTree (arr)
let parent = arr.filter((el)=>return el.parent === null);
let children = arr.filter((el)=>return el.parent !== null);
let tree = ;
//start
children.forEach((c)=>
let parent = c.name ;
let step = [];
let responceFindParent =
function find(parent,arr)
let a= null;
arr.forEach((el)=>
if(el.name === parent)
a= el
)
if(a.parent === null)
step.push(a.name);
let r =el:a , step:step
responceFindParent = r
return ;
else
step.push(a.name)
find(a.parent , arr)
find(parent,arr)
let stepArr = responceFindParent.step.reverse();
function insert (tree)
let b = stepArr[0]
if(!(stepArr[0] in tree))
tree[stepArr[0]] =
stepArr.splice(0,1)
if(stepArr . length > 0)
insert(tree[b])
insert (tree)
//end
)
return tree
console.log(createTree (arr))
【讨论】:
问题是关于删除“分支”,而不仅仅是构建图表。但我想这是一个开始 而且很容易删除分支而不构建整个图。在此处查看其他一些答案。 非常抱歉,我误解了这个问题,现在我已经更新了答案,请查看..以上是关于c语言 从一个一维数组中删除指定数值的主要内容,如果未能解决你的问题,请参考以下文章