본문 바로가기

IT/자료구조

원형 연결리스트 코드

#include <stdio.h>
#include <stdlib.h>

typedef int element;
typedef struct node
{
        struct node* llink;
        element data;
        struct node* rlink;
}NODE;


NODE* makeNode(element);
void insertNode(NODE**,NODE *);
void deleteNode(NODE**,element);
void printList(NODE**);

int main()
{
        NODE *head =NULL;

        insertNode(&head,makeNode(10));
        insertNode(&head,makeNode(20));
        insertNode(&head,makeNode(5));
        insertNode(&head,makeNode(15));
        printList(&head);


        deleteNode(&head,30);// no item
        printList(&head); //5 10 15 20
        deleteNode(&head,15);
        printList(&head);//5 10 20
        deleteNode(&head,20);
        printList(&head);// 5 10
        deleteNode(&head,5);
        printList(&head); //10
        deleteNode(&head,10);
        printList(&head);//Empty List
        return 0;
}

NODE *makeNode(element data)
{
        NODE *newNode;
        newNode = (NODE *)malloc(sizeof(NODE));

        newNode->llink = newNode;
        newNode->data = data;
        newNode->rlink = newNode;

        return newNode;

}

void insertNode(NODE **head,NODE* newNode)
{
        NODE *p;//q 필요없음.백업할 필요없고 rlink 이런게 있으니까

        if(*head == NULL)
        {
                *head = newNode;
                return;
        }
 p = *head;

        do
        {
                if(newNode->data < p->data)
                break;
                p = p->rlink;//뒷노드로 넘기기

        }while(p !=*head);

        if(p == *head && newNode->data < p->data)

                *head = newNode;

        {
                newNode->llink = p->llink;
                newNode->rlink = p;
                p->llink->rlink = newNode;
                p->llink = newNode;
        }
}
void printList(NODE** head)
{
        NODE *p = *head;
        if(*head == NULL)
                return;
        do{
                printf("%d\t",p->data);
                p = p->rlink;
        }while(p != *head);

        printf("\n**********************************\n");
}

void deleteNode(NODE **head,element data)
{
                NODE *p;

                if(*head == NULL)
                {
                        printf("Empty List\n");
                        return;
                }

                p = *head;
                do//지우려는 노드 찾기
                {
                        if(data == p->data)
                                break;
                        p = p->rlink;
                }while(p != *head);

                if(p == *head && p->data != data) //찾으려는 노드가 없는 상황
                {
                        printf("No item\n");
                        return;
                }
                //노드가 하나밖에 존재하지 않을 때
                if(p == p->llink && p == p->rlink)
                {
                        *head = NULL;
                        free(p);
                        return;
     }
                //첫 노드 삭제
                if(p == *head)
                        *head = p->rlink;

                        p->llink->rlink = p->rlink;
                        p->rlink->llink = p->llink;

}












결과





5       10      15      20
**********************************
No item
5       10      15      20
**********************************
5       10      20
**********************************
5       10
**********************************
10

**********************************

'IT > 자료구조' 카테고리의 다른 글

[자료구조] malloc을 이용한 더블포인터와 주소  (0) 2017.09.25
[자료구조] 배열  (0) 2017.08.03
[자료구조] 추상 데이터 타입  (0) 2017.08.01
자료구조와 알고리즘  (0) 2017.08.01