【问题标题】:Deleting an entry from an array in a struct, in C在 C 中从结构中的数组中删除一个条目
【发布时间】:2014-08-10 18:10:34
【问题描述】:

我不知道如何擦除结构类型数组的条目。我正在阅读我买的书,但没有关于它的章节,而且我似乎找不到任何功能来做到这一点。我想它与手动相关。我想到了这一点,我能想到的唯一方法是将现有数组的位置更改为想要擦除它的位置,但我不知道该怎么做。

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

struct coches {
        int    id;
       char   nombre[10];
       char   marca[10];
       char   color[10];
       float  kilometros;
};

int insertar_datos(struct coches concesionario[30]); 
int checkout(char login[10], char password[10]); 
void mostrar_datos(struct coches concesionario[30],int x);
void eliminar_datos(struct coches concesionario[30],int x);

int main (void){

struct coches concesionario[30];
int menu, credenciales, x = 0;
char login[10],password[10];


puts("\n<><><>Bienvenido<><><>\n");

puts("\nAntes de poder usar el sistema deber estar autentificado\n");
while (credenciales != 1){
puts("\nDime tu usuario:\n");
scanf("%10s", &login);
puts("\nDime tu password:\n");
scanf("%10s", &password);
credenciales=checkout(login, password);
}

while (menu != 4){
puts("\nQue deseas hacer?\n");
puts("\n1)Insertar datos\n2)Listar coches\n3)Eliminar entradas\n4)Salir del programa\n");
scanf("%d", &menu);
switch(menu){

             case 1:

                  x = insertar_datos(concesionario);
                  break;


             case 2:

                  mostrar_datos(concesionario,x);
                  break;

             case 3:

                  eliminar_datos(concesionario,x);
                  break;

             }

}    


}   

int checkout(char login[10], char password[10]){

    if ((strcmp(strlwr(login),"12345") ==0 ) && (strcmp(strlwr(password),"12345") ==0)){

    return 1;

    }else{

    return 0;

} 
}

int insertar_datos(struct coches concesionario[30]){
    char respuesta[3];
    int x = 0;
    system("cls");
    while (!strstr(respuesta,"no")){
    puts("\nDime la id:\n");
    fflush(stdin);
    scanf("%d", &concesionario[x].id);
    system("cls");
    puts("\nDime el modelo:\n");
    fflush(stdin);
    scanf("%10s", &concesionario[x].nombre);
    system("cls");
    puts("\nDime la marca:\n");
    fflush(stdin);
    scanf("%10s", &concesionario[x].marca);
    system("cls");
    puts("\nDime el color:\n");
    fflush(stdin);
    scanf("%10s", &concesionario[x].color);
    system("cls");
    puts("\nDime los kilometros:\n");
    fflush(stdin);
    scanf("%d", &concesionario[x].kilometros);
    system("cls");
    x++;
    puts("\nQuieres insertar algo mas?\n");
    fflush(stdin);
    scanf("%3s", &respuesta);
    system("cls");
    strlwr(respuesta);
}

return x;


}

void mostrar_datos(struct coches concesionario[30],int x){

    int i;

    if (x <= 0){


    system("cls");      
    puts("\nRegistro vacio\n");


    }else{


    for (i = 0; i < x; i++){

        printf("\nID: %d\n\nModelo: %s\n\nMarca: %s\n\nColor: "
           "%s\n\nKilometros: %f\n",
           concesionario[i].id, concesionario[i].nombre, concesionario[i].marca,
           concesionario[i].color, concesionario[i].kilometros);
     }
     system("pause");
}  

}

void eliminar_datos(struct coches concesionario[30],int x){

    int i, cuenta = 0;

    if (x <= 0){

    system("cls");      
    puts("\nRegistro vacio\n");

    }else{

    for (i = 0; i < x; i++){

        printf("\nEntrada numero:%d\nID: %d\n\nModelo: %s\n\nMarca: %s\n\nColor: "
           "%s\n\nKilometros: %f\n", cuenta,
           concesionario[i].id, concesionario[i].nombre, concesionario[i].marca,
           concesionario[i].color, concesionario[i].kilometros);
           cuenta++;

     }

     puts("\nQue entrada quieres borrar?\n");
}  

}

【问题讨论】:

  • 是的,您几乎只需覆盖它并将所有后续位置设为 n-1。欢迎来到 C 的美妙土地
  • 如果你有一个结构数组,那么你确实可以删除一个元素,方法是将元素移到一个空格后。如果你有不同的记忆组织,你会做不同的事情。如果您有一个指向结构的指针数组,则删除(释放)该结构并将指针向下洗牌。如果您有一个链接列表,您可以从列表中分离要删除的项目,然后删除(释放)已删除的结构。等等。
  • 一个简单的数组不能在不移动其他元素的情况下插入或删除元素(大约第一个或最后一个除外)。如果您希望经常这样做,您可能需要使用链表。
  • 我不知道它要求很多,但是……你们能不能把代码写下来,让我看看它是如何工作的,谢谢!
  • 我现在,但我不知道如何继续这样做,这就是我问的原因,我真的不喜欢这样做。

标签: c arrays struct


【解决方案1】:

给定一些结构类型struct Data,以及该结构类型的数组a

struct Data a[20];
int n_data = 0;

…add data to array, incrementing `n_data`…

/* Delete item d from array */
assert(n_data > 0 && d >= 0 && d < n_data);
for (j = d + 1; j < n_data; j++)
    a[j-1] = a[j];
n_data--;

这是一种简单的方法。另一种方法是使用memmove()——而不是memcpy(),因为通常被移动的区域是重叠的——就像这样:

assert(d >= 0 && d < n_data);

memmove(&a[d], &a[d+1], n_data - d - 1);
n_data--;

请注意,如果结构中有分配的内存(例如char * 成员),您需要在覆盖之前从已删除的结构中释放所有分配的内存。

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多