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 --;

参考技术A

/*

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语言 从一个一维数组中删除指定数值的主要内容,如果未能解决你的问题,请参考以下文章

用C语言实现一维数组中删除第N个元素的程序怎么写

C语言中怎么把一维数组赋给另外一个一维数组

如何在一个一维数组中插入一个和删除一个数

用C语言如何将一个一维数组中的元素随机排序

Java 怎样删除一维数组中值为M的元素

JS 数值操作 一维数组转二维数组快捷操作