컴공 일기193
게시글 주소: https://dev.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를 선물하세요.
-
사탐런 고민 3 1
현역이고 작수 물지 당일에 모의수능으로 학원가서쳤을때 2/1떴었는데 사탐런하면...
-
사실 저는 어제 생일이였습니다 왜 말하지 않았냐고요? "모두가 날 신경쓰는척 행동하는게 역겨우니까"
-
옯창 리스트 2 3
-
3월 더프 미적 4 1
21 22 30 틀려서 88점이네
-
과학 문제집중에 7 2
가장 어려운거 뭐임요??
-
야 신난다!
-
자꾸 간봐서 그렇긴 한데 3모 기간이 일정이 뭐가 많아서 아무도 안 볼거면 시간...
-
진지한 국어 질문 7 1
현역때 국어 안했고, 올해 3월에 처음 시작했습니다.선택은 화작목표는 6월에 3등급...
-
[이벤트] 2027학년도 Prologue 모의고사 1회 배포 19 12
OMR 링크:...
-
이제 심판의 시간이 다가왔다 5 2
더프 수학 채점해야 함.
-
아니 개어이없네... 2 0
이게 왜 정털리는데.....
-
미적 기준 뭐가 더 쉣임?
-
스블 vs n제 1 0
수1,수2 뉴분감 4월초에 끝날 거 같은데 스블 한번 더 하는게 좋나요? 아니면...
-
뛰어넘었나 0 1
궁금쓰
-
ㅈ같네 씨발씨발
-
자퇴마렵노 4 0
회화가맨날잇서
-
잘생기면 먹는거 조절하게됨 0 0
잘생긴거랑 아닌거랑 대우받는게 다르다는걸 아니깐 체중조절목적이 생기는등 잘생기면...
-
시대인재 근황.... 6 3
한국사 답안 523 투척
-
올해 화학표본은 2 1
잘함?
-
재수하는데 집안형편 4 1
하..올해 재수하는 07인데 ㅅㅂ 집안형편이 생각보다 안좋은것같은데 어캄 우연히...
-
헐 통합과학은 0 1
염색체에서 막 화학식 구하고 외계행성 물리법칙 구할려나
-
ㄹㅇ 오르비가 존나심심해짐
-
더프랑 서프가 왔는데 생각해보니 현역이라 풀 시간이 주말뿐임;;; 지금 모의고사...
-
야심한 밤의 2503 화1 9 0
엄 이게 진짜 말로 하기 뭐한데 생각보다는 어려운데? 등급컷은 잘 모르게씀...
-
근데 통합과학은 어케나온대 0 1
이게 ㄹㅇ궁금함
-
통합과학 현강은 어케함 2 3
현정훈 강준호 김연호 이신혁 막 번갈아서 들어오나 ㅋㅋ
-
13분 후 배포함 4 4
-
좋아하는 강아지가 있는데 8 2
랜선으로만 보는 애기인데도 갈수록 늙어가는 게 눈에 보여서 슬픔
-
님들은 뭐해서 돈벌것같음? 6 0
ㄹㅇ 뭐해야하지
-
ADHD 진단 받아서 울었어 0 0
대학교 졸업하고서야 알다니
-
존나행복했다
-
애니캐릭터가 그렇게 하니까. 그리고 내가 쉽게 변하지 않는 강인하고 안정된 마음을...
-
나의능력 3 0
아무도댓글를안단느능력
-
Stay on fire 개좋음 1 1
앨범에서 유일하게 좋은데 걍 좋음 캬
-
작수 39점 사문 최적 개념 0 0
작수 윤성훈 풀커리 듣고 사문 39점이고 지금까지 윤성훈 스피드 개념 +검더텅...
-
3모 전날 새르비가 8 1
폭발적이겠지?
-
전 오늘부터 3 0
혼자다니기로 했어요
-
저랑 맞팔해요 4 1
-
새르비가 되어가니깐 1 1
조회수가 줄었군
-
학교생활 망햇다 3 0
망햇다고
-
하수: 실모에 기하가 없구나 1 2
고수: 공통 모의고사구나
-
이이이이걸들르셈 2 0
동현이 랩이된다 여기서제일잘하는애야
-
내용을 아는데 문제를 틀림(?)
-
이 앨범 진짜 좋다 0 0
-
좆 0 0
학교실ㄹ러
-
단축수업 너무 야르인데 2 0
앙 기모찌
-
근데 더프나 서프 개인응시면 1 0
걍 안사고 ㅇㅂ에서 뽑아푸는게 낫나요? 일단 3덮 사긴했는데 다음부터 어케할까요?? 현역입니다!
-
N제 작년꺼 풀어도 괜찮나용 0 0
사촌형한테 책 작년 N제 몇개 받았는데 작년꺼여도 풀어봐도 괜찮겠죠? 참고로 기출...
-
무릎도 안 모이는데 안쪽이 왜 아픈지 모르게씀
-
생명 실모 양치기할까 2 1
진짜 n제 푼다고 크게 안느는거같기도하고 시간관리가 필요한데

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