int main(void)
{
// 리스트의 가장 처음 노드를 가르키는 포인터
int menu = 0;
while(menu!=5){
printf("학생 정리 관리 프로그램 \n --------------------------------------------------------------------------------\n1. 학생 정보 입력\n2. 학생 정보 삭제\n3. 학생 검색\n4. 학생 정보 출력\n5. 프로그램 종료\n--------------------------------------------------------------------------------\n메뉴 선택 : ");
scanf("%d",&menu);
switch(menu){
case 1:
addNode(&head); //학생정보 추가
break;
case 2:
del_node(); //모든학생의 데이터 삭제
break;
case 3:
search_node(); //학생의 생년월일을 입력하고 해당학생을 찾아 출력
break;
case 4:
print_node(); //모든학생정보를 출력
break;
case 5:
free_node(); //종료
break;
}
}
return 0;
}
addNode()
//현재 리스트의 맨 뒤에 노드를 추가해주는 함수
void addNode(NODE **head)
{
// 전달받은 값을 저장하는 새로운 노드를 생성한다.
NODE *newNode = createNode();
// 헤드에 아무것도 없을 경우
// 즉, 현재 노드가 하나도 없을 경우
if(*head == NULL)
{
// 헤드에 생성한 노드를 연결
*head = newNode;
}
else
{
NODE *temp = *head;
// 마지막 노드를 찾는 루프
while(temp->next != NULL)
{
temp = temp->next;
}
// 마지막 노드일 경우 새로 생성한 노드 연결
temp->next = newNode;
}
}
del_node()
void del_node(){
NODE * curr = head;
char yesorno[20];
printf("정말 모든학생의 정보를 삭제하시겠습니까? (yes or no) : ");
scanf("%s",yesorno);
if(strcmp(yesorno,"yes") ==0 || strcmp(yesorno,"YES") ==0 ) //yesorno가 yes이거나 YES일떄 strcmp비교를통해 같으면 0이 반환 됨
{
head = NULL;
}
}
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* next;
}NODE;
//전달받은 데이터를 저장하는 하나의 노드를 생성하는 함수
NODE* createNode(int data)
{
NODE *temp = (NODE*)malloc(sizeof(NODE));
temp->next = NULL;
temp->data = data;
return temp;
}
//현재 리스트의 맨 뒤에 노드를 추가해주는 함수
void addNode(NODE **head, int data)
{
// 전달받은 값을 저장하는 새로운 노드를 생성한다.
NODE *newNode = createNode(data);
// 헤드에 아무것도 없을 경우
// 즉, 현재 노드가 하나도 없을 경우
if(*head == NULL)
{
// 헤드에 생성한 노드를 연결
*head = newNode;
}
else
{
NODE *temp = *head;
// 마지막 노드를 찾는 루프
while(temp->next != NULL)
{
temp = temp->next;
}
// 마지막 노드일 경우 새로 생성한 노드 연결
temp->next = newNode;
}
}
int main(void)
{
// 리스트의 가장 처음 노드를 가르키는 포인터
NODE *head = NULL;
// 맨 뒤에 데이터 '10'을 가진 노드를 추가
addNode(&head, 10);
// 맨 뒤에 데이터 '20'을 가진 노드를 추가
addNode(&head, 20);
// 맨 뒤에 데이터 '30'을 가진 노드를 추가
addNode(&head, 30);
NODE * curr = head;
while(curr != NULL){
printf("%d\n",curr->data);
curr = curr->next;
}
curr = head -> next;
while(curr != NULL){
free(curr);
curr = curr->next;
}
return 0;
}
각 노드가 데이터와 포인터를 가지고 한줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조입니다.
데이터를 담고있는 노드들이 연결되어있는데 노드의 포인터가 다음or이전의 노드와 연결되어있다.
struct NODE { // 연결 리스트의 노드 구조체
struct NODE *next; // 다음 노드의 주소를 저장할 포인터
int data; // 데이터를 저장할 멤버
};
Node구조체에서 struct NODE *next; 이부분은 다음노드(or이전노드)의 메모리 주소(포인터) 를 저장해야한다.
즉 자기 자신이 아닌 다른 노드의 메모리 주소를 저장하고있다. 이점이 매우 중요하고 핵심이다.
위 예제에서는 int 형 data를 하나만 넣었지만 String int char등 여러개의 데이터가 구조체 멤버에 들어갈수있다.
단일 연결리스트의 노드 종류
ㅁ
º head node : 단일 연결리스트의 기준점이며 헤드 노드(head node)라고 부른다. 헤드 노드는 첫번째 노드를 가리키며
데이터를 저장하지 않는다.
º 노드(node) : 단일 연결리스트에서 데이터가 저장되는 실제 노드이다.
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
typedef struct node { // 연결 리스트의 노드 구조체
struct node *next; // 다음 노드의 주소를 저장할 포인터
int data; // 데이터를 저장할 멤버
}NODE;
int main()
{
NODE *head = (NODE*)malloc(sizeof( NODE)); // 머리 노드 생성
// 머리 노드는 데이터를 저장하지 않음
NODE *node1 = (NODE*)malloc(sizeof( NODE)); // 첫 번째 노드 생성
head->next = node1; // 머리 노드 다음은 첫 번째 노드
node1->data = 10; // 첫 번째 노드에 10 저장
NODE *node2 = (NODE*)malloc(sizeof( NODE)); // 두 번째 노드 생성
node1->next = node2; // 첫 번째 노드 다음은 두 번째 노드
node2->data = 20; // 두 번째 노드에 20 저장
node2->next = NULL; // 두 번째 노드 다음은 노드가 없음(NULL)
NODE *curr = head->next; // 연결 리스트 순회용 포인터에 첫 번째 노드의 주소 저장
while (curr != NULL) // 포인터가 NULL이 아닐 때 계속 반복
{
printf("%d\n", curr->data); // 현재 노드의 데이터 출력
curr = curr->next; // 포인터에 다음 노드의 주소 저장
}
free(node2); // 노드 메모리 해제
free(node1); // 노드 메모리 해제
free(head); // 머리 노드 메모리 해제
return 0;
}
<실행결과>
<예제2>
#include <stdio.h>
#include <stdlib.h>
//start = head
struct node{
struct node* next;
int age;
};
int main(){
struct node* start = (struct node*) malloc(sizeof(struct node));
struct node* node1 = (struct node*) malloc(sizeof(struct node));
start -> next = node1;
node1 -> age = 100;
struct node* node2 = (struct node*) malloc(sizeof(struct node));
node1 -> next = node2;
node2 -> age = 200;
struct node* node3 = (struct node*)malloc(sizeof(struct node));
node2 -> next = node3;
node3 -> age = 400;
node3 -> next = NULL;
struct node* ptr = start->next;
while(ptr != NULL){
printf("%d\n",ptr->age);
ptr=ptr->next;
}
return 0;
}