ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자료구조] CircularDoubleLinkedList.c
    자료구조 2023. 5. 9. 22:47
    // 백준 solved
    // 원형 양방향 연결리스트
    // cl->head 포인터를 통해 전체 리스트 접근
    
    #pragma warning(disable:4996)
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int CLdata ; // 자료형만 바꿔주기
    
    typedef struct _node {
    	struct _node* prev;
    	CLdata data;
    	struct _node* next;
    }Node;
    
    typedef struct _CircularDoubleLinkedList {
    	Node* head;
    }cl;
    
    void CLInit(cl* clp) {
    	clp->head = NULL;
    }
    
    void CLInsert(cl* clp, CLdata data) {
    	Node* newNode = (Node*)malloc(sizeof(Node));
    	newNode->data = data;
    
    	// 첫번째 원소이면
    	if (clp->head == NULL) {
    		clp->head = newNode;
    		newNode->next = newNode;
    		newNode->prev = newNode;
    	}
    	// 중간번째 원소이면
    	else {
    		Node* temp = clp->head;
    		while (temp->next != clp->head) {
    			temp = temp->next;
    		}
    
    		newNode->prev = temp;
    		newNode->next = temp->next;
    		temp->next = newNode;
    		clp->head->prev = newNode;
    	}
    }
    
    // idx번째 원소 삭제
    CLdata CLDelete(cl* clp, int idx) {
    
    	// 마지막 원소 삭제
    	// head 삭제
    	Node* cur = clp->head;
    	for (int i = 0; i < idx - 1; i++) {
    		cur = cur->next;
    	}
    
    	CLdata retdata = cur->data;
    	Node* delNode = cur;
    
    	// head 삭제일때
    	if (cur == clp->head) {
    		clp->head->prev->next = clp->head->next;
    		clp->head->next->prev = clp->head->prev;
    		clp->head = cur->next;
    	}
    	else {
    		cur->prev->next = cur->next;
    		cur->next->prev = cur->prev;
    	}
    
    	free(delNode);
    	return retdata;
    }
    
    int main() {
    	cl clist;
    	CLInit(&clist);
    	
        // code
        
    	return 0;
    }

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

    [자료구조] CircularQueue.c  (0) 2023.05.09
    [자료구조] Deque.c  (0) 2023.05.09
    [자료구조] Stack.c  (0) 2023.05.09
    [자료구조] 연결리스트(DLinkedList)  (0) 2023.02.13
    [자료구조] Graph.c  (0) 2023.02.11