태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

티스토리 툴바



2009/05/15 20:18

도서관리 연결리스트


<eha.h>
#ifndef
 _EHA_H_
#define _EHA_H_

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>


#define
 M_Number 0x77ff2288

#pragma pack(1)

typedef int CSize_t;
typedef int MNum_t;
typedef struct _Node
{
  int iNum; 
  char cName[10];
  char cPhone[14];
  struct _Node *next;  //4byte
} Node; //32byte

typedef struct _EHAH
{
  CSize_t iCnt;
  MNum_t iMagic;
} EHAH;

#pragma pack()

#endif

<book_link.c>
#include
 "eha.h"

void link_free(Node *Head);
void link_print(Node *Head);

Node* LinkInsert(Node *Head, Node *NewNode);
Node* New_Create(Node *New);

void link_write(Node* Head);
void link_read(Node* Head, Node *New);

int main()
{
  int ip=0;
  int i=0;
  int iFd;
  int iRet;
  
  Node *Head = 0;  //struct _EHA *Head = 0
  Node *New = 0;   
  Node temp;
  
  while(1){
    printf("1.Sort_Insert 2.write 3.read 4.print 0.exit: ");
    scanf("%d"&ip);
    fflush(stdin);
    switch(ip){
      case 1:
        New = New_Create(New);
        Head = LinkInsert(Head, New);
        break;
      case 2:
        link_write(Head);
        break;
      case 3:
        link_read(Head,New);
        break;
      case 4:
        link_print(Head);
        break;        
      case 0:
        link_free(Head);
        printf("종료합니다");
        printf("-----------------------\n");
        return 0;
      default :
        printf("error\n");
    }
  }
  return 0;
}
void link_write(Node* Head)
{
  int iFd;
  int iRet;
  
  iFd = open("Node.DBF", O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IXUSR|S_IROTH|S_IWOTH|S_IXOTH);
  
  while(NULL != Head)
  {
    iRet = write(iFd, Head, sizeof(Node));
    Head = Head->next;
  }
  printf("쓰기 실행\n");
  printf("-----------------------\n");
  close(iFd);
  return;
}
void link_read(Node *Head, Node *New)
{
  int iFd;
  int iRet;
  
  Node temp;
  
  iFd = open("Node.DBF", O_RDWR);
  Head = 0;  //struct _EHA *Head = 0

  while(1){
    //읽기
    iRet = read(iFd, &temp, sizeof(Node));  //읽어들인 데이터를 temp구조체에 저장
    if(iRet == 0)
    {
      break;
    }
    if(sizeof(Node) != iRet)  //read로 반환된 크기iRet와 Node의 크기와 일치하는지 검사
    {
      printf("read error!\n");
      link_free(Head); //혹시나하는 동적할당을 지움
      close(iFd);
      return;
    }
    temp.next=0;
    New = (Node*)malloc(sizeof(Node));  //동적할당
    *(New) = temp;  //read에서 읽어온 temp를 New의 주소에있는 값에 넣음
    Head = LinkInsert(Head, New);
  }
  close(iFd);
  printf("읽기 실행\n");
  printf("-----------------------\n");
  link_print(Head);
  return;
}

// 잘짜진 삽입정렬 
Node* LinkInsert(Node *Head, Node *NewNode)
{
  Node *Current;
  Node *Follow;

  Current = Follow = Head;
  
  while((NULL != Current) && (Current->iNum < NewNode->iNum))
  {
    Follow = Current;
    Current = Current->next;
  }
  NewNode->next = Current;

  if(Current == Head)
  {
    Head = NewNode;
  }
  else
  {
    Follow->next = NewNode;
  }
  return Head;
}

//새로운 동적할당
Node* New_Create(Node *New)
{
  New = (Node*)malloc(sizeof(Node));
  printf("번호를 입력하세요.\n");
  scanf("%d"&New->iNum);
  printf("이름을 입력하세요.\n");
  scanf("%s"&New->cName);
  printf("폰번호를 입력하세요.\n");
  scanf("%s"&New->cPhone);
  New->next = NULL;
  return New;
}

//연결해제
void link_free(Node *Head){
  Node *Temp;
  for(Temp = Head; NULL != Head; Temp = Head)
  {
    Head = Head->next; //이동
    free(Temp);    // 제거
  }
}

//출력
void link_print(Node *Head)
{    
  Node *Temp;
  for(Temp=Head; Temp != NULL; Temp = Temp->next){ 
    printf("번호:%d\n", Temp->iNum);
    printf("이름:%s\n", Temp->cName);
    printf("폰번호:%s\n", Temp->cPhone);
    printf("------------------------\n");
  }
}


 

'시스템 프로그래밍 > Linux' 카테고리의 다른 글

도서관리 연결리스트  (0) 2009/05/15
연결리스트  (0) 2009/05/12
유용한 vi 명령어  (0) 2009/05/08
Linux 압축명령 tar 및 ftp 명령어  (0) 2009/05/08
VMware 브릿지모드 네트웍 설정  (0) 2009/04/29
Vmware Workstation v5.5.1  (0) 2009/04/27
Trackback 0 Comment 0