2015-11-12 3 views
-3

Я делаю телефонную книгу на C, но у меня проблема с опцией удаления.Удалить элемент из массива в C

Например, моя телефонная книга состоит из

  1. Добавить имя
  2. показать имена
  3. имени
  4. удалить (это опуская другие параметры, такие как номер телефона, адрес и т.д.)

Когда я удаляю контакт, используя опцию 3 rd, и я перехожу на 2 nd, список с именами, которые я h ave сохранен, но отображается без имени, которое я удалил. Но это повторяет мне последнюю позицию.

Вот код:

#include <cstdio> 
#include <cstdlib> 
#include <cstring> 

char name[5][20]; 
char aux[20]; 
int position; 
int op; 


void menu(); 
void add(); 
void show(); 
void show_remove(); 
//void remove(); 
void pause(); 


int main() 
{ 
menu(); 

return 0; 
} 


void menu() 
{ 
do{ 

system("clear"); 

printf("\tMAIN MENU\n\n"); 

printf("Choose one of the next options: \n\n"); 

printf("1.....Add a name\n"); 
printf("2.....Show the names in the register\n"); 
printf("3.....Delete a name on the register\n"); 
printf("4.....Exit\n"); 
printf("Choose your option: "); 
scanf(" %i", &op); 

system("clear"); 

switch(op) 
{ 
    case 1: 
    add(); 
    break; 

    case 2: 
    show(); 
    break; 

    case 3: 
    show_remove(); 
    break; 

    case 4: 
    printf("\nEnd of the program"); 
    pause(); 

    } 


    }while(op!=4); 

} 



void pause() 
{ 
    printf("\n\nPress ENTER to continue\n"); 
    getchar(); 
    getchar(); 
    } 



void add() 
{ 
    printf("\tADD THE NAMES\n\n"); 

    for(int i=0; i<5; i++) 
    { 
     printf("Name in [%i]: ", i); 
     scanf(" %[^\n]", name[i]); 
     } 

     pause(); 
    } 



void show_remove() 
{ 
    int i,j,x; 

    for(i=0; i<5-1; i++) 
     { 
      for(j=i+1; j<5; j++) 
      { 
      x=strcmp(name[i], name[j]); 
      if(x>0) 
      { 
       strcpy(aux, name[i]); 
       strcpy(name[i], name[j]); 
       strcpy(name[j], aux);      

       } 
       } 
      } 


    printf("\tADDED NAMES\n"); 

    for(i=0; i<5; i++) 
    { 
     printf("\nName in [%i]: %s", i, name[i]); 
     } 


     printf("\n\n'1' yes, '0' no."); 
     printf("\nDo you want to delete an element from array? 1/0:"); 
     scanf(" %i", &op); 

     if(op==1) 
     { 
     printf("\n\nAdd the index that you wish to delete: "); 
    scanf(" %i", &position); 



    if(position>=5) 
    { 
     printf("Can't be deleted!"); 
     } 


    else 
    { 
    for(i=position; i<5-1; i++) 
    { 
      x=strcmp(name[i], name[i+1]); 
      if(x<0) 
      { 
       strcpy(name[i], name[i+1]); 
       } 
      } 


printf("\nArray after the elimination: \n"); 
for(i=0; i<5-1; i++) 
{ 
    printf("\nElementsof the array [%i]: %s", i, name[i]); 
     } 
     pause(); 
     } 
    } 



    else 
    { 
    pause(); 
     } 

    } 



void show() 
{ 
    printf("\tADDES NAMES\n\n"); 
    { 
     for(int i=0; i<5; i++) 
     { 
     printf("\nElements of the array [%i]: %s", i, name[i]); 
      } 
     } 
     pause(); 


    } 
+0

Пример в примере, пример? –

+0

'5-1' вы знаете, что это то же самое, что' 4'? :-) – kaylum

+0

Функция 'show' всегда печатает 5 имен. Вам нужно напечатать меньше имен, если вы удалите их. Используйте переменную для отслеживания количества имен. – Kevin

ответ

2

Она повторяет последнюю позицию, потому что это именно то, что вы говорите это делать. Вы удаляете, копируя все элементы после удаленной записи по одной позиции. Но вы оставите исходную копию в последнем слоте. Вам нужно заполнить пустую строку. Или только список 4 слотов, как @kevin предложил в комментариях.

0

Постарайтесь узнать больше о библиотечной функции strcmphere.
Вы также можете указать некоторую определенную пользователем строку для отображения конца.

ИЛИ
Вы должны декремента размера в соответствии с делецией так, что последний не оставили освобожден для любого значения нежелательного/удаляемого значения для повторитесь.
Выполнение этой задачи позволит исключить возможность получения равного сравнения строк, не обнаружено и будет правильно работать с вашей программой.

+0

Можете ли вы дать мне пример, пожалуйста? – krlosfgx

Смежные вопросы