단방향 linked list
한 구조체에
값과 다음 구조체로 이어지는 주소를 갖는다
아래 그림과 같다
single linked list header file
#ifndef _SINGLE_LINKED_H_
#define _SINGLE_LINKED_H_
#include <stddef.h>
typedef struct Node_t // Node structure 만들기
{
int data; // 값
struct Node_t* Link; // 주소가 연결될 곳
}Node_t;
typedef struct Node_list
{
int length;
struct Node_t* head;
}Node_list;
Node_list* New_First_Node(void);
void appendNode(Node_list* node_l, int value);
void print_list(Node_list* node_l);
int pop(Node_list* node_l);
void find_node(Node_list* node_l, int value);
void delete_node(Node_list* node_l, int value);
#endif
single linked list c file
#include "test_h.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
Node_list* New_First_Node(void){
Node_list* startNode=malloc(sizeof(Node_list));
startNode->head=NULL;
startNode->length=0;
return startNode;
}
void appendNode(Node_list* node_l, int value){
Node_t* New_Node=malloc(sizeof(Node_t));
New_Node->Link=NULL;
New_Node->data=value;
if (node_l->head==NULL){
node_l->head=New_Node;
}
else{
Node_t* current=node_l->head;
while(current->Link!=NULL){
current=current->Link;
}
current->Link=New_Node;
}
node_l->length++;
printf("length : %d\n",node_l->length);
}
/* 삭제 종류 pop, delete*/
int pop(Node_list* node_l){
Node_t* current=node_l->head;
int temp=0;
assert(current!=NULL);
if (current->Link==NULL){
temp=current->data;
free(current);
node_l->head=NULL;
}
else{
while(current->Link->Link!=NULL){
current=current->Link;
}
temp=current->Link->data;
free(current->Link);
current->Link=NULL;
}
node_l->length--;
return temp;
}
void delete_node(Node_list* node_l, int value){
Node_t* p=node_l->head; // 노드가 저장된애들
Node_t* deleted_Node; // 지울꺼를
while(p!=NULL){
if(p->Link==NULL){
printf("없는 값 입니다.\n");
break;
}
else if(p->Link->data==value){
deleted_Node=p->Link;
p->Link=p->Link->Link;
free(deleted_Node);
node_l->length--;
break;
}
else{
p=p->Link;
}
}
}
/* 찾기 */
void find_node(Node_list* node_l, int value){ // list 반환
Node_t *fd_node=node_l->head;
while(fd_node!=NULL){
if(fd_node->data==value){
printf(" %d 은(는) 있습니다.\n",value);
break;
}
else{
fd_node=fd_node->Link;
}
}
if(fd_node==NULL){
printf(" %d 은(는) 없습니다.\n",value);
}
}
/* 출력 */
void print_list(Node_list* node_l){ // list 반환
Node_t* print_Node=node_l->head;
if (print_Node->Link!=NULL){
for(int i=0;i<node_l->length;i++){
printf("%d ->",print_Node->data);
print_Node=print_Node->Link;
}
}
printf("NULL \n");
}
single linked list main.c file
#include "test_h.h"
#include <stdio.h>
#include <stdlib.h>
int main(){
Node_list* node_l=New_First_Node();
appendNode(node_l,10);
appendNode(node_l,20);
appendNode(node_l,30);
print_list(node_l);
pop(node_l);
print_list(node_l);
find_node(node_l,10);
find_node(node_l,40);
appendNode(node_l,50);
appendNode(node_l,60);
print_list(node_l);
delete_node(node_l,20);
print_list(node_l);
}