2014-01-05 4 views
0

그래서이 문제가있어서 그걸 가지고 나를 도울 수 있기를 바랍니다. 이 연결된 목록이 있고 사용자가 데이터를 입력하라는 메시지가 표시됩니다. 그것은 하나의 집합을 사용할 때 작동하지만이 연결된 목록이 1 세트 이상으로 작동하도록하고 싶습니다. 그러나 헤드 노드를 전역으로 선언 했으므로 배열하는 방법을 모르겠습니다. 문제는 세트에 데이터를 입력 할 때 두 번째 세트에 대한 입력을 유지한다는 것입니다.링크 된 목록의 전역 포인터

struct node//initializing a linked list 
{ 
    int info; 
    struct node*link; 
}*start; 

이것은 내가 내 연결리스트 생성 방법은 다음과 같습니다 :

list* createList() 
{ 
    struct node*set; 
    set=(struct node*)malloc(sizeof(struct node)); 
    if(start==NULL) 
    { 
     set->link=NULL; 
     start=set; 
    } 
    return set; 
} 

을 마지막으로이 추가 기능입니다 :

list* Add(list* set,int x) 
{ 
    struct node *tempnode; 
    if(start==NULL) 
    { 
     printf("Memory Allocation failed. Goodbye!"); 
    exit(EXIT_FAILURE); 
    } 
    set=start; 
    printf("Please enter an input: \n"); 
    scanf("%d",&x); 
    while(1) 
    { 
     while(x==set->info) 
     { 
      printf("Error! Please enter another integer: \n"); 
      scanf("%d",&x); 
      set=start; 
     } 
     if(set->link!=NULL) 
     set=set->link; 
     else 
      break; 
    } 
    tempnode=(struct node*)malloc(sizeof(struct node)); 
    tempnode->info=x; 
    tempnode->link=NULL; 
    set->link=tempnode; 
    printf("%d was created successfully!\n",x); 
    return set; 
} 
+3

글쎄, 전역 변수에서 현재 작동하는 모든 함수는 대신 인수로 작동하도록 수정해야합니다. –

+0

네,하지만 제발 그들을 줄 수있는 방법에 대한 조언을 좀 줄래? – user3141471

답변

1

는 연결리스트의 구조

Oli Charlesworth가 이미 언급했듯이, 당신이 원하는 모든리스트를 인자로 전달해야합니다. 함수는 목록을 처리합니다. 잠시 후에 그 방법을 알려 드리겠습니다. 먼저 코드에 대한 몇 가지 문제에 대해 말씀 드리겠습니다. 당신이 (scanf와 함께 할 모든 것을)를 입력에서 세트의 논리를 분리 (번호를 추가, 번호가 세트에 이미 있는지 여부를 확인)하지 않기 때문에

  • 코드는, 단 정치 못한 보인다. 대신 Add 함수 은 모든 것을 큰 덩어리로 구현합니다.

  • 또한 왜 Add에 대한 인수로 x을 전달합니까? 을 읽지 않습니다 (적어도 scanf로 덮어 쓰지 않은 후). 이것은 실제로 로컬 변수가되어야합니다. 현재 set에 대해서도 마찬가지이며, 로컬 변수로 사용합니다.

  • struct node ~ list은 합법적이며 이지만 조금 혼란 스럽습니다. (A 노드는 목록이 아닙니다.) 좋아

, 이후 귀하의 질문에 : 당신은 모든 새로운 목록의 start = NULL을 만들어야합니다. 그런 다음 start을 모든 목록 기능에 전달합니다. 하지만 여기서주의해야합니다. 대부분의 기능 (예 : 인쇄 또는 번호가 목록에 있는지 여부)은 start의 값을 변경하지 마십시오. 추가 기능을 변경해야하므로 &startstruct node **을 이러한 기능에 전달해야합니다.

