C语言中从数组中删除元素

2024-04-18

我只是有一个关于 C 中数组的简单问题:

从数组中删除元素并在此过程中使数组变小的最佳方法是什么?

即:数组是nsize,然后我从数组中取出元素,然后数组会根据我从中删除的元素而变小。

基本上,我将数组视为一副纸牌,一旦我从这副纸牌的顶部取出一张纸牌,它就不应该再存在了。

编辑:我要在一天结束之前让自己发疯,感谢您在尝试价值交换时提供的所有帮助,但它无法正常工作。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

enum faces { Ace = 0, Jack = 10, Queen, King };
char *facecheck(int d); 
int draw(int deck, int i); 

int main() { 
    int deck[52], i, n;
    char suits[4][9] = {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"
    };

    n = 0;

    for (i = 0; i < 52; i++) {
        deck[i] = n;
        n++;
    };

    for (i = 0; i < 52; i++) {       
        if (i % 13 == 0 || i % 13 == 10 || i % 13 == 11 || i % 13 == 12)
            printf("%s ", facecheck(i % 13));
        else
            printf("%d ", i % 13 + 1);
        printf("of %s \n", suits[i / 13]);
    }

    draw(deck, i);

    return 0; 
}  

char *facecheck(int d) {
    static char *face[] = {
        "Ace",
        "Jack",
        "Queen",
        "King"
    };

    if (d == Ace)
        return face[0];
    else {
        if (d == Jack) 
            return face[1];
        else {
            if (d == Queen)
                return face[2];
            else { 
                if (d == King)
                    return face[3];
            }
        }
    } 
}

int draw(int deck, int i) { 
    int hand[5], j, temp[j];

    for (i = 0; i < 52; i++) {
        j = i
    }; 

    for (i = 0; i < 5; i++) {
        deck[i] = hand[]; 
        printf("A card has been drawn \n");
        deck[i] = temp[j - 1];
        temp[j] = deck[i];
    };
      
    return deck;
}

实际上有两个不同的问题。第一个是保持数组元素的正确顺序,以便删除元素后不会出现“空洞”。第二个实际上是调整数组本身的大小。

C 中的数组被分配为固定数量的连续元素。无法实际删除数组中单个元素使用的内存,但可以移动元素以填充删除元素造成的空洞。例如:

void remove_element(array_type *array, int index, int array_length)
{
   int i;
   for(i = index; i < array_length - 1; i++) array[i] = array[i + 1];
}

静态分配的数组不能调整大小。动态分配的数组可以使用 realloc() 调整大小。这可能会将整个数组移动到内存中的另一个位置,因此必须更新指向数组或其元素的所有指针。例如:

remove_element(array, index, array_length);  /* First shift the elements, then reallocate */
array_type *tmp = realloc(array, (array_length - 1) * sizeof(array_type) );
if (tmp == NULL && array_length > 1) {
   /* No memory available */
   exit(EXIT_FAILURE);
}
array_length = array_length - 1;
array = tmp;

如果请求的大小为 0,或者出现错误,realloc 将返回 NULL 指针。否则它返回一个指向重新分配的数组的指针。临时指针用于在调用 realloc 时检测错误,因为也可以将原始数组保留为原样,而不是退出。当 realloc 无法重新分配数组时,它不会更改原始数组。

