SingleLinkedList(1) 삽입,삭제,검색

홍성우·2023년 4월 16일

자료구조 (C언어)

목록 보기
1/15
post-thumbnail
#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 순서대로 제거

profile
제 블로그를 방문해 주셔서 감사합니다

0개의 댓글