//*************************************//
//
// C로 만든 연결리스트
//
// 만든이 :
// 만든 날짜 : 2011.03.22
//
// 연결리스트가 해야 할 일
// 1. linked list에 insert
// 2. linked list에 delete
// 3. linked list를 print
//*************************************//
#include <stdio.h>
#include <stdlib.h>
// 자료 객체 하나
struct node {
// 다음의 구조체 노드를 가리키는 포인터
node* next;
// 노드의 실질적인 데이터
int data;
};
// 노들들이 저장될 구조체
struct nodeList {
// 총 목록개수
int count;
// 맨 앞 노드를 가리키는 헤드 포인터
node* head;
};
int insert_node(nodeList*, const int, const int);
int delete_node(nodeList*, const int);
void list_print(nodeList* const);
int main() {
// 노드리스트를 하나 만들고 초기화한다.
// 처음엔 아무것도 들어있지 않다.
nodeList list = { 0, NULL };
insert_node( &list, 10, 0 );
insert_node( &list, 20, 1 );
insert_node( &list, 30, 2 );
insert_node( &list, 40, 3 );
insert_node( &list, 50, 4 );
insert_node( &list, 60, 5 );
insert_node( &list, 70, 6 );
delete_node( &list, 6);
list_print( &list );
return 0;
}
// list에 있는 data의 값을 index와 함께 print한다.
// list의 내용이 변하면 안되기에 const로 선언하였다.
void list_print(nodeList* const list) {
node* order = list->head;
if( list->count )
for(int i = 0; order != NULL; i++) {
printf("index : %d // data : %d \\n", i, order->data);
order = order->next;
}
else printf("아무 노드도 없습니다.\\n");
printf("현재 노드의 개수 : %d \\n", list->count);
}
// 값이 data인 새 노드를 index(location)에 추가한다.
// location과 data의 값은 바뀌면 안되기에 const로 선언하였다.
int insert_node(nodeList* list, const int data, const int location) {
node* temp;
node* newNode;
int index = location;
// 어떤 노드도 없으면 ( count = 0 이면 )
if( !(list->count) ) {
// 새 노드를 할당한다. 새 노드는 곧 제일 처음의 노드이므로 head에 할당한다.
list->head = (node *) malloc(sizeof(node));
// 노드의 데이터의 값을 넣어준다.
list->head->data = data;
// 다음 노드(두번쨰 노드)를 가리키는 포인터값을 널값으로 설정한다.
list->head->next = NULL;
printf("노드가 아무것도 없으므로 노드를 새로 만듭니다.\\n");
} else { // 노드가 있다면
// 노드 검색을 위하여 newNode가 가리키는 위치를 제일 앞 노드로 한다.
newNode = list->head;
// location의 값이 마지막이거나 마지막을 넘을경우 맨 마지막에 노드를 넣는다.
if( location >= list->count ) {
index = list->count;
printf("추가할 노드의 위치가 끝이거나 끝을 넘어서서 마지막에 추가합니다.\\n");
}
// newNode를 새 노드가 삽일될 위치로 옮긴다.
for( int i = 1; i < index; i++ ) newNode = newNode->next; // 새 노드가 삽일될 위치까지 반복한다.
// 임시로 현재 가리키고 있는 노드의 주소를 저장한다.
temp = newNode->next;
// 추가할 새 노드를 할당한다.
newNode->next = (node *) malloc( sizeof(node) );
// 새 노드에 데이터의 값을 넣는다.
newNode->next->data = data;
// 새 노드의 다음 노드를 지정한다.
newNode->next->next = temp;
}
// list에 연결된 노드의 개수를 증가시킨다.
list->count++;
return 0;
}
// index 번째에 있는 노드를 삭제한다.
// index값은 바뀌면 안되기에 const로 선언하였다.
int delete_node(nodeList* list, const int index) {
node* temp;
node* nPtr; // 다음 노드를 가리킬 노드 포인터
// 삭제할 노드의 위치가 노드의 개수와 같거나 넘어선다면 함수를 종료한다.
// index > count -1 가 index >= count 이 된다.
if( index >= list->count ) return 1;
temp = list->head;
// index의 값이 0이 아니라면
if( index ) {
// 해당 노드의 바로 전 위치로 간다.
for( int i = 1; i < index; i++) temp = temp->next;
nPtr = temp->next->next;
free(temp->next);
temp->next = nPtr;
} else { // index의 값이 0이면
// head가 다음 노드의 값을 가리키게한다.
list->head = list->head->next;
free(temp);
}
list->count--;
return 0;
}
빈틈은 있지만 오늘은 여기까징~~
내일은 C++로 만들어야징~!~ 헤헤
횽님들 잘자여
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.