"C언어 연결리스트 2"의 두 판 사이의 차이

(새 문서: ==개요== ;C언어 연결 리스트 구현 2 <source lang='c'> #include <stdio.h> #include <stdlib.h> // 노드 타입 정의 typedef struct NodeStruct { int value; struct NodeSt...)
 
잔글 (Jmnote님이 C언어 연결 리스트 구현 2 문서를 C언어 연결리스트 2 문서로 이동했습니다)
 
(사용자 2명의 중간 판 10개는 보이지 않습니다)
2번째 줄: 2번째 줄:
;C언어 연결 리스트 구현 2
;C언어 연결 리스트 구현 2


<source lang='c'>
<syntaxhighlight lang='c' run>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>


// 노드 타입 정의
// 노드 정의
typedef struct NodeStruct {
typedef struct NodeStruct {
int value;
int value;
struct NodeStruct *next;
struct NodeStruct *next;
} Node;
} Node;
// 리스트 포인터 (리스트의 시작점, 전역변수)
Node* head = NULL;
Node* head = NULL;


// 노드 생성 (메모리 할당)
Node* createNode(int value) {
Node* createNode(int value) {
Node* p = malloc(sizeof(Node));
Node* p = malloc(sizeof(Node));
20번째 줄: 22번째 줄:
}
}


// 노드 삭제
// 노드 소멸 (메모리 해제)
void unsetNode(Node* node) {
void destroyNode(Node* node) {
free(node);
free(node);
node = NULL;
node = NULL;
}
}


// 노드 추가  
// 리스트 맨 뒤에 노드 추가  
void append(Node* node) {
void append(Node* node) {
     if( head == NULL ) {
     if( head == NULL ) {
37번째 줄: 39번째 줄:
}
}


// 선택 위치에 노드 추가
// 리스트의 지정한 위치에 노드 추가
void insertAt(int index, Node* newNode) {
void insertAt(int index, Node* newNode) {
if( index == 0 ) {
if( index == 0 ) {
50번째 줄: 52번째 줄:
}
}


// 선택 위치에 노드 추가
// 리스트에서 지정한 위치의 노드 삭제
void deleteAt(int index) {
void deleteAt(int index) {
if( index == 0 ) {
if( index == 0 ) {
    Node* u = head;
    Node* u = head;
    head = head->next;
    head = head->next;
    unsetNode(u);
    destroyNode(u);
    return;
    return;
}
}
62번째 줄: 64번째 줄:
Node* u = p->next;
Node* u = p->next;
     p->next = p->next->next;
     p->next = p->next->next;
     unsetNode(u);
     destroyNode(u);
}
}


// 노드 출력
// 리스트의 모든 노드 출력
void printList() {
void printList() {
     Node* p = head;
     Node* p = head;
75번째 줄: 77번째 줄:
}
}


// 메인 함수
int main() {
int main() {
     append(createNode(1));
     append(createNode(1));
81번째 줄: 84번째 줄:
     append(createNode(4));
     append(createNode(4));
     printList();
     printList();
    // 1 2 3 4


     insertAt(0, createNode(8));
     insertAt(0, createNode(8));
     printList();
     printList();
    // 8 1 2 3 4
     insertAt(3, createNode(9));
     insertAt(3, createNode(9));
     printList();
     printList();
    // 8 1 2 9 3 4
      
      
     deleteAt(0);
     deleteAt(0);
     printList();
     printList();
    // 1 2 9 3 4
     deleteAt(2);
     deleteAt(2);
     printList();
     printList();
    // 1 2 3 4
}
}
// 1 2 3 4
 
// 8 1 2 3 4
</syntaxhighlight>
// 8 1 2 9 3 4
// 1 2 9 3 4
// 1 2 3 4
</source>


==같이 보기==
==같이 보기==
* [[C언어 연결 리스트 구현]]
* [[C언어 연결 리스트 구현]]
[[분류: C]][[분류: 연결 리스트]]

2023년 8월 19일 (토) 20:16 기준 최신판

1 개요[ | ]

C언어 연결 리스트 구현 2
#include <stdio.h>
#include <stdlib.h>

// 노드 정의
typedef struct NodeStruct {
	int value;
	struct NodeStruct *next;
} Node;
// 리스트 포인터 (리스트의 시작점, 전역변수)
Node* head = NULL;

// 노드 생성 (메모리 할당)
Node* createNode(int value) {
	Node* p = malloc(sizeof(Node));
	p->value = value;
	p->next = NULL;
	return p;
}

// 노드 소멸 (메모리 해제)
void destroyNode(Node* node) {
	free(node);
	node = NULL;
}

// 리스트 맨 뒤에 노드 추가 
void append(Node* node) {
    if( head == NULL ) {
        head = node;
        return;
    }
    Node* p = head;
    while( p->next != NULL ) p = p->next;
    p->next = node;
}

// 리스트의 지정한 위치에 노드 추가
void insertAt(int index, Node* newNode) {
	if( index == 0 ) {
	    newNode->next = head;
	    head = newNode;
	    return;
	}
	Node* p = head;
	for(int i=0; i<index-1; i++) p = p->next;
    newNode->next = p->next;
	p->next = newNode;
}

// 리스트에서 지정한 위치의 노드 삭제
void deleteAt(int index) {
	if( index == 0 ) {
	    Node* u = head;
	    head = head->next;
	    destroyNode(u);
	    return;
	}
	Node* p = head;
	for(int i=0; i<index-1; i++) p = p->next;
	Node* u = p->next;
    p->next = p->next->next;
    destroyNode(u);
}

// 리스트의 모든 노드 출력
void printList() {
    Node* p = head;
	while(p != NULL) {
		printf("%d ", p->value);
		p = p->next;
	}
	printf("\n");
}

// 메인 함수
int main() {
    append(createNode(1));
    append(createNode(2));
    append(createNode(3));
    append(createNode(4));
    printList();
    // 1 2 3 4 

    insertAt(0, createNode(8));
    printList();
    // 8 1 2 3 4 
    insertAt(3, createNode(9));
    printList();
    // 8 1 2 9 3 4 
    
    deleteAt(0);
    printList();
    // 1 2 9 3 4 
    deleteAt(2);
    printList();
    // 1 2 3 4
}

2 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}