//common.h #pragma once //헤더 파일을 한 번만 포함해서 컴파일 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <malloc.h> #include <memory.h> #include <time.h> #pragma warning(disable:4996) //4996컴파일 경고 메시지 출력 해제
//Book.h #pragma once #include "common.h" #define MAX_TIT_LEN 200 #define MAX_AUT_LEN 20 typedef struct _Book Book; struct _Book { char title[MAX_TIT_LEN+1]; char author[MAX_AUT_LEN+1]; int num; }; Book *New_Book(const char *title,const char *author,int num); void Delete_Book(Book *book); void Book_View(Book *book); int Book_CompareTitle(Book *book,const char *title); int Book_CompareAuthor(Book *book,const char *author); int Book_CompareNum(Book *book,int num);
//Book.c #include "Book.h" void Book_Book(Book *book,const char *title,const char *author,int num); Book *New_Book(const char *title,const char *author,int num) { Book *book = 0; book = (Book *)malloc(sizeof(Book)); Book_Book(book,title,author,num); return book; } void Book_Book(Book *book,const char *title,const char *author,int num) { memset(book,0,sizeof(Book)); strncpy(book->title,title,MAX_TIT_LEN); strncpy(book->author,author,MAX_AUT_LEN); book->num = num; } void Delete_Book(Book *book) { free(book); } void Book_View(Book *book) { printf("<%010d>:<%s>\n",book->num,book->title); printf("\t 저자:%s\n",book->author); } int Book_CompareTitle(Book *book,const char *title) { return strcmp(book->title,title); } int Book_CompareAuthor(Book *book,const char *author) { return strcmp(book->author,author); } int Book_CompareNum(Book *book,int num) { return book->num-num; }
//LinkedList.h #pragma once typedef void * Element; typedef struct _Node Node; typedef Node *Link; struct _Node { Link next; Link prev; Element data; }; typedef struct _LinkedList LinkedList; struct _LinkedList { Link head; Link tail; int usage; }; LinkedList *New_LinkedList(); void Delete_LinkedList(LinkedList *linkedlist); void LinkedList_PushBack(LinkedList *linkedlist,Element data); void LinkedList_Insert(LinkedList *linkedlist,Link pos,Element data); Link LinkedList_Begin(LinkedList *linkedlist); Link LinkedList_End(LinkedList *linkedlist); void LinkedList_Erase(LinkedList *linkedlist,Link pos);
//LinkedList.c #include "LinkedList.h" #include <malloc.h> #include <memory.h> Link New_Node(Element data) { Link link = (Link)malloc(sizeof(Node)); link->data = data; link->next = link->prev = 0; return link; } void HangNode(Link now,Link pos) { now->prev = pos->prev; now->next = pos; pos->prev->next = now; pos->prev = now; } void DisconnectNode(Link pos) { pos->prev->next = pos->next; pos->next->prev = pos->prev; } LinkedList *New_LinkedList() { LinkedList *linkedlist = 0; linkedlist = (LinkedList *)malloc(sizeof(LinkedList)); linkedlist->head = New_Node(0); linkedlist->tail = New_Node(0); linkedlist->head->next = linkedlist->tail; linkedlist->tail->prev = linkedlist->head; linkedlist->usage = 0; return linkedlist; } void Delete_LinkedList(LinkedList *linkedlist) { Link seek = linkedlist->head; while( seek != linkedlist->tail) { seek = seek->next; free(seek->prev); } free(linkedlist->tail); free(linkedlist); } void LinkedList_PushBack(LinkedList *linkedlist,Element data) { LinkedList_Insert(linkedlist,linkedlist->tail,data); } void LinkedList_Insert(LinkedList *linkedlist,Link pos,Element data) { Link link = New_Node(data); HangNode(link,pos); linkedlist->usage++; } Link LinkedList_Begin(LinkedList *linkedlist) { return linkedlist->head->next; } Link LinkedList_End(LinkedList *linkedlist) { return linkedlist->tail; } void LinkedList_Erase(LinkedList *linkedlist,Link pos) { DisconnectNode(pos); free(pos); linkedlist->usage--; }
//Program.c #include "LinkedList.h" #include "Book.h" void View_LinkedList(LinkedList *linkedlist) { Book *book = 0; Link seek = LinkedList_Begin(linkedlist); Link end = LinkedList_End(linkedlist); printf("-----보유 도서 목록-----\n"); for( ;seek!=end;seek = seek->next) { book = (Book *)(seek->data); if(book) { Book_View(book); } } } void SimulEnd(LinkedList *linkedlist) { Book *book = 0; Link seek = LinkedList_Begin(linkedlist); Link end = LinkedList_End(linkedlist); for( ;seek!=end;seek=seek->next) { book = (Book *)(seek->data); if(book) { Delete_Book(book); } } Delete_LinkedList(linkedlist); } void Simul_Find(LinkedList *linkedlist,const char *title) { Book *book = 0; Link seek = LinkedList_Begin(linkedlist); Link end = LinkedList_End(linkedlist); for( ;seek!=end;seek=seek->next) { book = (Book *)(seek->data); if(book && (Book_CompareTitle(book,title)==0)) { printf("검색 결과:"); Book_View(book); return; } } printf("<%s> 책을 찾을 수 없습니다.\n",title); } void Simul_Remove(LinkedList *linkedlist,const char *title) { Book *book = 0; Link seek = LinkedList_Begin(linkedlist); Link end = LinkedList_End(linkedlist); for( ;seek!=end;seek=seek->next) { book = (Book *)(seek->data); if(book && (Book_CompareTitle(book,title)==0)) { LinkedList_Erase(linkedlist,seek); Delete_Book(book); printf("삭제 성공!\n"); return; } } printf("<%s> 책을 찾을 수 없습니다.\n",title); } void Simul_Seq() { LinkedList *linkedlist = New_LinkedList(); LinkedList_PushBack(linkedlist,New_Book("C언어","홍길동",10)); LinkedList_PushBack(linkedlist,New_Book("C++언어","강감찬",20)); LinkedList_PushBack(linkedlist,New_Book("자료구조","김구",5)); LinkedList_PushBack(linkedlist,New_Book("알고리즘","이순신",9)); LinkedList_PushBack(linkedlist,New_Book("디자인패턴","정약용",13)); View_LinkedList(linkedlist); Simul_Find(linkedlist,"C언어"); Simul_Find(linkedlist,"이데아이론"); Simul_Remove(linkedlist,"자료구조"); View_LinkedList(linkedlist); SimulEnd(linkedlist); } void Simul_OrderAdd(LinkedList *linkedlist,Book *book) { Book *stored_book = 0; Link seek = LinkedList_Begin(linkedlist); Link end = LinkedList_End(linkedlist); for( ;seek!=end;seek=seek->next) { stored_book = (Book *)(seek->next); if(stored_book && (Book_CompareAuthor(stored_book,book->author)>=0)) { break; } } LinkedList_Insert(linkedlist,seek,book); } void Simul_Order() { LinkedList *linkedlist = New_LinkedList(); Simul_OrderAdd(linkedlist,New_Book("C언어","홍길동",10)); Simul_OrderAdd(linkedlist,New_Book("C++언어","강감찬",20)); Simul_OrderAdd(linkedlist,New_Book("자료구조","김구",5)); Simul_OrderAdd(linkedlist,New_Book("알고리즘","이순신",9)); Simul_OrderAdd(linkedlist,New_Book("디자인패턴","정약용",13)); View_LinkedList(linkedlist); Simul_Find(linkedlist,"C언어"); Simul_Find(linkedlist,"이데아이론"); Simul_Remove(linkedlist,"자료구조"); View_LinkedList(linkedlist); SimulEnd(linkedlist); } int main() { Simul_Seq(); Simul_Order(); return 0; }