LinkedList 자료
Computer_IT/C++2006. 4. 6. 20:18
반응형
[CODE type="c"]
[/HTML][/CODE]
#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 |