프로그래밍

단순 연결 리스트 구현

Dilrong 2013. 5. 21. 17:03

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

//노드 구조체로 정의

typedef struct ListNode

{

        char data[10];

        //다음 노드를 이어줄 포인터

        struct ListNode* link;

}listNode;

 

//리스트의 시작을 나타내는 주소 = head

typedef struct

{

        listNode* head;

}linkedList_h;

 

linkedList_h* createListedList_h(void);

void freeLinkedList_h(linkedList_h*);

void addLastNode(linkedList_h*, char*);

void reverse(linkedList_h*);

void deleteLastNode(linkedList_h*);

void printList(linkedList_h*);

 

//링크 리스트 생성 함수

linkedList_h* createListedList_h(void)

{

        linkedList_h* L;

        //동적할당으로 새로운 링크 리스트 생성

        L = (linkedList_h*)malloc(sizeof(linkedList_h));

        //다음 주소를 따라감

        L->head = NULL;

        return L;

}

 

//링크 리스트 포함에 요소 포함

void addLastNode(linkedList_h* L, char* x)

{

        listNode* newNode;

        listNode* p;

        //추가할 요소 동적할당

        newNode = (listNode*)malloc(sizeof(listNode));

        //strcpy 요소 복사해서 data 입력

        strcpy(newNode->data, x);

        newNode->link=NULL;

        //NULL값에 도달하면 리턴

        if(L -> head == NULL)

        {

               L->head = newNode;

               return;

        }

               p=L->head;

               while (p->link != NULL) p = p->link;

               p ->link = newNode;

}

 

//역순으로 변환

        void reverse(linkedList_h* L)

        {

               listNode* p;

               listNode* q;

               listNode* r;

 

               p = L -> head;

               q= NULL;

               r= NULL;

 

               //p=NULL일때까지 변환

               while (p != NULL)

               {

                       r = q;

                       q = p;

                       p = p -> link;

                       q -> link = r;

               }

               L->head = q;

        }

 

        //노드 삭제

        void deleteLastNode(linkedList_h* L)

        {

               listNode* previous;

               listNode* current;

               if(L->head == NULL) return;

               if(L->head -> link == NULL)

               {

                       free(L->head);

                       L->head = NULL;

                       return;

               }

               else{

                       previous = L->head;

                       current = L ->head -> link;

                       while(current -> link != NULL)

                       {

                              previous = current;

                              current = current -> link;

                       }

                       free(current);

                       previous->link = NULL;

               }

        }

 

        //공간해제로 공백만들기

        void freeLinkedList_h(linkedList_h* L)

        {

               listNode* p;

               while(L->head != NULL)

               {

                       p = L ->head;

                       L->head = L ->head ->link;

                       free(p);

                       p=NULL;

               }

        }

 

        //노드요소 출력

        void printList(linkedList_h* L)

        {

               listNode* p;

               printf("L = (");

               p= L->head;

               while(p != NULL)

               {

                       printf("%s", p->data);

                       p = p->link;

                       if(p != NULL) printf(", ");

               }

               printf(") \n");

        }

 

        int main()

        {

               linkedList_h* L;

               L = createListedList_h();

               printf("(1) 공백 리스트 생성하기! \n");

               printList(L); getchar();

 

               printf("(2) 리스트에 3개의 노드 추가하기! \n");

               addLastNode(L, "");

               addLastNode(L, "");

               addLastNode(L, "");

               printList(L); getchar();

 

               printf("(3) 리스트 마지막에 노드 한개 추가하기! \n");

               addLastNode(L, "");

               printList(L); getchar();

 

               printf("(4) 마지막 노드 삭제하기! \n");

               deleteLastNode(L);

               printList(L); getchar();

 

               printf("(5) 리스트 원소를 역순으로 변환하기! \n");

               reverse(L);

               printList(L); getchar();

 

               printf("(6) 리스트 공간을 해제하여, 공백리스트 상태로 만들기! \n");

               freeLinkedList_h(L);

               printList(L);

 

               getchar();

               return 0;

        }


반응형