Как удалить элемент из структуры - C - PullRequest
0 голосов
/ 30 января 2019

Я бы хотел, чтобы вы помогли мне с домашним заданием, которое мы получили от нашего учителя.Мой вопрос заключается в следующем: Можете ли вы помочь мне исправить мой метод ddelete?О, и пожалуйста, не отмечайте это как дубликат, потому что не думайте, что есть решение моей проблемы.(Я говорю это, потому что прошлой ночью я много для этого исследовал)

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
typedef struct{
    long long unsigned num;
    char name[20];
}Telbook;
using namespace std;
int be(Telbook*);
void ki(Telbook[]);
void search (Telbook[]);
void ddelete(Telbook[]);
int count(Telbook[]);

int main(){


setlocale(LC_ALL,"");
printf("\t\t\t  Struktura feladat 1.  \n\n\n");
Telbook tomb[50];
int db;
db=be(tomb);            
ki(tomb);
search(tomb);
ddelete(tomb);
ki(tomb);
system("pause");
}
int be(Telbook *n){
    int i=0;
    printf("Enter phone # and names until the phone # you entered is 0\n");

    /*printf("Kérek egy nevet: ");
    scanf("%s",n->name);*/
    printf("Enter a Phone #: ");
    scanf("%llu",&n->num);

    while(n->num){
        printf("Enter a name: ");
        scanf("%s",n->name);
        i++;
        n++;
        printf("Enter a phone #: ");
        scanf("%llu",&n->num);

    }
    return i;
}
void ki(Telbook n[]){
    int i=0;
    while(n[i].num){

    printf("Name: %s, Phone #: %llu\n",n[i].name,n[i].num);
    i++;
    //n++;
    }

}
void search(Telbook n[]){
    int i=0;
    int dbb;

    char nev[20];
    dbb=count(n);
    printf("Enter the name you're  searching for: ");
    scanf("%s",nev);
    for(i=0;i<dbb;i++){
        if(strcmp(n[i].name,nev)==0)break;

        //n++;
    }
    if(i==dbb){
    printf("The name doesn't exist.\n");
    }
    else{
        printf("The name you have searhed for is: %s it's on the %d. index.\n",nev,i+1);
    }
}
int count(Telbook n[]) {
    int i = 0;
    while (n[i].num) {

        i++;
    }
    return i;
}

void ddelete(Telbook n[]){


    int szam,db=count(n),i=0,adat;

        printf("Enter a number you want to delete: ");scanf("%d",&szam);    
        for(i = 0; i < db; i++){
            if( szam == n[i].num){
                for (i = 0; i <  db - 1; i++)
            {
            n[i] = n[i + 1];


           } 
       }        
    }       

}

Вот мой код.Я написал это как можно более понятным. ** Моя проблема в том, что он не удаляет элемент из структуры. **

1 Ответ

0 голосов
/ 30 января 2019

Поскольку вы используете массив Telbook, вы не можете удалить.Это, вероятно, то, что вы нашли, прочитав.Тип удаления, который упоминается здесь, - это удаление места для элемента, который нужно удалить.И это невозможно при использовании массива.В C ++ массивы имеют фиксированный размер, так как ваш жесткий диск имеет фиксированный размер (вы не можете удалить купленное место).

Теперь удаление может относиться к точке зрения пользователя, это означает, что при условии, чтоприложение представляет данные пользователю, как будто некоторые данные могут быть удалены, такое удаление является вопросом кодирования информации (вы можете удалять файлы, но это не физическое удаление пространства, просто логическое удаление, данные никогда не представляются вам снова, вот и все).

Тогда в вашем случае вы либо меняете способ управления используемой памятью (например, с помощью динамического выделения - new / delete - для выделения и удаления места в вашей запущенной программе), либо используете какой-то видкодирование для представления того факта, что некоторые записи в массиве с фиксированным размером не соответствуют чему-либо и должны рассматриваться как «свободные».

В вашем случае функция ki может помочь вам:

void ki(Telbook n[]){
    int i=0;
    while(n[i].num){    
      printf("Name: %s, Phone #: %llu\n",n[i].name,n[i].num);
      i++;
    } 
}

Как написано, допустимые записи в массиве - это те, которые проиндексированы от начала до той, для которойПоле h num равно 0. Таким образом, логика, лежащая в основе сохранения, такова: любой элемент TelBook, для которого num равно 0, является «свободным» или хранится с индексом, превышающим элемент, для которого num равенк нулю.

Тогда что-то вроде:

void ddelete(Telbook n[]){
    int szam,db=count(n),i=0,adat;
    printf("Enter a number you want to delete: ");
    scanf("%d",&szam);    
    for(i = 0; i < db; i++) {
       if (szam == n[i].num){
         for (j = i; j <  db - 2; j++) { // copy elements at the end, one pos to the left 
            n[j] = n[j + 1];
         }
         n[db-1].num = 0; // ensure the last element is effectively a free one
         return; // stop here, no need to continue 
       }       
    }       
}

Но это также предполагает, что все записи TelBook были правильно инициализированы, что не так, измените на (как минимум):

Telbook tomb[50];
tomb[0].num = 0;

Могут существовать некоторые другие проблемы, но теперь вам придется немного поработать самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...