2016-03-31 27 views
1

私のコースの要件ではありませんが、私は概念を理解するために、シングルリンクリストとダブルリンクリストを実装しようとしています。私はデバッグしようとしたものを除いて、私が考えているほとんどの問題を解決しました。そして、printf私の道が出てきました。私は別の記事を読んだが、なぜ彼らは同じように働いていないのか分からない。Cでリンクされたリスト

while(h != NULL)がキックアウトしたときに1つの挿入機能をスキップするため、もう一度最後の項目をもう一度チェックする必要があります。私はdo/whileループについて考えましたが、うまくいかないでしょう。

私は検索機能にまったく同じループを持ち、処理する前に私を蹴るのではなく、while(h != NULL)を使ってリストの最後の項目を見つけます。ここで

は、検索機能から作品のループである。ここ

while(h != NULL) //check list 
     if(h->val == s) 
      return true; 
     else 
      h = h->next; 

はinsert関数から、この1つは終了する前に、リンクリストの最後の値を使用して終了しませんしないループですループ。あなたが最後の項目を検索するためにそれを得るために私がif (t->next == NULL && t->val > n)かどうかをチェックしなければならなかった前に完全なコードを読むなら。

 while(t->next != NULL) //assigns it in the middle 
     { 
      if(t->val < n) 
       t = t->next; 
      else 
      { 
       node* tt = t->prev; 
       tt->next = a; 
       a->next = t; 
       a->prev = t->prev; 
       t->prev = a; 

       return h; //returns original 
      } 
     } 

私はそれを説明しています。私が知らないことを勉強しようとすると、難しいです。

while(t->next != NULL) //assigns it in the middle 
{ 
    if(t->val < n) 
     t = t->next; 
    else 
    { 
     node* tt = t->prev; 
     tt->next = a; 
     a->next = t; 
     a->prev = t->prev; 
     t->prev = a; 

     return h; //returns original 
    } 
} 

if (t->next == NULL && t->val > n) //check to see if second to last 
{  
    node* tt = t->prev; 
    tt->next = a; 
    a->next = t; 
    a->prev = t->prev; 
    t->prev = a; 
} 
else 
{ 
    a->next = NULL; 
    a->prev = t; 
    t->next = a; 
} 

をし、質問です:私が正しくあなたの質問を理解していれば

#include <stdio.h> 
#include <stdlib.h> //for rand(); 
#include <stdbool.h> //bool function 

typedef struct _node 
{ 
    int val; 
    struct _node* next; 
    struct _node* prev; 
} node; 

node* create(int n, node* h); 

node* insert(int n, node* h); 

bool search(int s, node* h); 

void print(node* h); 

void del(node* h); 

int main() 
{ 
    node* h = NULL; 

    for(int i = 0; i < 15; i++) 
    { 
     int n = rand() % 15; 
     h = create(n, h); 
    } 

    print(h); 

    int s = 10; //number to search for 

    if(search(s, h)) 
     printf("Found Item\n"); 
    else 
     printf("Item not found\n"); 

    del(h); 
} 

bool search(int s, node* h) 
{ 
    if(h == NULL) 
     printf("No nodes created to search.\n"); 

    while(h != NULL) //check list 
     if(h->val == s) 
      return true; 
     else 
      h = h->next; 

    return false; 
} 


void del(node* h) 
{ 
    node* t = h; 

    while (h->next != NULL) 
    { 
     t = h->next; 
     h->next = NULL; 
     free(h); 
     h = t; 
    } 
     free(h); 
} 

node* insert(int n, node* h) 
{ 
    node* a = malloc(sizeof(node)); 
    node* t = h; 

    if(a == NULL) 
    { 
     printf("Failed to create new node\n"); 
     return NULL; 
    } 

    a->val = n; //sets new node to have value of n 

    if(h->val >= n) //assigns the integer to the beginning 
    { 
     a->next = t; 
     t->prev = a; 
     a->prev = NULL; 
     h = a; //assigns a new head since it appended the item to the beginning 
     return h; 
    } 

    while(t->next != NULL) //assigns it in the middle 
    { 
     if(t->val < n) 
      t = t->next; 
     else 
     { 
      node* tt = t->prev; 
      tt->next = a; 
      a->next = t; 
      a->prev = t->prev; 
      t->prev = a; 

      return h; //returns original 
     } 
    } 

    if (t->next == NULL && t->val > n) //check to see if second to last 
    {  
     node* tt = t->prev; 
     tt->next = a; 
     a->next = t; 
     a->prev = t->prev; 
     t->prev = a; 
    } 
    else 
    { 
     a->next = NULL; 
     a->prev = t; 
     t->next = a; 
    } 

    return h; 
} 

node* create(int n, node* h) 
{ 
    if(h == NULL) //create first node in the list 
    { 
     h = malloc(sizeof(node)); 
     if(h == NULL) 
     { 
      printf("Failed to create first node\n"); 
      return NULL; 
     } 
     h->val = n; 
     h->next = NULL; 
     h->prev = NULL; 
    } 
    else //create additional nodes in the list 
     h = insert(n, h); 

    return h; 
} 

void print(node* h) 
{ 
    if(h == NULL) 
     printf("List is empty\n"); 
    else 
     while(h != NULL) 
     { 
      printf("%i\n", h->val); 
      h = h->next; 
     } 
} 
+0

CS50は何ですか? –

+0

申し訳ありませんが、ハーバードのオンラインクラスedx.orgを通じて無料でできます。リンクされたリストとダブルスをカバーしますが、割り当てとして提出する必要はありません。 – JDL

+0

"while(h!= NULL)がキックアウトするときの私の挿入機能"。 'insert'関数にはこのような条件はありません。あなたは明確にしていただけますか? – kaylum

答えて

0

、あなたはこれらの行について尋ねている「しばらくしながら、内部からのコードブロックの繰り返しを避けるためにはどうすればよいです」このような

多分何か:

while(1) 
{ 
    if(t->val < n) 
    { 
     if (t->next == NULL) break; 
     t = t->next; 
    } 
    else 
    { 
     //assigns it in the middle 
     node* tt = t->prev; 
     tt->next = a; 
     a->next = t; 
     a->prev = t->prev; 
     t->prev = a; 

     return h; //returns original 
    } 
} 

// Add new node at the end 
a->next = NULL; 
a->prev = t; 
t->next = a; 
関連する問題