본문 바로가기
코스웨어/15년 스마트컨트롤러

연결리스트 코드(재업)

by 알 수 없는 사용자 2015. 5. 19.
728x90
반응형

#include <stdio.h>
#include <fcntl.h>
#define FILEDB book.db

#pragma pack(1)

typedef struct _book
{  
  char title[30];
  char author[15];
  char publisher[10];
  char price[10];
  char year[5];
  struct _book * Next;

}book;

#pragma pack(4)

void menu(void);
int input(void);
void book_print(book *);
void book_free(book * head);
void book_init(book * ); 
void book_insert(&Head, book*);
void book_save(book *);
void book_make_node(book **);

int main(void)
{
  book * stTemp;

  
  return 0;
}

void menu(void)
{
  printf("   ================== MENU ==================\n");
  printf("   I    1. Insert        I\n");
  printf("   I    2. List          I\n");
  printf("   I    3. Quit          I\n");
  printf("   ------------------------------------------\n");

  return;
}

int input(void)
{
  int iput;

  printf("번호를 입력하세요.(1 - 3까지)\n");
  scanf("%d"&iput);
  
  while(1 > iput || 3 < iput)
  {
    printf("잘못 입력하셨습니다. 다시 입력하세요.\n");
    scanf("%d"&iput);
  }    



  return iput;

}

void book_insert(book **stHead, book *stTemp)      // 동적 할당을 insert함수에서 받지 않게 만들자.       
{
    book *stSeeker;
    book *stHelp;
    
    if(stHead == 0)
    {
        printf("Error: No Linked List\n");
        return;
    }

    if(stTemp == 0)
    {
        printf("Error: New Node Empty\n");
        return;
    }

    stSeeker = stHelp = *stHead;           //2개 이상의 대입 연산자:가장 우측 값이 왼쪽에 있는 값에 대입된다.

    while(0 != stSeeker)                   //삽입할 위치를 찾는 코드// 
    {
  
        if(0 > strcmp(stTemp->title, stSeeker->title))    //삽입할 위치를 찾았을 경우( <:우측으로 가면 커짐, >:반대)
        {
            break;
        }
  
        stHelp = stSeeker;                  //stHelp와 stSeeker를 같은 자리로 이동
        stSeeker = stSeeker -> Next;      //stSeeker를 다음 동적할당 자리로 이동 
    }

    if((*stHead == 0&& (stHelp == 0))      //동적 할당을 머리에 삽입
    {
        *stHead = stTemp;
    }
    else if(stSeeker == stHelp)             //중간과 끝 삽입
    {
        stTemp->Next = stSeeker;
        *stHead = stTemp;
    }
    else
    {
        stTemp->Next = stSeeker;
        stHelp->Next = stTemp;
    }    




void book_print(book * temp)    // 연결리스트 출력 함수
{
    while(temp!=0)
    {

        printf("책이름  :[%s]\n", temp->title);
        printf("저자  :[%s]\n", temp->author);
        printf("출판사  :[%s]\n", temp->publisher);
        printf("가격  :[%s]\n", temp->price);
        printf("출판년도:[%s]\n", temp->year);
  printf("============================\n");
  
        temp=temp->Next;
    }
    if(temp == 0)
        printf("출력이 완료 되었습니다.\n");

}

void book_init(book * stTemp)   //자료 값을 입력받는 함수
{
   int iRet;

    if(stTemp == 0)
        return;
    
    printf("도서명을 입력하세요.");
    iRet = read(0&stTemp->title, sizeof(stTemp->title));
    stTemp->title[iRet-1= 0;

    printf("저자명을 입력하세요.");
    iRet = read(0&stTemp->author, sizeof(stTemp->author));
    stTemp->author[iRet-1= 0;

    printf("출판사명을 입력하세요.");
    iRet = read(0&stTemp->publisher, sizeof(stTemp->publisher));
    stTemp->publisher[iRet-1= 0;

    printf("가격을 입력하세요.");
    iRet = read(0&stTemp->price, sizeof(stTemp->price));
    stTemp->price[iRet-1= 0;

    printf("출판년도를 입력하세요.");
    iRet = read(0&stTemp->year, sizeof(stTemp->year));
    stTemp->year[iRet-1= 0;
        
    stTemp->Next = 0;
}

void book_free(book * head)     // 동적 할당 메모리 반환 함수
{
    book * temp;

    while(head!=0)
    {
        temp = head->Next;
        free(head);
        head = temp;
    }

}

void book_save(book * stTemp)
{
  int ifd;    
  
  
  if(stTemp == 0)
  {
    printf("ERROR: NO LINKED LIST\n");
    return ;
  }
    
  ifd = open("FILEDB", O_CREAT|O_RDWR|O_TRUNC|O_BINARY, "b");
  
  if(0 > ifd)
  {
    printf("ERROR: OPEN FAILED\n");
    return;
  }

  while(stTemp != 0)
  {
    write(ifd, stTemp, sizeof(book));
    stTemp = stTemp -> Next;
  }
  
  close(ifd);

  printf("LIST SAVED\n");
    
  return;
}

void book_load(book **stTemp)
{
  int ifd;    
  
  
  if(stTemp == 0)
  {
    printf("ERROR: NO LINKED LIST\n");
    return ;
  }
    
  ifd = open("FILEDB", O_CREAT|O_RDWR|O_TRUNC|O_BINARY, "b");
  
  if(0 > ifd)
  {
    printf("ERROR: OPEN FAILED\n");
    return;
  }

  //while()
  //
    
    
    
  //}
  
  close(ifd);

  printf("LOAD COMPLETED\n");
    
  return;
}

void book_make_node(book **)
{
      *stTemp = (void *)malloc(sizeof(book));          //동적 할당

  if(stTemp == 0)          
      {
          printf("Error: No Memory Available\n");
          return;
      }

  book_init(stTemp);
  
  return;

}


728x90