C++프로그래밍

2013.04.26_정렬된 연결리스트의 삽입과삭제

성엽이 2013. 4. 26. 17:01

▶ 10_7 예제

#include < stdio.h >
#include < process.h >
#include < stdlib.h >

typedef struct node
{
  char data;
  struct node *next;
}NODE;

NODE *insert( char item, NODE *list);
NODE *append( NODE *list, NODE *temp);
NODE *deletef( char item, NODE *list);
void print_list(NODE *head);

int main()
{
  FILE *fp;
  NODE *temp = NULL;
  NODE *list = NULL;
  char ch;


  if( (fp = fopen("d10-7.txt","r")) == NULL )  
  {
    printf("파일을 열수없습니다!");
    exit(-1);
  }

  // 데이타 파일을 읽고 연결리스트를 생성
  fscanf(fp, "%c"&ch);
    
  while0 == feof(fp) )
  {
    temp = (NODE *)malloc(sizeof(NODE));
    temp->data = ch;
    temp->next = NULL;
    list = append(list, temp);
    fscanf(fp, "%c"&ch);
  }
  fclose(fp);

  // 데이터 파일로부터 생성된 연결리스트의 출력
  print_list(list);
  printf("\n");

  list = insert('c',list);
  list = insert('h',list);
  list = insert('m',list);    
  
  // 결과 연결리스트의 출력
  print_list(list);
  printf("\n");
  
  list = deletef('f',list);
  list = deletef('e',list);
  list = deletef('k',list);
  list = deletef('m',list);

  print_list(list);
  printf("\n");  

  return 0;
}

NODE *append( NODE *list, NODE *temp)
{
  NODE *current = list;
  
  if(list == NULL )
  {
    list = temp;
  }
  else
  {
    while(current->next != NULL)
    {
      current = current->next;
    }
    current->next = temp;
  }
  return(list);
}

void print_list(NODE *head)
{
  if( head == NULL )
  {
    printf("NULL");
  }
  else
  {
    printf("%c==>",head->data);
    print_list(head->next);
  }  
}

NODE *insert( char item, NODE *list )
{
  NODE *current;
  NODE *follow;
  NODE *newnode = NULL;
  current = follow = list;
  
  // 새로운 노드의 생성
  if(( newnode = (NODE *)malloc(sizeof(NODE))) == NULL )
  {
    printf("메모리 생성이 안됨\n");
    return NULL;
  }
  newnode->data = item;
  
  // 삽입 위치로 이동
  while((current != NULL) && ( current->data < item))   // current != NULL '연결리스트 끝까지 갔는가'
  {                                                     // current->data < item '삽입할 위치를 찾아서'
    follow = current;         // current 를 따라가는 연결리스트
    current = current->next;  // 다음 노드로 이동하는 연결리스트
  }

  // 삽입
  newnode->next = current;
  
  if(current == list)  // 연결리스트의 제일 앞부분
  {
    list = newnode;
  }
  else      // 제일 앞이 아닌 경우, 중간이나 끝부분
  {
    follow->next = newnode;
  }
  return list;
}

NODE *deletef( char item, NODE *list )
{
  NODE *current;
  NODE *follow;
  NODE *newnode;
  
  current = follow = list;
  while((current != NULL) && (current->data != item))
  {
    follow = current;
    current = current->next;
  }
  
  if(current == NULL )
  {
    printf("항목을 찾지 못하였습니다..\n");
    return list;
  }
  if(list == current)
  {
    list = current->next;
  }
  else if( current->next == NULL )
  {
    follow->next = NULL;
  }
  else
  {
    follow->next = current->next;
  }
  free(current);
  return list;
}