자료구조: 연결리스트(Linked List) 예제문제

ROK·2022년 10월 6일
0

열혈 자료구조

목록 보기
5/30

연결리스트 예제문제


리스트 자료구조 ADT

  • NameCard MakeNameCard(const char name, cosnt char * phone);
    • NameCard 구조체 변수 동적할당, 초기화, 주소 값 반환
  • void ShowNameCardInfo(NameCard * pcard);
    • NameCard 구조체 변수 정보 출력
  • int NameCompare(NameCard pcard, const char name);
    • 이름이 같으면 0, 다르면 0이 아닌 값 return
  • void ChangePhoneNum(NameCard pcard, const char phone);
    • 전화번호 정보 변경

헤더파일 NameCard.h

#ifndef __NameCard_H__
#define __NameCard_H__

#define NAME_LEN 30
#define PHONE_LEN 30

typedef struct __namecard
{
   char name[NAME_LEN];
   char phone[PHONE_LEN];
} NameCard;

// NameCard 구조체 변수의 동적 할당 및 초기화 후 주소 값 반환
NameCard *MakeNameCard(const char *name, const char *phone);

// NameCard 구조체 변수의 정보 출력
void ShowNameCardInfo(NameCard *pcard);

// 이름이 같으면 0, 다르면 0이 아닌 값 반환
int NameCompare(NameCard *pcard, const char *name);

// 전화번호 정보 변경
void ChangePhoneNum(NameCard *pcard, const char *phone);

#endif

소스파일 NameCard.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "NameCard.h"

NameCard *MakeNameCard(const char *name, const char *phone)
{
   NameCard *pcard = (NameCard *)malloc(sizeof(NameCard));
   // 아래 주석처리 된 코드는 에러 발생
   // *pcard->name = &name;
   // *pcard->phone = &phone;
   strcpy(pcard->name, name);
   strcpy(pcard->phone, phone);

   return pcard;
}

void ShowNameCardInfo(NameCard *pcard)
{
   printf("이름 : %s \n", pcard->name);
   printf("번호 : %s \n", pcard->phone);
}

int NameCompare(NameCard *pcard, const char *name)
{
   // 아래 주석처리 된 코드는 에러는 발생하지 않지만 제대로 동작하지 않음
   // if (pcard->name == name)
   // {
   //    return 0;
   // }
   // else
   // {
   //    return -1;
   // }
   return strcmp(pcard->name, name);
}

void ChangePhoneNum(NameCard *pcard, const char *phone)
{
   strcpy(pcard->phone, phone);
}

위 소스파일에서 주석처리된 부분은 처음에 작성했었던 코드
저대로 실행하면 제대로 동작하지 않음

메인파일 NameCardMain.c

#include <stdio.h>
#include <stdlib.h>
#include "NameCard.h"
#include "ArrayList.h"

int main()
{
   List list;
   NameCard *pcard;
   ListInit(&list);

   pcard = MakeNameCard("짱구", "010-1111-1111");
   LInsert(&list, pcard);

   pcard = MakeNameCard("맹구", "010-2222-2222");
   LInsert(&list, pcard);

   pcard = MakeNameCard("철수", "010-3333-3333");
   LInsert(&list, pcard);

   printf("현재 데이터 수 : %d \n\n", LCount(&list));
   printf("전체 데이터 \n");
   if (LFirst(&list, &pcard))
   {
      ShowNameCardInfo(pcard);

      while (LNext(&list, &pcard))
      {
         ShowNameCardInfo(pcard);
      }
   }
   printf("\n\n");

   // 특정 이름 대상으로 탐색 진행, 그 사람의 정보 출력
   // 짱구 탐색, 정보 출력
   if (LFirst(&list, &pcard))
   {
      if (NameCompare(pcard, "짱구") == 0)
      {
         ShowNameCardInfo(pcard);
      }
      else
      {
         while (LNext(&list, &pcard))
         {
            if (NameCompare(pcard, "짱구") == 0)
            {
               ShowNameCardInfo(pcard);
               break;
            }
         }
      }
   }
   printf("\n");

   // 특정 이름 대상으로 탐색 진행, 그 사람의 전화번호 정보 변경
   // 맹구 탐색, 맹구 전화번호 "010-7777-7777"로 변경
   if (LFirst(&list, &pcard))
   {
      if (NameCompare(pcard, "맹구") == 0)
      {
         ChangePhoneNum(pcard, "010-7777-7777");
         ShowNameCardInfo(pcard);
      }

      while (LNext(&list, &pcard))
      {
         if (NameCompare(pcard, "맹구") == 0)
         {
            ChangePhoneNum(pcard, "010-7777-7777");
            ShowNameCardInfo(pcard);
         }
      }
   }
   printf("\n");

   // 특정 이름 대상으로 탐색 진행, 그 사람의 정보 삭제 
   // 철수 탐색, 철수 삭제 
   if (LFirst(&list, &pcard))
   {
      if (NameCompare(pcard, "철수") == 0)
      {
         pcard = LRemove(&list);
         free(pcard);
      }
      else
      {
         while (LNext(&list, &pcard))
         {
            if (NameCompare(pcard, "철수") == 0)
            {
               pcard = LRemove(&list);
               free(pcard);
            }
         }
      }
   }
   printf("\n");

   printf("현재 데이터 수 : %d \n", LCount(&list));
   printf("모든 데이터 출력 \n");

   if (LFirst(&list, &pcard))
   {
      ShowNameCardInfo(pcard);

      while (LNext(&list, &pcard))
      {
         ShowNameCardInfo(pcard);
      }
   }
   printf("\n\n");

   return 0;
}

결과

현재 데이터 수 : 3 

전체 데이터 
이름 : 짱구
번호 : 010-1111-1111
이름 : 맹구
번호 : 010-2222-2222
이름 : 철수
번호 : 010-3333-3333


이름 : 짱구
번호 : 010-1111-1111

이름 : 맹구
번호 : 010-7777-7777


현재 데이터 수 : 2
모든 데이터 출력
이름 : 짱구
번호 : 010-1111-1111
이름 : 맹구
번호 : 010-7777-7777
profile
하루에 집중하자

0개의 댓글