请注意,如果数组很大或者删除了很多元素,这两个操作都会相当慢。如果优先考虑高效插入和删除,还可以使用其他数据结构,例如链表和哈希。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中从数组中删除元素 的相关文章

  • 在应用程序版本中使用 svn 修订号

    在 VS2010 解决方案 不是 NET 中 我希望将 svn 修订号作为应用程序版本的一部分包含在内 我们目前不使用 makefile 仅使用 VS 解决方案 项目设置 我想在编译时获取工作副本修订号 将其存储到变量中 以便稍后在代码中使
  • char* 与 const char* 作为参数

    我在使用的时候很多时候都会遇到编译错误char 代替const char 所以 我不确定实际的区别 语法和编译机制 如果您追求两者之间的差异 只需将它们视为 char 是一个指针 指向包含也可以更改的 char 类型值的位置 指针的值可以更
  • 警告:从不兼容的指针类型为链接列表数组赋值

    我正在执行一个 C 程序 但收到警告 警告 来自不兼容指针类型的赋值 我在这里复制相关代码 Structure I am using typedef struct graph node int id int weight struct no
  • 如何使用 C 将带有 2 个变量的 IF 语句转换为 switch 函数?

    我有一个 IF 语句 我想将其转换为 Switch 语句 但它有 2 个变量 在C上可以实现吗 这是一个石头 剪刀 布的游戏 R代表石头 P代表布 S代表剪刀 char play1 play2 printf nPlayer 1 Enter
  • 如何从对象文字数组中切片数组?

    我有这个数组 其中每个索引都包含一个对象文字 所有对象字面量都具有相同的属性 某些对象文字对于给定属性具有相同的值 我想创建一个包含only那些对象文字 我的想法是对数组进行排序 并将其切片成一个新数组 这是数组 var arr arr 0
  • 使用 C# 的服务 SACL ||使用 C# 获取具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄

    有人知道如何使用 C 获取远程服务上的 SACL 吗 我尝试了很多不同的方法 但基本上没有什么效果 我可以在本地计算机上获取 DACL 和 SACL 但在远程计算机上获取其中任何一个似乎都不可能 我所做的是创建一个名为ServiceSecu
  • 如何将类成员函数的返回类型设置为私有结构的对象

    很抱歉这个又长又令人困惑的标题 但我想不出更好的方法来问这个问题 所以 我有一堂课 template
  • 如何对多重映射中的键和值进行排序?

    建议使用任何方法对多重映射的键及其值进行排序 例如 输入 5 1 1 9 1 1 5 2 1 2 输出必须是 1 1 1 2 1 9 5 1 5 2 答案是emplace hint 伪代码如下所示 insert with hint M mm
  • HttpContext 类及其线程安全

    我有一个辛格尔顿应用程序中的对象具有以下属性 private AllocationActionsCollection AllocationActions get return HttpContext Current Session Allo
  • 如何在asp.net core中以强类型方式获取资源字符串?

    在下面的程序中 为了获取资源字符串 我使用 localizer About Title 其中 About Title 是一个魔术字符串 如何避免使用这样的字符串 有没有强类型的方法 using Microsoft AspNetCore Mv
  • 我可以使用什么 C++ 库在 Windows 上将 PDF 转换为图像?

    我正在开展一个需要分析图像的项目 这些图像的主要来源是网络摄像头 但最近我们被要求添加对上传文件和扫描仪的支持 这在大多数情况下都很好 只是他们希望我们能够使用 PDF 格式的文档 我需要一个原始像素位图进行处理 在 Mac 上 我可以使用
  • 如何构建具有多个子站点地图的站点地图?

    我在用 MVC4 MvcSiteMapProvider v3 2 1 需要能够升级到v4 我的问题是应用程序很大 我想模块化应用程序并使模块可插拔 由于站点地图已经很大 我想让站点地图也变得可插拔 有没有办法在应用程序启动时使用根站点地图从
  • 自定义 web.config 部分处理程序

    我之前设计过一个自定义部分处理程序 但我遇到了一个我似乎无法想到的问题 我有一个像这样的配置部分
  • 从 Linux 内核模块的文件描述符获取文件名/路径?

    在Linux内核模块中 有没有一种方法可以从文件名 路径中获取文件名 路径 unsigned int fd 我知道这个答案 如何从内核模块内的文件描述符获取文件名 https stackoverflow com questions 8250
  • 如何在嵌套数组中查找叶数组?

    我在 PHP 中有一个嵌套数组 array 0 gt 5x 1 gt array 0 gt 1 gt 2 gt 3 3 gt array 0 gt 1 gt 2 gt array I want to find this one 0 gt 1
  • 在 C# .Net 中将小数转换为小时、分钟和秒

    我在数据库中有一个分钟字段 例如 138 34 我需要将其转换回 HH MM SS 最简单的方法是什么 您可以使用TimeSpan FromMinutes minutesInDouble 以双精度格式传递上述值 欲了解更多信息 检查 MSD
  • gfortran 未定义的引用

    我正在尝试编译一个依赖很多东西的程序 我使用并修改了提供的 makefile 来代表我的计算机设置 但在编译的最后一步中我不断收到许多未定义的引用 导致问题的命令行是 gfortran o cosmomc ParamNames o Matr
  • 在 fork() 之后寻求有关“文件描述符”的简单描述

    Unix 环境中的高级编程 第二版 作者 W Richard Stevens 第 8 3 节 fork 函数 描述如下 父级和子级共享相同的文件偏移量非常重要 考虑一个分叉子进程 然后等待子进程完成的进程 假设两个进程都写入标准输出作为其正
  • 为什么/何时将运算符指定为显式很重要?

    我借用了下面的代码另一个问题 https stackoverflow com a 7305947 93394 稍作修改 在我的代码中使用 internal class PositiveDouble private double value
  • 列出所有会话信息

    我想在页面中显示我的asp net页面 aspx 的所有会话信息 我怎样才能做到这一点 编程语言是C 这两种方法对我有用 稍微改进和纠正了大卫的答案 第一种方法 for int i 0 i lt Session Count i var cr

