컴공 일기193
게시글 주소: https://orbi.kr/00058764625
오랜만에 일기 씁니다.
요새 재미삼아 만들어 보는 탐색 예제입니다.
특정 교수님을 사용자가 검색하면 검색할수록 연관검색어에 가장 끝에 위치하도록 하는 프로그램이지요.
선형 탐색이기 때문에, 자료구조는 당연히 리스트를 사용해야 합니다.
알고리즘은 이래서 자료구조에 의존적이지요. 만약, 이진 탐색을 하고 싶다면,
알고리즘을 손 댈 것이 아니라 자료구조를 바꿔야 합니다.
알고리즘보다 자료구조가 더 중요한 이유지요.
+) 박준상 교수님 사랑해용 근데 F폭격은 좀... ㅠㅠ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
char szData[64];
struct Node* NextNode;
}Node;
/*전역변수로 더미헤드를 선언해준다*/
Node* g_Head;
Node* g_pTail;
void InitList(void)
{
g_Head = (Node*)malloc(sizeof(Node));
g_pTail = (Node*)malloc(sizeof(Node));
memset(g_Head, 0, sizeof(Node));
memset(g_pTail, 0, sizeof(Node));
strcpy_s(g_Head->szData, sizeof(g_Head->szData), "DUMMY HEAD");
strcpy_s(g_pTail->szData, sizeof(g_pTail->szData), "DUMMY TAIL");
//기본적인 교통정리
g_Head->NextNode = g_pTail;
}
int IsEmpty()
{
if (g_Head->NextNode == NULL )
return 1;
else
return 0;
}
int InsertAtHead(char* pszData)
{
Node* pNode = (Node*)malloc(sizeof(Node));
memset(pNode, 0, sizeof(Node));
strcpy_s(pNode->szData, sizeof(pNode->szData), pszData);
if (IsEmpty())
{
g_Head->NextNode = pNode;
g_pTail = pNode;
}
//리스트에 추가된 첫 번째 데이터 처리
else
{
pNode->NextNode = g_Head->NextNode;
g_Head->NextNode = pNode;
}
g_pTail = pNode;
return 1;
}
int InsertAtTail(char* pszData)
{
Node* pNode = (Node*)malloc(sizeof(Node));
memset(pNode, 0, sizeof(Node));
strcpy_s(pNode->szData, sizeof(pNode->szData), pszData);
if (IsEmpty())
g_Head->NextNode = pNode;
//리스트에 추가된 첫 번째 데이터 처리
else
g_pTail->NextNode = pNode;
g_pTail = pNode;
return 1;
}
/*연결리스트 전체 노드 출력 함수*/
void PrintList(void)
{
Node* Head = g_Head;
while (Head != NULL)
{
printf("[%p] %s, next[%p]\n",
Head, Head->szData, Head->NextNode);
Head = Head->NextNode;
}
putchar('\n');
}
/*노드를 추가하는 함수*/
int InsertNewNode(char* pszData)
{
Node* pNode = (Node*)malloc(sizeof(Node));
/*기본적으로 memset으로 메모리 초기화를 꾀했다*/
memset(pNode, 0, sizeof(Node));
strcpy_s(pNode->szData, sizeof(pNode->szData), pszData);
if (g_Head->NextNode == NULL)
g_Head->NextNode = pNode;
else {
pNode->NextNode = g_Head->NextNode;
g_Head->NextNode = pNode;
}
return 1;
}
int FindData(char* pszData)
{
Node* pCur = g_Head->NextNode;
Node* pPrev = g_Head;
while (pCur != NULL)
{
//찾은 노드의 앞 노드 주소를 반환하는 패턴.
//더미헤드의 미학 ; 이렇게 해도 문제 없음.
if (strcmp(pCur->szData, pszData) == 0)
return pPrev;
pCur = pCur->NextNode;
pPrev = pPrev->NextNode;
}
return 0;
}
Node* Transpose(char* pszData)
{
Node* Current = g_Head->NextNode;
Node* Previous = g_Head;
Node* PPrevious = g_Head;
Node* Match = NULL;
while (Current != NULL)
{
if (strcmp(Current->szData, pszData) == 0)
{
Match = Current;
if (Previous != NULL)
{
if (PPrevious != g_Head)
PPrevious->NextNode = Current;
else
g_Head->NextNode = Current;
Previous->NextNode = Current->NextNode;
Current->NextNode = Previous;
}
break;
}
else
{
if(Previous != NULL)
PPrevious = Previous;
Previous = Current;
Current = Current->NextNode;
}
}
return Match;
}
//전반적 소감 : 더미 헤드를 추가하지 않으면 삭제할 노드의 전 노드를 찾아야 하는 노가다가 발생한다.
int DeleteData(char* pszData)
{
Node* pPrev = FindData(pszData);
if (pPrev != 0)
{
Node* pDelete = pPrev->NextNode;
pPrev->NextNode = pDelete->NextNode;
printf("DeleteData(): %s\n", pDelete->szData);
if (pDelete == g_pTail)
g_pTail = 0;
free(pDelete);
return 1;
}
}
void ReleaseList(void)
{
Node* pTmp = g_Head;
while (pTmp != NULL)
{
/*반복문 안에서 변수 선언하면 안 되지 않아? -> 최근엔 조금 애매해지긴 해졌다. 컴파일러 최적화 과정!*/
Node* pDelete = pTmp;
pTmp = pTmp->NextNode;
printf("Delete: [%p] %s\n", pDelete, pDelete->szData);
free(pDelete);
}
//g_Head.NextNode가 아예 메모리 해제가 되었으므로 다시 NULL로 초기화를 해주어야 한다.
g_Head = 0;
g_pTail = 0;
}
void Push(char* pszData)
{
InsertAtHead(pszData);
}
int Pop(Node* pPopNode)
{
Node* sp = g_Head->NextNode;
if (IsEmpty())
return 0;
memcpy(pPopNode, sp, sizeof(Node));
g_Head->NextNode = sp->NextNode;
free(sp);
return 1;
}
int Enqueue(char* pszData)
{
InsertAtTail(pszData);
return 1;
}
int Dequeue(char* pszData)
{
Pop(pszData);
return 1;
}
int main()
{
InitList();
//링크드 리스트를 위한 테스트 코드
InsertNewNode("박준상");
InsertNewNode("표창우");
InsertNewNode("권건우");
InsertNewNode("하란");
//사용자가 만약 박준상 교수를 계속 탐색하려 든다면, 박준상 교수의 인덱스를 계속 앞으로 당겨오는 것이다.
Transpose("박준상");
Transpose("박준상");
//원래 박준상 교수는 4번째에 위치해 있지만, 2번을 탐색했으므로 index = 1이 된다.
PrintList();
ReleaseList();
}
실행결과 :
[0000025C86533500] DUMMY HEAD, next[0000025C8653A680]
[0000025C8653A680] 하란, next[0000025C8653A4D0]
[0000025C8653A4D0] 박준상, next[0000025C8653A5F0]
[0000025C8653A5F0] 권건우, next[0000025C8653A560]
[0000025C8653A560] 표창우, next[0000025C86535700]
[0000025C86535700] DUMMY TAIL, next[0000000000000000]
Delete: [0000025C86533500] DUMMY HEAD
Delete: [0000025C8653A680] 하란
Delete: [0000025C8653A4D0] 박준상
Delete: [0000025C8653A5F0] 권건우
Delete: [0000025C8653A560] 표창우
Delete: [0000025C86535700] DUMMY TAIL
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
듀,, 1 0
듀한밤이군
-
내 인생이 수능으로 좌우되다니 1 0
너무 슬퍼
-
정병농도 높은데 사람들은 착한 커뮤를 찾고있음 28 3
오르비는 사람들은 착한데 정병농도는 중간정도라 너무 징징거리기가 좀 뭐하고 디시는...
-
안녕하세요~ 매 수능,모고마다 의외로 오답률 상위권을 차지 중인 빈곤 이론에 대한...
-
흠.. 30 1
오늘의 새르비는 안타까운 소식들이 많군.이상이란 그런 것이지. 결코 도달할 수 없는...
-
손바닥만한 귤 4 1
작년 겨울 사진. 짱 큼 ㄹㅇ
-
가장 기분 나쁘고 짜증나는 일이 없다옹 그 이유가 너무나도 한국인스러운 이유라서일때는 더더욱
-
경제는 어떰 0 1
생윤 벌서스 경제
-
메가 4배속 1 0
은 대체 왜 존재하는가? 어따 쓰노
-
뉸뉴 0 0
뉸뉴뉴뉸뉴뉴
-
한번이라도 나를 그리워했니 0 0
그땐 몰랐지만 난 너의 중독자야 for your love
-
이상과 현실의 간극이 너무 큼 3 0
생각보다 현실은 정직한곳이 아니고 노력과 능력이 결과로 직결되지 않는다는것을 점점...
-
도저히출근못하겟다 2 0
침대와나는결합법칙
-
ㅇㅈ 1 0
어 형이야
-
잘게요 2 1
야말한테 월드컵 갖다놔라
-
오랜만에 웹툰 보니까 2 0
뭔가 머리 좋아진거 같음 고등학교 배경에 머리 똑똑한 애들이 나오는 웹툰 두개...
-
내가 뭘 할 수 있지... 8 4
20살의 나는 이런 나를 기대하지 않았겠지... 미안하다 난괜찮아난괜찮아
-
근데 a_n 찾는 문제 0 1
그건 어떻게 하나요 막 역추적?이런게 있다던데 걍 다 나열하는건가요
-
밤낮 바꿀려고 밤샐예정 2 0
반수 할라면 바꿔야함
-
이대는 환산시 진로과목도 환산해서 등급이 높아지던데 이 발표자료는 환산내신인가요...
-
작년과 올해 언어이해+추리논증 합산 원점수는 같습니다. 아마 표준점수로...
-
근데 AI 완전히 믿으면 안됨 4 0
알루미늄의 E2/E1이 마그네슘의 E2/E1보다 작다고 아주 자연스럽게 구라치는거...
-
수특에 있는 그림임 기하아아아아아악
-
뚱냥이 2 1
-
시발 나만 못생겼지 2 0
ㅗㅗㅗㅗㅗ 다 뒤져
-
여기 인논 합격자 있나 0 1
?
-
ㅇㅈ 4 2
민간인
-
확통엔제 4 0
기출 회독 vs 엔제
-
7/19 공부인증 6 0
수학 수학적 귀납법으로 an 제한범위 만들고 제한범위 생겼으니 샌드위치 정리로 an...
-
여기는 인증메타구나 2 0
오늘은 인증메타보다 재밋는게있어서 패스
-
이거 뭔데 계속 인스타에 뜸? 7 1
흠..
-
앙 0 0
앙
-
진짜 수능판에 아직 9 2
03있을까
-
내가 지금까지 한 공부량 7 2
대략적인 추정 참고로 실모는 그냥 귀찮아서 n제화해서 푼게 많음 국어 실모 약...
-
수능날 영어시간에 자본사람 3 1
나 모고때 항상 조는데 수능날에도 존 사람 있니
-
28수학은 뭔가 6 1
1~18, 22~26은 쉽게 주고 19확통 27수1 28수2를 약간 어렵게 내고...
-
나도 21년에는 뉴르비였는데 1 0
시간이 진짜 빠르구낭
-
인강을 첨 들어보는데.. 2 0
그냥 1강씩 들어나가면 되는 건가요..? 대종쌤 인셉션 독해에요 ㅠㅠ
-
씁
-
지1 실모를 보면 4 0
90%는 점수가 42~45에서 바뀌질 않는데 더 올릴려면 뭘 해야하지 ㅅㅂ 실모도...
-
13번까지도 쉽게나오는거 찾아봐도 ㄹㅇ 교육청 사관학교말고없는거같아서요
-
생기부 활동 1 0
내일 다 제출하면 드디어 끝이다 그럼 이제 수능공부 빡세게 해야지
-
인증해줘 0 0
인증메타놓폇러
-
진짜 ㅇㅈ마렵네 2 0
진짜 ㅇㅈ마렵네
-
포토샵 유머 1 0
-
내가 현역에서 0 0
서울대 수시 납치되거나 정시로 의치한 붙으면 30분동안 인증 올려둠 죽어도 안 올리겠다는 뜻
-
3시간자고 월드컵 ㄱ 0 0
원래 안볼라그랬는데 도저히 참을수가없어... 3시간뒤에만나요
-
사문 킬러 단원 11 0
사문러분들 와주세요 지금 개념책보고 기출몇개 풀고 내일 테스트겸 킬러 풀만한지...
-
제곧내

혹시 군대는 어디로 가실 예정인가요?? 다른 일기 보니깐 군대에서도 공부하신다길래 궁금해서 여쭈어봅니다.
공군 갈 것 같습니다 ㅎㅎ
저도 공군 생각 중인데 혹시 뭐 자격증 같은 거 준비하는게 좋나요..? ㅎㅎ