2017-06-17 8 views
-1

C言語の を使用してリテラルリンクリストを再帰的に作成しようとしていますが、このコードはエラー "Linker Tools Error LNK2019"で動作しません。残念ながら私は何が問題なのか理解できません。ここに私のコードです。C言語でリニアリンクリストを作成して表示する(再帰的に)

事前に大きな助けをいただきありがとうございます。

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


struct node 
{ 
    char num;      //Data of the node 
    struct node *nextptr;   //Address of the next node 
}; 
typedef struct node element; 
typedef element *link; 
link head; 


void displayList();   // function to display the list 

int main() 
{ 
    char s[] = "abc"; 
    link stol(s); 
    { 
     link head; 
     if (s[0] == '\0')return(NULL); 
     else { 
      head = (link)malloc(sizeof(element)); 
      head->num = s[0]; 
      head->nextptr = stol(s + 1); 
      return(head); 
     } 
    } 

    printf("\n\n Linked List : To create and display Singly Linked List :\n"); 
    printf("-------------------------------------------------------------\n"); 

    displayList(); 
    return 0; 
} 


void displayList() 
{ 
    link tmp; 
    if (head == NULL) 
    { 
     printf(" List is empty."); 
    } 
    else 
    { 
     tmp = head; 
     while (tmp != NULL) 
     { 
      printf(" Data = %d\n", tmp->num);  // prints the data of current node 
      tmp = tmp->nextptr;      // advances the position of current node 
     } 
    } 
} 
+0

'main'関数の外(前)に' stol'関数を定義してください。 – BLUEPIXY

+0

ありがとうございます。主な機能の外に(そして前に) "リンクを張る"必要があるのですか? –

+0

私は[this](http://ideone.com/IHPo0I)のようになります – BLUEPIXY

答えて

0

あなたのmain()機能にheadと呼ばれるlinkオブジェクトを再定義します。グローバルhead変数を非表示にします。

main内の定義を削除すると問題が解決しますが、いずれの場合でもdisplayList関数にパラメータとしてlink*を渡すことを検討する必要があります。

return(head);main()に書きました。結果としてプログラムは早めに終了します。

いつも私はあなたのアプリを見て、私はより多くの問題を見つける。私があなただったら、まずノードをリストに追加する関数を作成します。新しいノードをリストの先頭に追加する方がはるかに簡単なので、まずそれを試してください。この実行を取得したら、テールに追加してみてください。末尾に追加するのは非常に似ていますが、walkする必要がありますthe list first to get to the last element, exactly as you already do in displayList()もう一つの方法は、最後に追加したノード*のアドレスを保持することです。私が言ったように、それは少し複雑ですので、まずaddToHeadを使って作業してください。

void addToHead(link* l, node* n) 
{ 
    n->nextptr = l->nextptr; 
    l->nextptr = n; 
} 

メインでは、すでにmalloc()で行っているように、一度に1つの新しいノードを割り当てることができます。内容をnumで整数で初期化し、addToHeadでポインタを処理させます。あなたのポインタの使用はひどいですが、リストは非常に簡単ですし、addToListは、ポインタにできるべきものと、何をポインタに入れるべきか、つまり他のポインタをかなり示しています。

最初のprintfの前にmain()のほとんどすべてを削除できます。あなたは

  1. スタートループする必要があります:ユーザーが(printf関数を使って何をすべきかを知っているよう
  2. )プロンプトを書くのscanf( "%d個"、& n)を使用して、ユーザからの入力を読んで、等価である。
  3. ユーザーが負の値を入力した場合、ループを解除します。
  4. のmalloc()
  5. は、ノードを追加するために、そのデータnum = n
  6. コールaddToHeadを設定し、新しいノード。
  7. ユーザーが空の文字列を入力するまで、または-1をループします。

これには約8〜10行のコードが必要です。疑わしい場合は、scanfに関するドキュメントをgoogleまたはhttp://en.cppreference.com/w/cに簡単に見つけることができます。

+0

ありがとう!このコメントのcuz私は最終的にグーグルで 'グローバル&ローカル変数'の私の全体的な概念的な考えを整理:) –

関連する問題