C

[C] 266 단일 링크드 리스트 구현

qkrwngus 2021. 2. 17. 22:15

Desc :

도저히 말로는 설명을 못하겠다,,,


Source Code :

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int add_list(char* name, char* tel, char* addr);
void print_list(void);
void remove_list(void);

typedef struct tagLikedList
{
	char name[30];
	char tel[30];
	char addr[100];

	struct tagLikedList *next; // 다음 자료가 위치한 번지를 저장하기 위해 사용
}ADDR;

ADDR *g_pAddrHead = NULL; // 링크드 리스트의 첫번째 노드

void main()
{
	add_list("홍길동", "1111", "서울특별시 종로구");
	add_list("홍길동", "2222", "서울특별시 강서구");
	add_list("Mr.Kim", "3333", "서울특별시 구로구");
	add_list("김C", "4444", "서울특별시 강동구");
	add_list("최C", "5555", "대전광역시 동구");

	print_list();
	remove_list();
}

int add_list(char* name, char* tel, char* addr)
{
	ADDR *plocal;	// 현재 데이터를 저장하기 위함
	ADDR *pn = g_pAddrHead;	 // 현재 노드의 주소를 이전 노드의 next에 저장하기 위함

	if (g_pAddrHead == NULL)	// 한번만 실행됨
	{
		g_pAddrHead = malloc(sizeof(ADDR)); // 머리노드 구조체 할당 --> 할당된 주소가 저장됨

		if (g_pAddrHead == NULL)// 할당 실패
		{
			return 0;
		} 

		g_pAddrHead->next = NULL;	// 일단 null로 저장, 안그러면 쓰레기값
		plocal = g_pAddrHead;	// 할당된 주소 대입
	}
	else
	{
		plocal = malloc(sizeof(ADDR)); // ADDR 구조체 할당 --> 할당된 주소 저장

		if (plocal == NULL) // 메모리 할당 불가
		{
			return 0;
		}

		while (pn->next) // 다음 데이터 존재하면
		{
			pn = pn->next;	// 그 다음 노드 주소를, 마지막 노드 찾기
		}	// null이면 마지막노드

		pn->next = plocal;	// 현재 데이터가 저장되는 노드의 주소를 이전 노드의 next에 저장
		plocal->next = NULL;	// 일단 null값 저장
	}

	strcpy(plocal->name, name);
	strcpy(plocal->tel, tel);
	strcpy(plocal->addr, addr);

	return 1;
}

void print_list(void)
{
	int count = 1;
	ADDR *plist;

	plist = g_pAddrHead;

	while (plist) // 머리 노드부터 ~ 마지막 노드까지
	{
		printf("No. %d\n", count++);
		puts(plist->name);
		puts(plist->tel);
		printf("%s \n\n", plist->addr);

		plist = plist->next;
	}
}

void remove_list(void)
{
	ADDR *plocal;

	while (g_pAddrHead)
	{
		plocal = g_pAddrHead->next; // 다음 노드의 주소

		free(g_pAddrHead); // 현재 노드 메모리 반환

		g_pAddrHead = plocal; // 다음 노드를 현재노드로 옮기기
	}

}

 


Result :