2017-10-24 2 views
-2

그래서 정수만 구문을 생각해 냈습니다. typedefvoid*을 사용하여 모든 데이터 형식의 구문을 가장 잘 작성하는 방법은 지금 void push_back 명령을 사용하는 방법을 알고 싶습니다.모든 데이터 유형에 대한 단일 연결 목록, 삽입 구현, 삭제 및 C 언어로 요소를 찾으십시오

링크 된 목록을 만들고, 노드를 추가하고, 노드를 삭제하고, 목록에있는 모든 노드를 찾습니다. 첫 번째 노드는 항상 전역 'head'포인터를 통해 액세스 할 수 있습니다. 이 포인터는 첫 번째 노드가 삭제 될 때 조정됩니다. 마찬가지로 목록의 마지막 노드를 포함하는 'curr'포인터가 있습니다. 마지막 노드가 삭제 될 때 조정됩니다. 노드가 연결된 목록에 추가 될 때마다 항상 연결된 목록이 비어 있는지 확인한 다음 첫 번째 노드로 추가합니다.

#include<stdbool.h>을 사용하지 않고 연결된 목록에서 노드를 추가, 삭제 및 찾을 수있는 다른 방법이 있습니까?

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

struct test_struct 
{ 
    int val; 
    struct test_struct *next; 
}; 

struct test_struct *head = NULL; 
struct test_struct *curr = NULL; 

struct test_struct* create_list(int val) 
{ 
    printf("\n creating list with headnode as [%d]\n",val); 
    struct test_struct *ptr = (struct test_struct*)malloc(sizeof(struct test_struct)); 
    if(NULL == ptr) 
    { 
     printf("\n Node creation failed \n"); 
     return NULL; 
    } 
    ptr->val = val; 
    ptr->next = NULL; 

    head = curr = ptr; 
    return ptr; 
} 

struct test_struct* add_to_list(int val, bool add_to_end) 
{ 
    if(NULL == head) 
    { 
     return (create_list(val)); 
    } 

    if(add_to_end) 
     printf("\n Adding node to end of list with value [%d]\n",val); 
    else 
     printf("\n Adding node to beginning of list with value [%d]\n",val); 

    struct test_struct *ptr = (struct test_struct*)malloc(sizeof(struct test_struct)); 
    if(NULL == ptr) 
    { 
     printf("\n Node creation failed \n"); 
     return NULL; 
    } 
    ptr->val = val; 
    ptr->next = NULL; 

    if(add_to_end) 
    { 
     curr->next = ptr; 
     curr = ptr; 
    } 
    else 
    { 
     ptr->next = head; 
     head = ptr; 
    } 
    return ptr; 
} 

struct test_struct* search_in_list(int val, struct test_struct **prev) 
{ 
    struct test_struct *ptr = head; 
    struct test_struct *tmp = NULL; 
    bool found = false; 

    printf("\n Searching the list for value [%d] \n",val); 

    while(ptr != NULL) 
    { 
     if(ptr->val == val) 
     { 
      found = true; 
      break; 
     } 
     else 
     { 
      tmp = ptr; 
      ptr = ptr->next; 
     } 
    } 

    if(true == found) 
    { 
     if(prev) 
      *prev = tmp; 
     return ptr; 
    } 
    else 
    { 
     return NULL; 
    } 
} 

int delete_from_list(int val) 
{ 
    struct test_struct *prev = NULL; 
    struct test_struct *del = NULL; 

    printf("\n Deleting value [%d] from list\n",val); 

    del = search_in_list(val,&prev); 
    if(del == NULL) 
    { 
     return -1; 
    } 
    else 
    { 
     if(prev != NULL) 
      prev->next = del->next; 

     if(del == curr) 
     { 
      curr = prev; 
     } 
     else if(del == head) 
     { 
      head = del->next; 
     } 
    } 

    free(del); 
    del = NULL; 

    return 0; 
} 

void print_list(void) 
{ 
    struct test_struct *ptr = head; 

    printf("\n -------Printing list Start------- \n"); 
    while(ptr != NULL) 
    { 
     printf("\n [%d] \n",ptr->val); 
     ptr = ptr->next; 
    } 
    printf("\n -------Printing list End------- \n"); 

    return; 
} 

int main(void) 
{ 
    int i = 0, ret = 0; 
    struct test_struct *ptr = NULL; 

    print_list(); 

    for(i = 5; i<10; i++) 
     add_to_list(i,true); 

    print_list(); 

    for(i = 4; i>0; i--) 
     add_to_list(i,false); 

    print_list(); 

    for(i = 1; i<10; i += 4) 
    { 
     ptr = search_in_list(i, NULL); 
     if(NULL == ptr) 
     { 
      printf("\n Search [val = %d] failed, no such element found\n",i); 
     } 
     else 
     { 
      printf("\n Search passed [val = %d]\n",ptr->val); 
     } 

     print_list(); 

     ret = delete_from_list(i); 
     if(ret != 0) 
     { 
      printf("\n delete [val = %d] failed, no such element found\n",i); 
     } 
     else 
     { 
      printf("\n delete [val = %d] passed \n",i); 
     } 

     print_list(); 
    } 

    return 0; 
} 
+0

[다른 데이터 유형의 링크 된 목록을 가질 수 있습니까?] (https://stackoverflow.com/questions/1131313/is-it-possible-to-have-a-linked-list- –

답변

0

삭제하고 #include<stdbool.h>을 사용하지 않고 연결리스트의 노드를 찾아 추가 할 수 anyother 방법이 있습니까?

예, 코드에 bool 유형을 사용하지 마십시오.

+0

정수뿐만 아니라 모든 데이터 형식을 허용하도록 코드로 어떻게 변경할 수 있습니까? –

+0

int 데이터를 저장하는 대신에 void *를 데이터에 저장하는 것이 다소 까다 롭습니다. 이는 지적 객체의 수명을 관리하는 데 추가적인 복잡성을 가중 시키며 어떤 노드에 어떤 데이터 유형이 있는지 추적해야 할 수도 있습니다. 나중에 호출자에게이 비트를 남겨두면 단순히 목록에 하나의 유형 만 포함되며 문제는 부적절하다고 결정할 수 있습니다. @AlexandreDupriez 님의 OP에 대한 의견을 확인하십시오. – jwdonahue