如何从结构中删除元素-C

时间:2019-01-30 07:29:33

标签: c++ struct

我希望您能帮助我完成老师提供的作业。 我的问题如下:您能帮助我更正我的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 :(得分:1)

由于您使用的是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++;
    } 
}

在撰写本文时,数组中的有效条目是从开始到字段num为0的索引的那些条目。因此存储背后的逻辑是:任何{{1} } TelBook等于0的元素是“自由”的,或者以大于num等于零的元素的索引存储。

然后类似:

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

可能还存在其他一些问题,但是您现在必须自己动手做些事情。