#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 노드 구조체의 포인터 pnode
typedef struct node *pnode;
// 정수 data 다음 구조체 포인터 next
typedef struct node {
int data;
pnode next;
} node;
typedef struct linkedList *plist;
typedef struct linkedList {
pnode head;
pnode tail;
} linkedList;
// 새노드를 만들고 포인터를 NULL로 초기화 시킨다.
pnode makeNode(int);
// 정수를 입력받아 삽입한다.
// 노드들은 입력받은 순서대로 되어있다.
void insertNode(plist, int);
// 노드들을 출력해 준다.
void showList(plist);
// 모든 노드들을 삭제한다.
void quitNode(plist);
int main() {
// 연결 리스트 list
plist list;
// 메뉴선택을 위한 변수, 7을 입력하면 종료한다.
int menu=1, data;
// 리스트를 초기화한다. 더미 노드를 한개 만들어서 head와 tail이 이 노드를 가리키게 한다.
// 이렇게 해서 항상 실제로 가리키기를 원하는 노드 보다 앞의 노드를 가지고 찾아다니면
// 어떤 위치에서든디 삽입과 삭제를 할 수 있다.
// 또 이중 포이터를 사용해야하는 번거러움을 피할 수가 있다.
// head는 리스트의 시작하는 노드(항상 더미노드)를 가리킨다.
// tail은 리스트의 맨 마지막 노드를 가리킨다. 처음에는 더미노드를 가리키다가,
// 실제로 노드가 삽입되면 가장 나중에 삽입된 노드를 가리키게 된다.
// tail 을 이용해서 우리는 새로 삽입되는 노드를 가장 뒤에 바로 삽일할 수 있다.
list=(plist)malloc(sizeof(linkedList));
list->head=makeNode(0);
list->tail=list->head;
// 메뉴를 보여주고 선택을 입력 받는다.
while(menu!=3) {
puts("*************");
puts("* 1. 입력: "); \
puts("* 2. 출력:");
puts("* 3. 끝내기");
puts("*************");
printf("선택=");
scanf("%d", &menu);
fflush(stdin);
switch(menu) {
case 1:
// 삽입
printf("data: ");
scanf("%d", &data);
insertNode(list, data);
break;
case 2:
// 전체출력
showList(list);
break;
case 4:
// 종료
quitNode(list);
break;
}
}
// 마지막으로 list를 free시킨다.
free(list);
return 0;
}
// 새노드를 만든다.
pnode makeNode(int n) {
pnode p;
p=(pnode)malloc(sizeof(node));
p->data=n;
p->next=NULL;
return p;
}
// 넘어온 data로 만든 새노드를 삽입한다.
void insertNode(plist list, int data) {
pnode t=list->head;
pnode newnode = makeNode(data);
list->tail->next=newnode;
list->tail=newnode;
}
// 전체 리스트를 출력한다.
void showList(plist list) {
pnode t = list->head;
while(t->next) {
printf("%d ", t->next->data);
t = t->next;
}
printf("\n");
}
// 리스트의 모든 노드를 삭제한다.
void quitNode(plist list) {
pnode t=list->head;
pnode temp;
while(t->next) {
temp = t->next;
t=t->next;
free(temp);
}
free(list->head);
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
유사완전수,괴짜수 (0) | 2013.12.01 |
---|---|
힙정렬 (0) | 2013.11.11 |
n보다 작은 소수 출력하기 (0) | 2013.10.26 |
infix to postfix and eval (중위표현을 후위표현으로 바꾸고 값 구하기) (0) | 2013.10.26 |
파일 expand (0) | 2013.10.25 |