<list.c>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include "list.h"
int select1(void);
List yong; // List 선언 ( head와 tail 을 가지고 있다 list.h 참조)
int main()
{
printf("nn리스트를 이용한 회원관리n");
printf("2005.12.1 made by 용학,영훈n");
{
printf("nn리스트를 이용한 회원관리n");
printf("2005.12.1 made by 용학,영훈n");
list_init(&yong); // List 초기화 시킴
select1(); // 메뉴함수시작
return 0;
}
int select1(void)
{
int input;
{
int input;
while(1) // 특별한 입력이 올때까지 무한루프돌림, 메뉴를 계속 디스플레이 해줌
{
printf("----------------------n");
printf(" 1 -> initn");
printf(" 2 -> insertn");
printf(" 3 -> removen");
printf(" 4 -> printfn");
printf(" 0 -> exitn");
printf("----------------------n");
printf(" input => ");
scanf("%d",&input);
{
printf("----------------------n");
printf(" 1 -> initn");
printf(" 2 -> insertn");
printf(" 3 -> removen");
printf(" 4 -> printfn");
printf(" 0 -> exitn");
printf("----------------------n");
printf(" input => ");
scanf("%d",&input);
switch(input)
{
case 1:
list_destroy(&yong); // yong 이라는 List 파괴시키소
list_init(&yong); // 다시 초기화시킴
break;
case 2:
if((list_ins_next(&yong))!=0) // 자료를 삽입할때 리턴값이 0이 나와야 정상..안나올경우 비정상종료
{
printf(" No No No insert");
return -1;
}
printf(" Yes Yes Yes insert n"); // 0 이 나왔을 경우 정상 종료
break;
case 3:
list_rem_next(&yong); // 가장 마지막에 삽입한 자료 하나 삭제
break;
case 4:
list_print(&yong); // 현재까지 있는 리스트안의 자료들을 프린트
break;
case 0:
list_destroy(&yong); // 나갈때 할당된 메모리는 해제시키고 나감
return 0;
default:
printf("try again..nn"); // 잘못입력시 보여줌
break;
}
}
}
{
case 1:
list_destroy(&yong); // yong 이라는 List 파괴시키소
list_init(&yong); // 다시 초기화시킴
break;
case 2:
if((list_ins_next(&yong))!=0) // 자료를 삽입할때 리턴값이 0이 나와야 정상..안나올경우 비정상종료
{
printf(" No No No insert");
return -1;
}
printf(" Yes Yes Yes insert n"); // 0 이 나왔을 경우 정상 종료
break;
case 3:
list_rem_next(&yong); // 가장 마지막에 삽입한 자료 하나 삭제
break;
case 4:
list_print(&yong); // 현재까지 있는 리스트안의 자료들을 프린트
break;
case 0:
list_destroy(&yong); // 나갈때 할당된 메모리는 해제시키고 나감
return 0;
default:
printf("try again..nn"); // 잘못입력시 보여줌
break;
}
}
}
<list.h>
#ifndef LIST_H
#define LIST_H // 여러개의 헤더파일을 직접 만들어 사용할때 중복을 회피
#define LIST_H // 여러개의 헤더파일을 직접 만들어 사용할때 중복을 회피
#include <stdlib.h>
typedef struct ListElmt_{ // 구조체 선언 name, tel 에 관한 char 포인터형
char *name;
char *tel;
struct ListElmt_ *next; // 자기참조 구조체
}ListElmt;
char *name;
char *tel;
struct ListElmt_ *next; // 자기참조 구조체
}ListElmt;
typedef struct List_{ // 구조체 선언 size 와 head, tail 을 가짐
int size;
ListElmt *head;
ListElmt *tail;
}List;
int size;
ListElmt *head;
ListElmt *tail;
}List;
void list_init(List *list) // 초기화 시키는 함수, size는 0으로 하고 각각의 구조체 포인터는 NULL을 가진다
{
list->size=0;
list->head=NULL;
list->tail=NULL;
}
{
list->size=0;
list->head=NULL;
list->tail=NULL;
}
void list_destroy(List *list) // List를 삭제해주는 함수
{
memset(list, 0, sizeof(List));
}
{
memset(list, 0, sizeof(List));
}
int list_ins_next(List *list)
{
char *addname; // name 과 tel 을 삽입할 포인터형 변수 선언
char *addtel;
ListElmt *new_element; // 새로운 노드 선언
{
char *addname; // name 과 tel 을 삽입할 포인터형 변수 선언
char *addtel;
ListElmt *new_element; // 새로운 노드 선언
if((new_element=(ListElmt *)malloc(sizeof(ListElmt))) == NULL)
return -1;
if((addname=(char *)malloc(sizeof(char)*20)) == NULL)
return -1;
if((addtel=(char *)malloc(sizeof(char)*20)) == NULL)
return -1; // 3개의 주소공간을 동적할당 시켜준다
printf(" insert emp name => ");
scanf("%s",addname);
printf(" insert emp telephone => ");
scanf("%s",addtel); // 2개의 변수에 값을 받아 오고
new_element->name = (char *)addname;
new_element->tel = (char *)addtel; // 입력받은 값을 노드가 가리키고
if(list->size==0)
list->tail = new_element; // 만약 첫번째 노드라면 tail이 새 노드를 가리킨다
new_element->next = list->head;
list->head = new_element; // head가 가리키는 곳을 새 노드라 가리키고 새노드를 head가 가리킴
list->tail = new_element; // 만약 첫번째 노드라면 tail이 새 노드를 가리킨다
new_element->next = list->head;
list->head = new_element; // head가 가리키는 곳을 새 노드라 가리키고 새노드를 head가 가리킴
list->size++; // 사이즈 하나 증가
return 0;
}
int list_rem_next(List *list)
{
ListElmt *old_element; // 새노드 선언
if(list->size==0) // 크기가 0이면 지울 데이터가 없기 때문에 -1 리턴
return -1;
old_element = list->head; // head가 가리키는 곳을 새노드가 가리킨다
list->head = list->head->next; // head가 가리키는 노드의 next가 가리키는 곳을 head가 가리킨다
{
ListElmt *old_element; // 새노드 선언
if(list->size==0) // 크기가 0이면 지울 데이터가 없기 때문에 -1 리턴
return -1;
old_element = list->head; // head가 가리키는 곳을 새노드가 가리킨다
list->head = list->head->next; // head가 가리키는 노드의 next가 가리키는 곳을 head가 가리킨다
// 중간에 있는 노드는 사라진다..-_-
if(list->size==1) // 사이즈가 1개이면 더이상 데이터가 없어서 tail이 NULL을 가리킨다
list->tail=NULL;
free(old_element); // 중간매개체를 한 노드는 free 시켜준다
list->size--; // 사이즈 하나 줄어듬
return 0;
}
if(list->size==1) // 사이즈가 1개이면 더이상 데이터가 없어서 tail이 NULL을 가리킨다
list->tail=NULL;
free(old_element); // 중간매개체를 한 노드는 free 시켜준다
list->size--; // 사이즈 하나 줄어듬
return 0;
}
void list_print(List *list)
{
ListElmt *copy; // 프린트 시켜주기 위한 노드 하나 생성
copy = list->head; // head가 가리키는 곳을 copy가 가리킨다
printf(" LIST");
while(copy != NULL) // copy 가 NULL을 가리키기 전까지 무한루프
{
printf(" --> %s,%s",copy->name,copy->tel); // copy 가리키는 곳의 name 과 tel 을 프린트해준다
copy = copy->next; // copy가 가리키는 노드의 next가 가리키는 곳을 copy가 가리킨다
}
printf(" --> NULL n");
return;
}
{
ListElmt *copy; // 프린트 시켜주기 위한 노드 하나 생성
copy = list->head; // head가 가리키는 곳을 copy가 가리킨다
printf(" LIST");
while(copy != NULL) // copy 가 NULL을 가리키기 전까지 무한루프
{
printf(" --> %s,%s",copy->name,copy->tel); // copy 가리키는 곳의 name 과 tel 을 프린트해준다
copy = copy->next; // copy가 가리키는 노드의 next가 가리키는 곳을 copy가 가리킨다
}
printf(" --> NULL n");
return;
}
#endif