|
<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");
}
}
|