
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct Node {
char szName[32];
struct Node* next;
} Node;
Node* g_Head;
// 연결리스트 전체 데이터 출력
void printNode(void) {
Node* temp = g_Head;
while (temp != NULL) {
printf("curr[%p] next[%p]%s\n", temp, temp->next,temp->szName);
temp = temp->next;
}
putchar('\n');
}
void removeList(void) {
Node* temp = g_Head;
while (temp != NULL) {
Node* deleteNode = temp;
temp = temp->next;
printf("Delete : [%p] %s\n", deleteNode, deleteNode->szName);
free(deleteNode);
}
}
// 데이터 찾기
int FindData(char* psData) {
Node* temp = g_Head;
while (temp != NULL)
{
if (strcmp(temp->szName, psData)) return 1;
temp = temp->next;
}
return 0;
}
/// node 추가
int InsertNode(char *pszData) {
Node* temp = (Node *)malloc(sizeof(Node));
memset(temp, 0, sizeof(Node));
strcpy_s(temp->szName, sizeof(temp->szName), pszData);
Node* tail = (Node*)malloc(sizeof(Node));
Node* prev = g_Head;
if (g_Head == NULL) {
g_Head = temp;
}
else {
while (prev->next != NULL) {
prev = prev->next;
}
prev->next = temp;
tail = prev;
}
return 1;
}
void Delete(char* pszData) {
Node* temp = g_Head;
Node* prev = NULL;
while (temp != NULL)
{
if (strcmp(temp->szName, pszData) == 0) {
// 삭제
printf("Delete() %s\n", temp->szName);
if (prev != NULL) {
prev->next = temp->next; // 이해됨
}
else {
// 삭제할 데이터가 첫번째
g_Head->next = temp;
}
free(temp);
return 1;
}
prev = temp;
temp = temp->next;
}
}
int main(void)
{
InsertNode("Number01");
printNode();
InsertNode("Number02");
printNode();
InsertNode("Number03");
printNode();
InsertNode("Number04");
printNode();
InsertNode("Number05");
printNode();
// 데이터 찾음
if (FindData("Number01") == 1) {
printf("Find() %s \n", "Number01");
}
if (FindData("Number02") == 1) {
printf("Find() %s \n", "Number02");
}
if (FindData("Number03") == 1) {
printf("Find() %s \n", "Number03");
}
Delete("Number05");
Delete("Number03");
Delete("Number04");
Delete("Number01");
Delete("Number02");
removeList();
return 0;
}
구현하는 과정에 있어 그림을 정말많이 그렸다.
앞 노드부터 끝으로 노드를 연결하는 방식으로 구현하였다.
예시) 1->2 추가되는 3노드
결과 1->2->3
[검색]
1->2->3 중에 2번노드를 찾고 싶은 기능 구현
strcmp() 메모리 비교함수 사용
[중간 데이터 삭제]
1->2->3 중 2번을 지우고 싶으면 2번을 free()함수로 메모리를 반환하고 1->3을 연결시켜 주는 작업
[전체 데이터제거]
1->2->3 순서대로 제거
