아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
견실한도롱이156
견실한도롱이15619.04.09

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 함수를 보시면 도움이 될 것 같습니다.