자료구조|알고리즘
[C] 연결리스트
(*ᴗ͈ˬᴗ͈)ꕤ*.゚
2024. 9. 13. 00:00
서론
연결리스트를 C언어로 구현하고자 한다
왜냐면 자료구조 수업을 듣고있기 때문이다...
본론
구조체 정의
// 단순 연결리스트의 노드 구조 정의
typedef struct ListNode {
int data;
struct ListNode* link;
} listNode;
// 리스트의 헤드 노드 구조 정의
typedef struct {
listNode* head;
} linkedList_h;
연결리스트 생성
linkedList_h* createLinkedList_h(void) {
linkedList_h* H;
H = (linkedList_h*)malloc(sizeof(linkedList_h));
H -> head = NULL;
return H;
}
노드 삽입
void addNode(linkedList_h* H, int x) {
listNode* NewNode;
listNode* LastNode;
NewNode = (listNode*)malloc(sizeof(listNode));
NewNode -> data = x;
NewNode -> link = NULL;
// 연결되어 있지 않은 경우
if (H -> head == NULL) {
H -> head = NewNode;
return;
}
// 리스트의 첫번째 노드부터 시작
LastNode = H -> head;
// 마지막으로 연결되어있는 노드를 찾음
while(LastNode -> link != NULL) {
LastNode = LastNode -> link;
}
// 삽입된 노드를 연결리스트 마지막에 추가
LastNode -> link = NewNode;
}
중간에 노드 삽입
void addItNode(linkedList_h* H, listNode* prevNode, int itData) {
listNode* NewNode;
NewNode = (listNode*)malloc(sizeof(listNode));
NewNode -> data = itData;
NewNode -> link = NULL;
NewNode -> link = prevNode -> link;
prevNode -> link = NewNode;
return;
}
노드 삭제
void deleteNode(linkedList_h* H) {
listNode* prevNode;
listNode* delNode;
// 공백 리스트인 경우
if (H -> head == NULL) return;
// 리스트 노드가 한 개인 경우
if (H -> head -> link == NULL) {
free(H -> head);
H -> head = NULL;
return;
}
// 리스트에 노드가 여러 개 있는 경우
prevNode = H -> head;
delNode = H -> head -> link;
while(delNode -> link != NULL) {
prevNode = delNode;
delNode = delNode -> link;
}
free(delNode);
prevNode -> link = NULL;
}
중간 노드 삭제
void deleteItNode(linkedList_h* H, listNode* prevNode, listNode* delNode) {
prevNode -> link = delNode -> link;
free(delNode);
return;
}
특정 노드 삭제
void findAndDeleteNode(linkedList_h* H, int itData) {
listNode* prevNode;
listNode* delNode;
// 공백 리스트
if (H -> head == NULL) return;
prevNode = H -> head;
delNode = H -> head;
while (delNode != NULL) {
if (delNode -> data == itData) {
deleteItNode(H, prevNode, delNode);
return;
}
prevNode = delNode;
delNode = delNode -> link;
}
}
결론
c언어에 좀 더 익숙해져야겠다