C언어 연결리스트에서 node끼리 data를 비교하는 방법이있을까요?
C언어 연결리스트에서 노드의 조건(규칙)에 맞게 예를들어 현재노드가 문자 'a'가 입력되면
다음노드가 문자 'b'가 나오는 조건이여야 성공, 그 외에 문자가 입력되면 error 메세지가 출력되게
프로그램 종료가 되게 함수를 작성하고싶습니다. 3일동안 고민해도 안되더군요ㅠ
여기서 도움을 빌려보려고합니다.
55글자 더 채워주세요.
1개의 답변이 있어요!
질문을 이해하기가 힘들군요...ㅠㅠ 질문 내용이 연결 리스트를 순회하는 방법이 맞나요?
#include <stdio.h> #include <stdlib.h> typedef enum { false = 0, true } bool; typedef struct _tagLinkedList_node { // 질문 내용으로 그 연결 리스트의 구조를 알 수 없어서 임의의 구조를 사용하였습니다. struct _tagLinkedList_node *next; void *value; } LinkedList_node, *LinkedList_Node; typedef struct _tagLinkedList { int length; LinkedList_Node head, tail; } *LinkedList; LinkedList new_LinkedList() // 생성 { LinkedList ret = malloc(sizeof(struct _tagLinkedList)); if(!ret) return NULL; ret->length = 0; ret->tail = ret->head = NULL; return ret; } void LinkedList_release(LinkedList self) // 삭제 { LinkedList_node *tmp = self->head, *temp; while(tmp->next) { temp = tmp; free(tmp); tmp = temp->next; } free(tmp); } bool LinkedList_append(LinkedList self, int *idx, void *value) // 추가 { LinkedList_Node tmp = malloc(sizeof(LinkedList_node)); if(tmp == NULL) { return false; } tmp->next = NULL; tmp->value = value; if(self->head) { self->tail = self->tail->next = tmp; } else { self->head = self->tail = tmp; } if(idx) { *idx = self->length; } self->length++; return true; } bool LinkedList_set(LinkedList self, int idx, void *value) // 값 변경 { if(idx > self->length) { return false; } else if(idx == self->length) { return LinkedList_append(self, NULL, value); } int i; LinkedList_Node tmp = self->head; for(i = 0; i < idx; i++) { tmp = tmp->next; } tmp->value = value; return true; } bool LinkedList_iterate(LinkedList self, bool (*func)(void *value)) // 순회 { LinkedList_Node tmp; for(tmp = self->head; tmp; tmp = tmp->next) // head부터 시작해서 NULL이 될 때까지 { // 그 노드에서 할 거 다 하고, 그 다음에 노드를 다음으로 이동(tmp = tmp->next)시킵니다. if((*func)(tmp->value)) return true; } return false; } char prev; bool check(void *value) // 이 함수로 순회합니다. { char tmp = *((const char *)value); if(prev && tmp != prev + 1) { prev = tmp; return true; } prev = tmp; return false; } int main(int argc, char **argv) { int i; LinkedList test = new_LinkedList(); LinkedList_append(test, NULL, "a"); LinkedList_append(test, NULL, "b"); LinkedList_append(test, NULL, "c"); LinkedList_append(test, NULL, "d"); LinkedList_append(test, NULL, "e"); prev = '\0'; if(LinkedList_iterate(test, &check)) // 순회 { printf("문제 있음!\n"); } else { printf("문제 없음.\n"); } LinkedList_set(test, 2, "x"); prev = '\0'; if(LinkedList_iterate(test, &check)) // 순회 { printf("문제 있음!\n"); } else { printf("문제 없음.\n"); } return 0; }(원본 코드 출처)
이 코드의 LinkedList_iterate 함수를 보시면 도움이 될 것 같습니다.