컴공 일기93
게시글 주소: https://orbi.kr/00057343904
오늘 코딩은 요기까지예용!
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int Data;
struct Node* NextNode;
//단방향 연결 리스트
};
//노드 생성
Node* SLL_CreateNode(int NewData)
{
Node* NewNode = (Node*)malloc(sizeof(Node));
NewNode->Data = NewData;
NewNode->NextNode = NULL;
return NewNode;
}
//노드 메모리 해제
void SLL_DestroyNode(Node* Node)
{
free(Node);
}
//노드 추가
void SLL_AppendNode(Node** Head, Node* NewNode)
{
if ((*Head) == NULL)
{
*Head = NewNode;
}
else
{
Node* Tail = *Head;
while (Tail->NextNode != NULL)
{
Tail = Tail->NextNode;
}
Tail->NextNode = NewNode;
}
}
//노드 탐색
Node* SLL_GetNodeAt(Node* Head, int Location)
{
Node* Current = Head;
while (Current != NULL && (--Location) >= 0)
{
Current = Current->NextNode;
}
return Current;
}
//노드 삭제
void SLL_RemoveNode(Node** Head, Node* Remove)
{
if (*Head == Remove)
{
*Head = Remove->NextNode;
}
else {
Node* Current = *Head;
while (Current != NULL && Current->NextNode != Remove)
{
Current = Current->NextNode;
}
if (Current != NULL)
Current->NextNode = Remove->NextNode;
}
}
//노드 정방향 삽입
void SLL_InsertAfter(Node* Current, Node* NewNode)
{
NewNode->NextNode = Current->NextNode;
Current->NextNode = NewNode;
}
//노드 역방향 삽입
void SLL_InsertBefore(Node**Head, Node* Current, Node* NewHead)
{
Node* Tail = (*Head);
while (Tail->NextNode != Current)
{
Tail = Tail->NextNode;
}
Tail->NextNode = NewHead;
NewHead->NextNode = Current;
}
//헤드 노드 정방향 삽입
void SLL_InsertNewHead(Node** Head, Node* NewHead)
{
if (*Head == NULL)
{
(*Head) = NewHead;
}
else
{
NewHead->NextNode = (*Head);
(*Head) = NewHead;
}
}
//노드 개수 세기
int SLL_GetNodeCount(Node* Head)
{
int Count = 0;
Node* Current = Head;
while (Current != NULL)
{
Current = Current->NextNode;
Count++;
}
return Count;
}
//전체 노드 출력
void SLL_PrintAllNodes(Node* List)
{
Node* Current = List;
while (Current != NULL)
{
printf("%d\n", Current->Data);
Current = Current->NextNode;
}
}
int main()
{
int i = 0;
int Count = 0;
Node* List = NULL;
Node* Current = NULL;
Node* NewNode = NULL;
for (i = 0; i < 5; i++)
{
NewNode = SLL_CreateNode(i);
SLL_AppendNode(&List, NewNode);
}
NewNode = SLL_CreateNode(-1);
SLL_InsertNewHead(&List, NewNode);
NewNode = SLL_CreateNode(-2);
SLL_InsertNewHead(&List, NewNode);
Count = SLL_GetNodeCount(List);
for (i = 0; i < Count; i++)
{
Current = SLL_GetNodeAt(List, i);
printf("List[%d] : %d\n", i, Current->Data);
}
printf("\nInserting 3000 After[2].... \n\n");
Current = SLL_GetNodeAt(List, 2);
NewNode = SLL_CreateNode(3000);
SLL_InsertAfter(Current, NewNode);
printf("\nInserting 2999 Before 3000...\n\n");
Current = SLL_GetNodeAt(List, 3);
NewNode = SLL_CreateNode(2999);
SLL_InsertBefore(&List, Current, NewNode);
Count = SLL_GetNodeCount(List);
for (i = 0; i < Count; i++)
{
Current = SLL_GetNodeAt(List, i);
printf("List[%d] : %d\n", i, Current->Data);
}
printf("\n");
printf("Printed by SLL_PrintAllNodes\n");
SLL_PrintAllNodes(List);
printf("\nDestroying List.... Thanks.");
for (i = 0; i < Count; i++)
{
Current = SLL_GetNodeAt(List, 0);
if (Current != NULL)
{
SLL_RemoveNode(&List, Current);
SLL_DestroyNode(Current);
}
}
}
실행결과 :
List[0] : -2
List[1] : -1
List[2] : 0
List[3] : 1
List[4] : 2
List[5] : 3
List[6] : 4
Inserting 3000 After[2]....
Inserting 2999 Before 3000...
List[0] : -2
List[1] : -1
List[2] : 0
List[3] : 2999
List[4] : 3000
List[5] : 1
List[6] : 2
List[7] : 3
List[8] : 4
Printed by SLL_PrintAllNodes
-2
-1
0
2999
3000
1
2
3
4
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
회원에 의해 삭제된 댓글입니다.좋아요 0