본문 바로가기

CS/자료구조

[인프런|5강] C로 배우는 자료구조 | 전화번호부 v2.0

전화번호부 v2.0

전화번호부 v1.0(4강)에 더해 파일로 저장 및 로드, 알파벳 순 정렬 기능을 추가한다

 

자료구조는 v1.0과 동일하며 load, save 함수가 추가된다.

#include ..

#define CAPACITY 100
#define BUFFER_SIZE 100

char * names[CAPACITY];
char * numbers[CAPACITY];
int n = 0;


void load();

void add();
void find();
void status();
void remove();

void save();

int main() {
  char buffer[BUFFER_SIZE];


  while (1){
    printf("$ ");
    scanf("%s", buffer);

    if (strcmp(command, "read")==0)
      load();

    else if (strcmp(command, "add")==0)
      add();
    else if (strcmp(command, "find")==0)
      find();

    else if (strcmp(command, "delete")==0)
      remove;

    else if (strcmp(command, "save")==0)
      save();
    else if (strcmp(command, "exit")==0)
      break;
   }
   return 0;
}

 

  • load()

void load() {

   char fileName[BUFFER_SIZE];

   char buf1[BUFFER_SIZE];

   char buf2[BUFFER_SIZE];

 

   scanf("%s", fileName);

   FILE *fp = fopen(fileName, "r");

   if (fp==NULL) {

     printf("Open failed.\n");

     return;

   }

 

   while ((fscanf(fp, "%s", buf1) != EOF)) {

     fscanf(fp, "%s", buf2);

     names[n] = strdup(buf1);

     numbers[n] = strdup(buf2);

     n++;

   }

   fclose(fp);

}

 

  • save()

void save() {

  int i;

  char fileName(BUFFER_SIZE];

  char tmp[BUFFER_SIZE];

  

  scanf("%s", tmp);   //which is "as", discarded 

  scanf("%s", fileName);

 

  FILE *fp = fopen(fimeName, "w");   //해당 이름의 파일이 없다면 fopen 함수에서 새로 만들어준다.

  if (fp==NULL) { 

    printf("Open failed.\n");

    return;

  }

  

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

     fprint(fp, "%s %s\n", names[i], numbers[i]);

  }

  fclose(fp);  // 파일을 닫지않아도 당장에는 문제가 생기지 않지만 시스템 자원을 계속 소모하여 프로그램의 성능이 나빠지거나 심한경우 프로그램이 다운될 수 있다.

}

 

bubble sort는 현재의 전화번호부 프로그램처럼 잦은 추가, 삭제가 발생할 수 있는 경우에 적합하지 않다.

이미 정렬되어있다는 기준에서 bubble sort의 경우 배열의 자리이동이 빈번해진다.

 

  • add()

void add() {

  char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];

  scanf("%s", buf1);

  scanf("%s", buf12;

  

  int i=n-1;

  while(i>0 && strcmp(name[i], buf1) > 0) {  // i번째 사람이 새로 입력된 사람보다 더 크다 그러므로 큰 이름 값을 뒤로 옮기는 루틴을 수행

    names[i+1] = names[i];

    numbers[i+1] = numbers[i];

    i--;

  }

  names[n] = strdup(buf1);

  numbers[n] = strdup(buf2);

  n++;

  printf("%s was added successfully.\n", buf1);

}

 

  • remove()

void remove() {

  char buf[BUFFER_SIZE];

  scanf("%s", buf);

  

  int index = search(buf); // return -1 if not exists

  if (index == -1) {

    printf("No persion named '%s' exists.\n", buf);

    return;

  }

  int j = index;

  for (; j<n-1; j++) {   // 정렬은 이미 되어 있으므로 한 칸씩 앞으로 가져오기만해도 정렬은 유지된다.

    names[j] = names[j+1];

    number[j] = numbers[j+1];

    n--;

    printf("'%s' was deleted successfully. \n", buf);

    return;

  }

}

 

  • find()

void find() {

  char buf[BUFFER_SIZE];

  scanf("%s", buf);

 

  int index = search(buf);

  if (index==-1) {

    printf("No person named '%s' exists/ \n", buf);

  else

    printf("%s\n", numbers[index]);

  }

}

  • search()

int search(char *name) {

  int i;

  for (i=0; i<n; i++)

    if (strcmp(name, names[i])==0) {

      return i;

   }

   return -1;

}

find 함수에서 호출해서 해당 이름의 사람이 어느 위치에 있는지 인덱스를 반환한다.

 

  • status()

void status() {

  int i;

  for (i=0; i<n; i++)

      printf("%s %s\n", names[i], numbers[i]);

  printf("Total %d persons. \n", n);  

}

 

전화번호부에 있는 이름, 전화번호 그리고 총 몇 명이 있는지 반환한다.