随机推荐

  • 如何使用 open() 函数清除 .txt 文件?

    我有一个简单的程序 可以打开文件并替换文本 但是 我希望程序清除文件 然后保存需要保存的内容 我怎么做 或者有更简单的方法吗 如果您使用模式打开文件w如果文件已经存在 它将覆盖该文件 with open your file w as f f
  • 加载内核模块时出现未知符号

    我需要帮助理解为什么在插入模块时出现错误 我努力了this http www linuxforums org forum kernel 56497 unkown symbol module error while insmodding bu
  • spring jar bootRun 导致 GraphQL Schema 错误

    当我使用 gradle 构建 Spring Boot 应用程序时bootRun or build然后运行输出 jar 我从控制台日志中得到以下大量错误列表 2018 03 18 00 49 38 754 ERROR 228 main o s
  • Qt 自定义外观和感觉?

    我可以强制我的 Qt 应用程序使用不同的外观和感觉 就像在 KDE 中一样吗 您始终可以使用 QApplication setStyle 更改小部件的样式 Qt4 中有一些预定义的选项可用 在 main cpp 中做这样的事情 includ
  • 如何使用 ggplot2 面颜色和形状?

    也许 我错过了 ggplot 语法中的一些内容 可以毫无错误地绘制以下 3 个方面 不幸的是 面图混合了颜色和形状 右侧一栏应仅显示蓝色标记 而中间一栏应显示绿色标记 data1 num delay claim supply project
  • 错误:输入文件并非全部位于同一目录中,请提供显式 wd

    在尝试构建一个大约两周前工作的 PDF 后 没有大惊小怪 在一台全新安装了 R R studio 的新机器上 bookdown等等 我有这个错误 Error Input files not all in same directory ple
  • Laravel 迁移更改列的默认值

    我有一个已分配默认值的表 例如 我们可以看看以下内容 Schema create users function Blueprint table table gt increments id gt unsigned table gt inte
  • 子元素悬停时的 CSS 过渡

    当子元素的父元素悬停在其上方时 我试图暂停子元素的显示 Html span div This Is The Child div Some Text in the span span Css span position relative sp
  • 如何在 php 脚本仍在运行时显示结果

    所以我尝试过在脚本仍在执行时显示结果 https stackoverflow com questions 5415665 show results while script is still executing 但由于某种原因它不起作用 所
  • Jshell错误:java.lang.NullPointerException:charsetName

    我正在尝试使用 JDK11 提供的 JShell 来运行一些简单的命令 但是当我输入 jshell gt System out println Hello World 它给了我错误 Exception in thread main java
  • 抽象类中可以有静态数据成员吗?

    我设计了一系列相关的类 为了能够管理它们 我让它们从一个抽象类派生 这些类都需要访问一系列共享资源 我发现自己在每个类中创建了一个指针向量 它们全部相同 它们必然必须相同 似乎在基类中创建一个静态成员将使所有派生类都可以访问该向量 这意味着
  • 如何向我的应用程序添加“撰写评论”/“给我们评分”功能?

    我希望在我的应用程序中添加某种 撰写评论 或 给我们评分 功能 以便我的客户可以轻松地对我的应用程序进行评分和评论 我能想到的最佳实践是在我的应用程序中进行某种弹出窗口或打开 UIWebView 这样用户在打开 App Store 应用程序
  • Whatsapp 预览链接上未显示缩略图和说明

    我知道也有类似的问题here https stackoverflow com questions 19778620 provide an image for whatsapp link sharing and here https stac
  • TFS分行拒绝前往

    我们使用的是 TFS 2010 使用的客户端是 VS 2008 VS 2010 和 VS 2012 我使用 VS 2010 功能来查看 TFS 层次结构功能 以可视化我的 TFS 分支设置并对其进行维护 问题是 一旦分支上的工作完成 我右键
  • 将现有属性添加到所有属性集

    我有一个existing嵌入代码的属性 我需要将此属性与 120 多个现有属性集相关联 如果我知道属性集 ID 如何以编程方式将该属性添加到所有属性集 我发现为这个问题编写代码很有趣 所以这里是有效的解决方案 在 php 脚本 包括 mag
  • UML 设计类图:具有另一个类作为属性的类?

    我很难弄清楚如何将特定场景建模为 UML 设计类图 假设我有以下情况 我有一个名为 CPoint 的类 它有两个属性 x 和 y R2 平面中的坐标 另外 我有一个名为 CLine 的类 它应该有两个 CPoint 作为属性 这对代码来说非
  • 我的 apt 安装 boost 时搞砸了

    在Ubuntu上 gt sudo apt get install libboost all dev Reading package lists Done Building dependency tree Reading state info
  • Twisted:与 TCP 服务器的客户端连接数量有限?

    我正在编写一个聊天服务器 并在对其进行单元测试时遇到以下问题 在我的一个单元测试中 我将许多测试客户端连接到我的服务器 当连接的用户数达到 511 时 服务器停止响应 且没有任何错误消息 在此阶段 一切都在 PC 上本地运行 我准备了一个简
  • org.openqa.selenium.remote.ProtocolHandshake createSession 信息:尝试使用 Selenium Grid 进行双方言会话

    我建立了一个本地硒网格来测试一些东西 连接到另一个网格时构建运行正常 但使用本地网格时构建仅在此时停止 T E S T S Running xxx xxxxxxxxxxxx xxx xxxxxxxxxxx XXXXXXXXXXXX Sep
  • C语言中从数组中删除元素

    我只是有一个关于 C 中数组的简单问题 从数组中删除元素并在此过程中使数组变小的最佳方法是什么 即 数组是nsize 然后我从数组中取出元素 然后数组会根据我从中删除的元素而变小 基本上 我将数组视为一副纸牌 一旦我从这副纸牌的顶部取出一张