Как удалить элемент из массива struct?

#arrays #c #struct

#c

Вопрос:

Как удалить элемент из массива типа structure? Допустим, если я зарегистрирую элемент, а затем захочу его удалить, как я могу это сделать? Функция удаления находится в конце кода. Я хочу удалить элемент, указав varunummer (идентификационный номер). Кто-нибудь знает, как это сделать?

 #include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define WORDLENGTH 30
#define MAX 5
struct varor {
    int varunummer;
    char namn[WORDLENGTH];
    int lagersaldo;
};

int readLine(char s[], int length); 
int ifVarunummerExist(int varunummer, const struct varor reg[], int nrOfGoods);
void registerVaror(struct varor reg[], int *nrOfGoods);
void getPrint(const struct varor reg[], int nrOfGoods);
void avregristreraVaror(struct varor reg[], int nrOfGoods);

int main(void) {
    struct varor vRegister[WORDLENGTH];
    int nrOfGoods = 0;
    int run = 1;
    while (run) {
        char choice;
        printf("nttMeny - Lager Programnn
        (1) Registernbbbb
        (2) Printn
        (3) Deleten
        (4) Quitn");
        scanf(" %c%*c", amp;choice);

        if (choice=='1')
            registerVaror(vRegister, amp;nrOfGoods);
        if (choice=='2')
            getPrint(vRegister, nrOfGoods);
        if (choice=='3')
            avregristreraVaror(vRegister, nrOfGoods);
        else if (choice=='4')
            run = 0;
    }
    return 0;
}

int ifVarunummerExist(int varunummer, const struct varor reg[], int nrOfGoods) {
    int i;
    for (i = 0; i < nrOfGoods; i  )
        if(reg[i].varunummer == varunummer)
            return i;
    return -1;
}

int readLine(char s[], int length) {
    int ch, i=0;
    while (isspace(ch=getchar()));
    while (ch != 'n' amp;amp; ch != EOF) {
        if (i < length)
            s[i  ] = ch;
        ch = getchar();
    }
    s[i] = '';
    return i;
}

void registerVaror(struct varor reg[], int *nrOfGoods) {
    char namn[WORDLENGTH], tmp[WORDLENGTH];
    int varunummer, lagersaldo;
    if (*nrOfGoods == MAX) {
        printf("nError! Finns inte plats kvar!n");
        return;
    }
    printf("Ange varunummer: ");
    scanf("%d", amp;varunummer);
    if (ifVarunummerExist(varunummer, reg, *nrOfGoods) >= 0) {
        printf("nVarunummer finns redan!n");
        return;
    }
    reg[*nrOfGoods].varunummer = varunummer;
    printf("Ange namn: ");
    readLine(reg[*nrOfGoods].namn, WORDLENGTH);

    printf("Ange lagersaldo :");
    scanf("%d", amp;reg[*nrOfGoods].lagersaldo);
    //reg[*nrOfGoods]=createVara(varunummer,namn,lagersaldo);
    (*nrOfGoods)  ; 
}

void getPrint(const struct varor reg[], int nrOfGoods) {
    int i;
    printf("nVarunummer t Namn ttt Lagersaldon");
    for (i = 0; i < nrOfGoods; i  ) {
        printf(" %d tt %s ttt %dn",reg[i].varunummer,reg[i].namn,reg[i].lagersaldo);
    }
}

void avregristreraVaror(struct varor reg[], int nrOfGoods) {
    int run = 1;
    while (run) {
        char choice;    
        printf("n (1) Delete n (2) Exit");
        scanf(" %c", amp;choice);
        //DELETE IF CHOICE 1---------
        if (choice == '1') {
            int i, varunummer;
            printf("Ange varunummer: ");
            scanf("%d", amp;varunummer);
            for (i = varunummer   1; i < MAX; i  ) {
                reg[i - 1] = reg[i];
            }
            reg[i] = 0;
        }
    }
    //QUIT TO MY MENU CHOICE 2--------
    if (choice == '2')
        run = 0;
}
 

Комментарии:

1. Вы сдвигаете значения, которые удалят соответствующий элемент. В чем именно проблема? Разве это не работает? Если нет, то что происходит, чего не должно было происходить?

2. @Isac reg[i]=0; присвоение struct *varor несовместимо с типом int- ошибка компилятора

3. Эта строка бесполезна, нет необходимости физически очищать содержимое последнего элемента, просто уменьшите количество товаров. Если вы хотите его очистить, помните, что это struct, поэтому вы не можете просто присвоить ему значение 0.

Ответ №1:

Вы можете попробовать выполнить итерацию по массиву в цикле for, ПОКА ваш varunummer не будет сопоставлен со свойством struct . Что-то в этом роде (допустим, вы ищете элемент с помощью varunummer = varunummerToLookFor ), это сдвигает все элементы в массиве с момента вашего удаления на 1, следовательно, создавая массив с той же последовательностью, что и раньше, но с удалением нужного элемента. Надеюсь, это поможет!

 for(int i = 0, i < varorArraySize, i  ){
if(varunummerToLookFor == varorArray[i].varunummer){
for (i = pos; i <  varorArraySize - 1; i  )
            {
            varorArray[i] = varorArray[i   1];


           } 
       }
}
 

Комментарии:

1. что означает pos?

2. pos = позиция, с которой вы хотите, чтобы она начиналась, или вы могли бы просто сделать 0