2016-04-07 21 views
-2

使用typedefinitionsのリストに配列は、C(繰り返し)

List arrayToList(int arr[],int n,int idx) { 
    if (n==idx) return NULL; 
    List list=malloc(sizeof(Node)); 
    list->next=arrayToList(arr,n,idx+1); 
    list->item=arr[idx]; 
    return list; 
} 

UPDATE:以下はほとんど正しいですが、私はなぜ知りません最後にゼロが印刷されます。

List newNode() { 
    List li=malloc(sizeof(Node)); 
    return li; 
} 

List arrayToList(int arr[],int n) { 
    List li=newNode(); 
    List li1=li; /*save the beginning of the list*/ 
    int i; 
    for (i=0;i<n;i++) { 
     li->item=arr[i]; 
     li->next=newNode(); 
     li=li->next; 
    } 
    li=NULL; 
    return li1; 
} 


void printList(List li) { 
    while (li!=NULL) { 
     li=li->next; 
    } 
    printf("\n"); 
} 


int main(int argc, char* argv[]) { 
    int arr[]={4,1,2,3,4,7,4,5,6,8}; 
    List li=arrayToList(arr,10); 
    printList(li); 
    return 0; 
} 

出力は次のとおりです。4 1 2 3 4 7 4 5 6 8 0。

UPDATE 2:このいずれかに機能がprintlistを変更すると、私に正しい出力を与える:

void printList(List li) { 
    while (li->next!=NULL) { 
     printf("%d ",li->item); 
     li=li->next; 
    } 
    printf("\n"); 
} 

しかし、私は、私はガードとしてli->next!=NULLを持っている必要があり、なぜ疑問に残っていますか?

+2

"私は不思議です"。考えを共有する。 –

+0

あなたのリストの最後の要素がnullを指しているので、 'li-> next!= NULL'が必要です。 –

答えて

0

あなたの最初の要素を初期化します。

Node *head = (Node*) malloc(sizeof(Node)); 
head->data = arr[0]; 

あなたの現在の位置を追跡するためにポインタが必要になります。

Node *curr = head; 

は、forループを作成します。次に

for(int i = 1; i < len; i++) 
{ 

} 

のために各要素を追加し、新しいノードを追加してポインタを前方に移動します。

curr->next = (Node*) malloc(sizeof(Node)); 
curr = curr->next; 
curr->data = arr[i]; 

nullを指すようにリストの最後の要素を設定することを忘れないでください。 (これは、forループの外に発生する可能性があります。)

n->next = NULL; 
+0

余分なノードをリストに追加するようです。アップデートを見てください。 – CFLAGS

+0

@CFLAGSああ、そうだね。 'i = 1'で始める。 –

0

は、この操作を行います。nextは表示されませ、次のノードを指すようにしたい

typedef struct node { 
    int data; 
    struct node *next; 
} Node; 

注意を。

Node* arrayToList(int arr[],int n,int idx) { 
    if (n==idx) return NULL; 

    Node* headOfList = (Node*) malloc(sizeof(Node)); 
    Node* tail = headOfList; 

    int i = n; 
    for(; i < idx; i++) { 
    // Create node 
    Node* node = (Node*) malloc(sizeof(Node)); 
    node->data = arr[i]; 
    node->next = NULL; 

    // Link Node to current list 
    tail->next = node; 
    tail = node; 
    } 

    return headOfList; 
} 

これはちょっと草案です(私はコンパイラで試してみませんでした)が、そのアイデアはそこにあります。

+0

私は似たようなものを持っていました。いいえ、それは動作しません。 – CFLAGS

関連する問題