Memory Drive

Linked list +1
반응형
[CODE type="c"]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_NAME "d:\\student.dat"
FILE * fpStd;
typedef struct node NODE;
struct node {
NODE * flink;
NODE * blink;
char id[12];
char name[30];
};
typedef struct anchor ANCHOR;
struct anchor {
NODE * flink;
NODE * blink;
};
ANCHOR anc;
NODE * makeNode(char * id, char * name);
NODE * makeEmptyNode();
void printData(void);
char showMenu();
void enqAft(NODE * newNode, NODE * oldNode);
void enqBef(NODE * newNode, NODE * oldNode);
NODE * findNode(char * id);
void delNode(NODE * node);
int getListSize(void);
void writeFile(void);
void readFile();
void clearList(void);
int main(void) {
 // 1. anchor가 자신의 주소를 가르키게 함
anc.flink = (NODE *) &anc;
anc.blink = (NODE *) &anc;
 char choice;
char input[80];
NODE * newNode;
NODE * tempNode;
char id[12];
char name[30];
 choice = showMenu();
 while (choice != '0') {
  if (choice == '1') {
 
  printf("학생의 정보를 입력하세요 (아이디 이름) : ");
  gets(input); // aaa 홍길동
  sscanf(input, "%s %s", id, name);
  newNode = makeNode(id, name);
   tempNode = findNode(id);
  if (tempNode == NULL) {
   enqBef(newNode, (NODE *)&anc);
  } else {
   printf("%s 아이디는 존재합니다. \n", id);
  }
  } else if (choice == '2') {
   printf("찾으려는 학생의 아이디를 입력하세요 : ");
  gets(input); // aaa 홍길동
  sscanf(input, "%s", id);
   newNode = findNode(id);
   if (newNode == NULL) {
   printf("%s 아이디는 존재하지 않습니다. \n", id);
  } else {
   printf("학생의 정보를 입력하세요 (이름) : ");
   gets(input); // aaa 홍길동
   sscanf(input, "%s", newNode->name);    
  }

 } else if (choice == '3') {
  printf("찾으려는 학생의 아이디를 입력하세요 : ");
  gets(input); // aaa 홍길동
  sscanf(input, "%s", id);
   newNode = findNode(id);
   if (newNode == NULL) {
   printf("%s 아이디는 존재하지 않습니다. \n", id);
  } else {
   delNode(newNode);
  }
  } else if (choice == '4') {
   printf("찾으려는 학생의 아이디를 입력하세요 : ");
  gets(input); // aaa 홍길동
  sscanf(input, "%s", id);
   newNode = findNode(id);
   if (newNode == NULL) {
   printf("%s 아이디는 존재하지 않습니다. \n", id);
  } else {
   printf("찾을 학생 %s의 정보 : %s, %s\n", id, newNode->id, newNode->name);
  }

 } else if (choice == '5') {
   printData();
  } else if (choice == '6') {
   printf("총 학생의 수 : %d명 입니다.\n", getListSize());
  } else if (choice == '7') {
   writeFile();
  } else if (choice == '8') {
   readFile();
  } else if (choice == '9') {
   clearList();
  } else {
 }
 
 printf("\n<계속 진행하려면 엔터를 치세요 >\n");
 gets(input);
 
 system("cls");
 choice = showMenu();  
}
 return 0;
}
NODE * makeNode(char *id, char *name) {
NODE * newNode = (NODE *) malloc(sizeof(NODE));
strcpy(newNode->id, id);
strcpy(newNode->name, name);
return newNode;
}
NODE * makeEmptyNode() {
NODE * newNode = (NODE *) malloc(sizeof(NODE));
return newNode;
}
void enqAft(NODE * newNode, NODE * oldNode) {
newNode->flink = oldNode->flink;
newNode->blink = oldNode;
 oldNode->flink->blink = newNode;
oldNode->flink = newNode;
}
void enqBef(NODE * newNode, NODE * oldNode) {
newNode->flink = oldNode;
newNode->blink = oldNode->blink;
 oldNode->blink->flink = newNode;
oldNode->blink = newNode;
}
NODE * findNode(char * id) {
NODE * curNode = anc.flink;
NODE * findNode = NULL;
 while(curNode != (NODE *) &anc) {
 if (strcmp(curNode->id, id) == 0) {
  findNode = curNode;
 }
 curNode = curNode->flink;
}
 return findNode;
}
void delNode(NODE * node) {
 node->blink->flink = node->flink;
node->flink->blink = node->blink;
 free(node);
}
int getListSize() {
NODE * curNode = anc.flink;
int count = 0;
 while(curNode != (NODE *) &anc) {
 count++;
 curNode = curNode->flink;
}
 return count;
}

void printData(void) {
NODE * curNode = anc.flink;
 while(curNode != (NODE *) &anc) {
 printf("학생의 아이디 : %s, 이름 : %s.\n", curNode->id, curNode->name);
 curNode = curNode->flink;
}
}
void clearList() {
NODE * curNode = anc.flink;
NODE * tempNode = NULL;
 while(curNode != (NODE *) &anc) {
 tempNode = curNode->flink;
 delNode(curNode);
 curNode = tempNode;
}
}

void readFile() {
fpStd = fopen(FILE_NAME, "r");
 if (fpStd == NULL) {
 printf("파일 열기에 실패함.\n");
} else {
  clearList();
  NODE * newNode = makeEmptyNode();
 while (fread(newNode, sizeof(NODE), 1, fpStd) > 0) {
  enqBef(newNode, (NODE *) &anc);
  newNode = makeEmptyNode();
 }
  fclose(fpStd);
}
}
void writeFile() {
fpStd = fopen(FILE_NAME, "w");
 if (fpStd == NULL) {
 printf("파일 열기에 실패함.\n");
} else {
  NODE * curNode = anc.flink;
  while(curNode != (NODE *) &anc) {
  fwrite(curNode, sizeof(NODE), 1, fpStd);
  curNode = curNode->flink;
 }
  fclose(fpStd);
}
}
char showMenu() {
char choice, dummy;
 printf("************************************\n");
printf("* 1. 학생 추가                      \n");
printf("* 2. 학생 수정                      \n");
printf("* 3. 학생 삭제                      \n");
printf("* 4. 학생 찾기                      \n");
printf("* --------------------------------- \n");
printf("* 5. 학생 목록                      \n");
printf("* 6. 학생 수 출력                   \n");
printf("* --------------------------------- \n");
printf("* 7. 파일 저장                      \n");
printf("* 8. 파일 읽기                      \n");
printf("* --------------------------------- \n");
printf("* 9. 모두 지우기                    \n");
printf("* --------------------------------- \n");
printf("* 0. 종료                           \n");
printf("************************************\n");
printf(">> ");
 scanf("%c%c", &choice, &dummy);
 return choice;
}

[/HTML][/CODE]
반응형

'Computer_IT > C++' 카테고리의 다른 글

Example Program: A Simple Query  (0) 2006.08.07
Const Member변수 초기화 특성  (0) 2006.04.24
VC++ 단축키 모음  (2) 2006.03.19
Console - 바둑소스  (0) 2006.02.22
Console Codepage 설정.  (0) 2006.02.15