c언어 linkedlist

언어/c언어2019. 12. 31. 23:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef struct node_{

	char cData;
	struct node_* nodeNext;
} node_;

typedef struct {

	node_* head;
	node_* tail;
}linkedlist;

linkedlist* createNode();
void init(linkedlist**);
void dataInsrt(linkedlist**, char*);
void dataPrint(linkedlist**);
void firstNodeRemove(linkedlist**); 
void lastNodeRemove(linkedlist**);
void memoryFree(linkedlist**);

//void memoryFree(node_*);

int main(void) {

	linkedlist* node = NULL;
	char nodeString[] = "ABCDEFGC";

	node = createNode();
	init(&node);
	dataInsrt(&node, nodeString);
	dataPrint(&node);
	//memoryFree(node->head->nodeNext);
    firstNodeRemove(&node);
	dataPrint(&node);
    lastNodeRemove(&node);
    dataPrint(&node);
    memoryFree(&node);

    return 0;

} // end of main function

linkedlist* createNode() {

	linkedlist* createNode = NULL;
	createNode = (linkedlist*)malloc(sizeof(linkedlist));

	if (createNode == NULL) {
		exit(1);
	}
	else {
		createNode->head = NULL;
		createNode->tail = NULL;
	}
	return createNode;
} // end of createNode function

void init(linkedlist** param) {

	(**param).head = (node_*)malloc(sizeof(node_));
	(**param).tail = (node_*)malloc(sizeof(node_));

	if ((**param).head == NULL || (**param).tail == NULL) {
		exit(1);
	}
	else {

		(**param).head->cData = ' ';
		(**param).head->nodeNext = NULL;
		(**param).tail->cData = ' ';
		(**param).tail->nodeNext = NULL;
	}
} // end of init function

void dataInsrt(linkedlist** param, char* cData) {

	
	for (unsigned int i = 0; i < strlen(cData); i++) {
	
		node_* createNode = NULL;
		createNode = (node_*)malloc(sizeof(node_));

		if (createNode != NULL) {
			
			createNode->cData = *(cData + i);

			createNode->nodeNext = NULL;

			if ((**param).head->nodeNext == NULL && (**param).tail->nodeNext == NULL) {
				
				(**param).head->nodeNext = createNode;
				(**param).tail->nodeNext = createNode;
			}
			else {
				
				(**param).tail->nodeNext->nodeNext = createNode;
				(**param).tail->nodeNext = createNode;
			}
		}
	}
} // end of dataInsrt function

void dataPrint(linkedlist** param) {

	node_* indexNode = NULL;

	// 데이터가 한개도 없는 경우
	if ((**param).head->nodeNext != NULL && (**param).tail->nodeNext != NULL) {

		indexNode = (**param).head->nodeNext;
		while (indexNode != NULL) {
			printf("%c [%p]", indexNode->cData, indexNode);

			if (indexNode->nodeNext != NULL) {

				printf(" -> ");
			}
			// 노드 이동
			indexNode = indexNode->nodeNext;
		}
		printf("\n");
	}
} // end of dataPrint function

/*
void memoryFree(node_* param) {

	// c언어는 java 처럼 가비지 컬렉터가 따로 동작하는 구조가 아니기 때문에 
	// 메모리 해제를 반드시 해야 한다.
	// 재귀함수를 사용하여 메모리 해제를 시도한다.

	if (param == NULL) {
		return;
	}
	else {

		node_* rmNode = NULL;
		node_* mvNode = NULL;

		printf("해제 시킬 메모리 주소 : %p\n", param);

		rmNode = param;
		mvNode = param->nodeNext;
		free(rmNode);
		memoryFree(mvNode);
	}
}*/


void firstNodeRemove(linkedlist** param) {
    
    node_* rmNode = NULL;

    if ( (**param).head->nodeNext != NULL && (**param).tail->nodeNext != NULL ) {
        
        rmNode = (**param).head->nodeNext;
        (**param).head->nodeNext = rmNode->nodeNext;
        free(rmNode);

        // 데이터가 한개 인 경우
        if ( (**param).head->nodeNext == (**param).tail->nodeNext ) {
    
            (**param).tail->nodeNext = NULL;
        } 
        
    }
} // end of firstNodeRemove function

void lastNodeRemove(linkedlist** param) {
    
    node_* rmNode   = NULL;
    node_* indxNode = NULL;

    if ( (**param).head->nodeNext != NULL && (**param).tail->nodeNext != NULL ) {

       // 데이터가 한개 인 경우
       if ( (**param).head->nodeNext == (**param).tail->nodeNext ) {
           
           rmNode = (**param).head->nodeNext;
           (**param).head->nodeNext = NULL;
           (**param).tail->nodeNext = NULL;
           free(rmNode);
       }
       else {

           indxNode = (**param).head->nodeNext;
           while (indxNode->nodeNext->nodeNext != NULL) {
                
               indxNode = indxNode->nodeNext;
           }
           indxNode->nodeNext = NULL;
           (**param).tail->nodeNext = indxNode;
           rmNode = indxNode->nodeNext;
           free(rmNode);
       }
    }
} // end of lastNodeRemove function

void memoryFree(linkedlist** param) {

    node_* rmNode   = NULL;
    node_* indxNode = NULL;

    if ( (**param).head->nodeNext != NULL && (**param).tail->nodeNext != NULL ) {
        
        // 데이터가 한개 인 경우
        if ( (**param).head->nodeNext == (**param).tail->nodeNext ) {
            lastNodeRemove(param);
        } 
        else {
            indxNode = (**param).head->nodeNext;
            (**param).head->nodeNext = NULL;

            while (indxNode->nodeNext != NULL) {
                rmNode = indxNode;
                indxNode = indxNode->nodeNext;
                free(rmNode);
            }

            (**param).tail->nodeNext = NULL;
        }
    }

    free( (**param).head );
    free( (**param).tail );
}

'언어 > c언어' 카테고리의 다른 글

네이버 풀이  (0) 2019.05.18
c언어 네이버 풀이 중첩 for문을 사용해서 3을 입력하면  (0) 2019.05.06
네이버 풀이  (0) 2018.12.01
네이버 문제 풀이 - 최대공약수  (0) 2018.11.28
네이버 지식이 풀이  (0) 2018.11.28