작성자 : 김정덕
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <errno.h>
#include <stdlib.h>
#define DUP_METER 1000000
typedef int INT;
typedef unsigned int UINT;
typedef long long INT64;
typedef time_t TIME_T;
typedef unsigned long long TIME_64;
typedef unsigned long long UINT64;
unsigned long long timestamp( void )
{
struct timeval tv;
unsigned long long ullRetval;
memset( &tv, 0, sizeof( struct timeval ) );
gettimeofday( &tv, NULL );
ullRetval = ( tv.tv_sec * DUP_METER ) + tv.tv_usec;
return ullRetval;
}
typedef struct _st_linkdata
{
INT64 llkey;
char body[1024];
// int d_num;
struct _st_linkdata *next;
}st_linkdata, *pst_linkdata;
pst_linkdata pnode; // 전역 구조체로 선언
pst_linkdata ptmp;
int main (int argc, char *argv[])
{
int ch1; //첫케이스문 사용 변수
while (1)
{
fflush(stdin);// 입출력 버퍼 초기화
print_Menu(); // 메뉴 함수 호출
scanf("%d", &ch1);
if (ch1 < 0 || ch1 > 5) 지정 값 이외의 수가 입력 되었을때 에러
{
fprintf(stderr, "SCANF ERROR : %d\n", ch1);
continue;
}
switch(ch1){ // 스위치 문 실행
case 1:
makeNew_link();//데이터 생성 함수
print_list();// 화면 결과 출력 함수
break;
case 2:
search_link();// 서치
break;
case 3:
free_link();// 데이터 삭제 함수
print_list();// 화면 결과 출력 함수
break;
case 4:
print_list(); // 화면 결과 출력 함수
break;
case 5:
return 0;
break;
}
}
return 0;
}
int makeNew_link()
{
int dt;// 실행문에서 데이터 값을 직접 입력 받기 위해 사용 하였으나 삭제 비실행 변수
fprintf(stdout, "###CREATE NEW DATA### \n" , NULL);
pst_linkdata pdata;
pdata = (pst_linkdata)malloc(sizeof(st_linkdata));// 메모리 할당 부분
pdata->next = NULL;// 할당된 pdata의 다음 가르켜야 할 구조체를 를 NULL표시
pdata->llkey = timestamp();// 키값을 타임 스탬프로 고유 값 입력
if (pdata == NULL) // 메모리 할당 실패시 에러
{
fprintf(stdout, "MALLOC ERROR (%d:%s)\n", errno, strerror(errno));
return -1;
}
ptmp = pnode;// 조작을 위해 pnode 첫번째를 임시에 저장
sleep(1);// 그냥 그럴싸 하게 보일려고 슬립 삽입
fprintf(stdout, "### COMPLETE ### \n" , NULL);
sleep(1);
while(1)// 무한루프를 위해 조건을 1 로 하고 시작
{
if(!ptmp)// ptmp가 처음 일 경우 pnode 에 생성된 pdata 저장
{
pnode = pdata;
}
else
{
for(; ptmp->next; ptmp = ptmp->next);// 임시에서 다음 까지 계속 돌며 확인
{
if(ptmp->llkey == pdata->llkey)// 키값이 같으면 에러
{
fprintf(stdout, "SAME DATA ERROR!!!!! \n", NULL);
return 0;
}
ptmp->next = pdata;// 같은 것이 없다면 임시의 다음은 pdata로 지정
}
}
return 0;
}
return 0;
}
int search_link()
{
INT64 dt;// 키값이 되는 변수 입력 받기 위해 사용
int j=0; // 에러 처리를 위해 삽입된 변수
fprintf(stdout, "###Insert Data For Search: \n" , NULL);
fflush(stdin);// insert buffer init// 입력 버퍼 초기화
scanf("%llx", &dt);
ptmp = pnode; // 조작을 위해 임시에 저장
if(pnode == NULL)// 데이터가 없다면 에러
{
fprintf(stdout, "NON DATA \n", NULL);
return 0;
}
for(; ptmp != NULL; ptmp = ptmp->next)// 임시에서 다음으로 계속 돈다
{
if(ptmp->llkey == dt)// 키값이 입력값과 같다면
{ j=1; // 동일 키값이 있다면 j는 1로 바뀐다.
fprintf(stdout, "FIND DATA llkey -> %llx\n", ptmp->llkey);// 키를 찾았으므로 출력
}
}
if(j == 0) // 아까 선언 했던 것이 키값이 없으면 그대로 0 이다. 에러 화면
{
fprintf(stdout, "HAVE NOT PLACE !!!!", NULL);
return 0;
}
return 0;
}
int free_link()// 삭제 함수
{
INT64 dt;// 입력 을 받기 위해 선언 된 변수
fprintf(stdout, "###Insert Data For Datafree: \n" , NULL);
fflush(stdin);// insert buffer init// 입력 버퍼 초기화
scanf("%llx", &dt);
pst_linkdata pdel;// 삭제시만 사용 되는 임시 구조체
ptmp = pnode;// 조작을 위해 pnode 를 임시에 저장
if(pnode == NULL)// pnode 가 없으면 당연히 에러
{
fprintf(stdout, "NULL DATA \n", NULL);
return 0;
}
if(pnode->llkey == dt)// 처음 값인pnode 가 키값이 동일 하다면 삭제
{
fprintf(stdout, "llkey : %llx\n", dt);
fprintf(stdout, "llkey : %llx\n", pnode->llkey);
fprintf(stdout, "firt delete\n", NULL);
pnode = ptmp->next;// pnode는 pnode의 다음 값이 된다.
free(ptmp); // 그리고 임시에 저장된 pnode 를 삭제 한다.
return 0;
}
pdel = ptmp;// 처음이 아닐경우 사용 되는 임시 구조체에 ptmp 를 저장
for(; ptmp != NULL; pdel=ptmp, ptmp = ptmp->next)// ptmp 가 NULL아닌 곳에서 부터 next 로 증가 pdel에 ptmp를 계속 받으면서 이동이 중요.
{
if(ptmp->llkey == dt)// 동일값 찾은 상태
{
fprintf(stdout, "llkey : %llx\n", dt);
fprintf(stdout, "llkey : %llx\n", pnode->llkey);
fprintf(stdout, "delete complete\n", NULL);
pdel->next = ptmp->next;// 서치된 임시구조체의 next를 pdel 에 연결하고 ptmp를 삭제
free(ptmp);//ptmp삭제
return 0;
}
}
return 0;
}
int print_list()
{
int i=0;
ptmp = pnode;
printf("RESULT ----\n");
for(; ptmp != NULL; ptmp = ptmp->next)
{ i++;
fprintf(stdout,"No.%d llKey : %llx\n", i, ptmp->llkey);
fprintf(stdout,"-----------------------------------\n", NULL);
}
fprintf(stdout, "TOTAL : %d DATA SEARCH\n", i);
return 0;
}
int print_Menu()
{
fprintf(stdout, "\n-----LINKED LIST TEST-----\n\n", NULL);
fprintf(stdout, "1.MAKE NEW LINKED DATA\n", NULL);
fprintf(stdout, "2.SEARCH DATA\n", NULL);
fprintf(stdout, "3.FREE DATA(DELETE)\n", NULL);
fprintf(stdout, "4.PRINT LIST\n", NULL);
fprintf(stdout, "5.FINISH\n", NULL);
fprintf(stdout, "WHAT DO U WANT?(1~4) : ", NULL);
return 0;
}