2014-12-16 2 views
0

이 프로그램은 입력 한 숫자와 동일한 데이터를 연결된 목록 (내 경우에는 10, 20, 30, ..., 100)에서 삭제해야합니다. 제대로 작동하지 않습니다. 그것은 전체 목록을 보여 주어야하지만 그것은 10 이후에 멈추고 숫자를 선택하고 나누기를 제공합니다.C 연결된 목록이있는 여러 파일 프로그램, 노드 제거

#include <stdio.h> 
#include <stdlib.h> 

#include "LinkedList.h" 
#include "LinkedList.c" 

int main() { 
    int x; 
    int change=0; 
    LINK head, curr, currB, tail; 
    head = NULL; 
    curr = NULL; 
    currB = NULL; 
    tail = NULL; 
    create_list(&head, &curr, &tail); 
    print_list(head, curr); 
    ask_for_value(&x); 
    delete_node(head, curr, currB, tail, &change, x); 
    if (0 == change) 
     printf("\nValue %d is not on the list\n", x); 
    print_list(head, curr); 
    return 0; 
} 

#include <stdio.h> 
#include <stdlib.h> 

#include "LinkedList.h" 

void create_list(LINK *head, LINK *curr, LINK *tail) { 
    int i; 
    for(i=10; i<100; i+=10) { 
     (*curr)=(LINK)malloc(sizeof(ELEMENT)); 
     (*curr)->data = i; 
     if(i==10) { 
      (*curr)->next = NULL; 
      (*tail)=(*curr); 
      (*head)=(*curr); 
     } 
     else { 
      (*curr)->next = NULL; 
      (*tail)->next = (*curr); 
      (*tail)=(*curr); 
     } 
    } 
} 

void delete_node(LINK head, LINK curr, LINK currB, LINK tail, int *change, int x) { 
    int i; 
    if(head->data==x) { 
     curr=head; 
     head=curr->next; 
     free(curr); 
     (*change)=1; 
     exit(0); 
    } 
    if(tail->data==x){ 
     curr=head; 
     while(curr->next!=tail) 
     curr=curr->next; 
     free(tail); 
     tail=curr; 
     tail->next=NULL; 
     (*change)=1; 
     exit(0); 
    } 
    curr=currB=head; 
    while(curr->data!=x || curr->next!=NULL){ 
     currB=curr; 
     curr=curr->next; 
    } 
    if(curr->data!=x) 
     exit(0); 
    if(currB==curr){ 
     head=curr->next; 
     free(curr); 
     (*change)=1; 
     exit(0); 
    } 
    currB->next=curr->next; 
    free(curr); 
    (*change)=1; 
} 

void print_list(LINK head, LINK curr) 
{ 
    curr=head; 
    if (curr!=NULL){ 
     printf("%d >> ",curr->data); 
     curr = curr->next; 
    } 
} 

void ask_for_value(int *x) { 
    printf("Enter value which should be removed from the list\n"); 
    scanf("%d", &x); 
} 

#ifndef LINKED_LIST_H_ 
#define LINKED_LIST_H_ 

struct linkedList{ 
    int data; 
    struct linkedList *next; 
    }; 
typedef struct linkedList ELEMENT; 
typedef struct linkedList *LINK; 

void create_list(LINK *head, LINK *curr, LINK *tail); 
void delete_node(LINK head, LINK curr, LINK currB, LINK tail, int *listChange, int x); 
void print_list(LINK head, LINK curr); 
void ask_for_value(int *x); 
#endif 

두 번째 파일은 LinkedList.c이며, 세 번째는


편집 LinkedList.h

입니다 : 내가 delete_node를 변경 한 모든 작동 값을 제외한 값.

당신의 ask_for_value() 기능에서 17,451,515,
void delete_node(LINK head, LINK curr, LINK currB, LINK tail, int x) { 
    curr=currB=head; 
    while(curr->data!=x && curr->next!=NULL) { 
     currB=curr; 
     curr=curr->next; 
    } 
    if(head->data==x) { 
     head=curr->next; 
     free(currB); 
    } 
    else if(tail->data==x) { 
     tail=currB; 
     tail->next=NULL; 
     free(curr); 
    } 
    else if(curr->data!=x) { 
     printf("Element with given value could not be found!\n"); 
    } 
    else{ 
     currB->next=curr->next; 
     free(curr); 
    } 
} 
+0

문제는 범위 중 하나 일 수 있습니다. 'extern'키워드, Google 사용 예 또는 여기를 검색하십시오. 'extern'은 헤더에 무언가를 정의 할 수있게 해주 며, 헤더에있는 여러 개의 .c 파일에서 사용할 수 있습니다. 동시에 모든 값을 유지합니다. 'extern'을 제외하고는 .c 파일에서 사용 된 '정적'효과와 비슷한 기능으로 전체 프로젝트에 가시성을 확장 할 수 있습니다. – ryyker

+0

'delete_node'의 가장 큰 문제점은'return' 대신'exit (0)'을 사용한다는 것입니다. 'exit (0)'은 프로그램을 즉시 종료시키고, 그것은 당신이 원하는 것이 아닙니다. 당신은 단지 서브 루틴으로부터'return '하고 싶을뿐입니다. 또한, (거의)'.c' 파일을 다른'.c' 파일에'# include '하고 싶지는 않습니다. 그래서'#include "LinkedList.c"를'main.c'에서 제거하고'gcc -Wall main.c LinkedList.c -o myProgram'을 사용하여 컴파일하십시오. – user3386109

+0

aparrent 디버깅없이 링크 된리스트. 다시. –

답변

1

,

scanf("%d", &x); 

#include .c 파일하지 않습니다, 또한

scanf("%d", x); 

해야한다. 그것들은 컴파일 될 예정이다.

다음으로 delete_node() 기능이 올바르지 않습니다. 아마도 exit(0)이 발생하여 프로그램 실행을 종료하게됩니다. 대신 return 0을 사용할 수 있습니다.

+0

나는 당신이 주목 한 그 실수를 고쳤으며, print_list에서 if에서 while으로 바뀌 었음을 알게되었다. 하지만 리턴하는 출구를 바꾸는 것은 실제로 차이를 만들어 내지 못합니다. 논스탑은 숫자를 출력하고, 다른 사람들은 응답을하지 않고, 100 개만 답을줍니다. – DevGambit

+0

@DevGambit IMO, 특히'delete_node()'함수에 많은 문제가 있습니다. 원래의 질문에있는 의견을 읽으십시오. 'delete_node()'에 6 개의 인수를 전달할 이유가 없습니다. 논리를 조금 더 세밀하게 조정하십시오. –

+0

delete_node 함수를 편집했지만 헤드 값을 삭제해도 여전히 작동하지 않습니다. – DevGambit

관련 문제