다소 혼란 스럽기 때문에 대체 솔루션을 사용할 수 있습니다. 목록을 나타내는 구조체를 만들고 해당 목록의 작성자 함수를 작성한 다음 해당 구조체의 포인터에 operatoe를 작성하십시오.

  • 코드가 특정 작업을 수행 작은 기능으로 분할된다

    #include <stdlib.h> 
    #include <stdio.h> 
    
    typedef struct Set Set; 
    typedef struct Node Node; 
    
    struct Node { 
        int info; 
        Node *next; 
    }; 
    
    struct Set { 
        Node *head; 
    }; 
    
    Set *set_create() 
    { 
        Set *set = malloc(sizeof(*set)); 
    
        // enforce set != NULL 
        set->head = NULL; 
        return set; 
    } 
    
    void set_delete(Set *set) 
    { 
        Node *node = set->head; 
    
        while (node) { 
         Node *next = node->next; 
         free(node); 
         node = next; 
        } 
    } 
    
    int set_contains(const Set *set, int x) 
    { 
        const Node *node = set->head; 
    
        while (node) { 
         if (node->info == x) return 1; 
         node = node->next; 
        } 
    
        return 0; 
    } 
    
    void set_print(const Set *set) 
    { 
        const Node *node = set->head; 
    
        printf("{"); 
        while (node) { 
         if (node != set->head) printf(", "); 
         printf("%d", node->info); 
         node = node->next; 
        } 
        printf("}\n"); 
    } 
    
    Node *set_add(Set *set, int x) 
    { 
        Node *node; 
    
        if (set_contains(set, x)) return NULL; 
    
        node = malloc(sizeof(*node)); 
        // enforce node != NULL 
    
        node->info = x; 
        node->next = NULL; 
    
        if (set->head == NULL) { 
         set->head = node; 
        } else { 
         Node *iter = set->head; 
    
         while (iter->next) iter = iter->next; 
         iter->next = node; 
        } 
    
        return node; 
    } 
    
    int main() 
    { 
        Set *one = set_create(); 
        Set *two = set_create(); 
    
        set_add(one, 1); 
        set_add(one, 1); 
        set_add(one, 2); 
        set_add(one, 3); 
        set_add(one, 5); 
        set_add(one, 1); 
        set_add(one, 5); 
    
        set_add(two, 1); 
        set_add(two, 2); 
        set_add(two, 4); 
    
        set_print(one); 
        set_print(two); 
    
        set_delete(one); 
        set_delete(two); 
    
        return 0; 
    } 
    

    은 여러 가지주의 할 사항이 있습니다

    여기에 구현 한 예입니다. 그들은 서로를 부를지도 모르고 무엇이 행해졌는지 항상 분명합니다.

  • 생성자 함수 set_create은 빈 목록에 대한 포인터를 만듭니다. 그 포인터는 핸들이며, 모든 목록 기능의 첫 번째 매개 변수로 전달해야합니다.

  • 코드에서와 같이 정수를 추가하는 함수는 목록에 이미 정수가 들어 있는지 확인합니다. 그러나 set_add 함수는 사용자 입력을 처리하지 않으므로 반환 값에 노드가 실제로 추가되었는지 여부를 알립니다. 정수가 목록에 이미 있으면 NULL이고 그렇지 않으면 새 노드에 대한 포인터입니다. .

  • 목록을 만들고 정수를 추가 할 때 malloc과 함께 메모리를 할당합니다. 즉, 메모리 누수를 피할 수 있도록 free으로 메모리를 다시 해제하는 기능이 필요합니다.

  • 예제 코드는 일부 고정 배선 된 정수를 목록에 추가합니다. 사용자 입력을 처리하지 않습니다. 루프를 작성하여 main 함수에 요소를 추가 한 다음 추가 할 수 있습니다.

  • 목록의 핸들이 구조체이므로 해당 구조체에 새 필드를 추가하여 목록 인터페이스를 쉽게 확장 할 수 있습니다. 예를 들어 노드 수를 유지하거나 노드 정렬 여부를 나타내는 플래그를 유지하려고 할 수 있습니다.

+0

와우, 놀라운 대답! –