2017-10-24 1 views
-2

私は整数のみの構文を思いついた。どのようにすべてのデータ型の構文を書くのが最も好都合で、typedefvoid*を使用して、今すぐvoid push_backコマンドを使用したいと思っています。すべてのデータ型の単一リンクリスト、挿入を実装、削除してC言語の要素を見つけよう

リンクリストを作成し、ノードを追加し、ノードを削除し、リスト内のノードをすべて見つけます。 最初のノードは、常にグローバルな「ヘッド」ポインタを介してアクセス可能になります。このポインタは、最初のノードが削除されたときに調整されます。 同様に、リスト内の最後のノードを含む '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>を使用せずにリンクされたリスト内のノードを追加、削除、および検索する任意の他の方法はありますか?

はい、あなたのコード内の任意のブール型を使用しないでください。

+0

整数だけでなく、すべてのデータ型を受け入れるようにコードを変更するにはどうすればよいですか? –

+0

intにデータを格納するのではなく、void *をデータに格納するのではなく、ややこしいことです。それは、指し示されたオブジェクトのライフタイムを管理することに余分な複雑さをもたらし、どのデータタイプがどのノードにあったのかを把握する必要があるかもしれません。それ以降のビットを発信者に任せておくと、リストには1つのタイプしか含まれていないと判断され、問題は解決されます。 OPへの@AlexandreDupriezのコメントを見てください。 – jwdonahue

関連する問題