2016-12-20 4 views
1

簡単に説明したいのは、構造体を作成し、それを埋め込み、その後にリンクリストを作成することです。 私は今までこれを行っています: 私は以下のようにリンクリストを定義しました。私はその後、私は構造体を保持している配列を作成した後、Cでリンクリストを作成します。

list = (LIST1 *) malloc ((40)*sizeof(LIST1)); 

(例えば40の構造項目をホストする)、それにいくつかのメモリを動的に割り当てられたPASSENGERS

typedef struct list1    
{ 
char var1[10]; 
char var2[10];  
struct list1 *next; 
}LIST1; 

約40変数でそれを埋めた約40とそれを充填例

for (i=0;i<40;i++) 
{ 
strcpy(list[i].var1,"AAAAAAAA"); 
strcpy(list[i].var2,"BBBBBBBB"); 
} 

そして、私は、リンクリストに既に存在しているすべてのこれらの値を、接続している今行う必要があり、pのために使用することにより、パッセンジャー の変数このリンクされたリストを使用して結果を消してください。

私が何かしようとしています:

LINK1 *link, *start=NULL, *tmp; 

for (i=0;i<40;i++) 
    {link->next = NULL; 
    if (start==NULL) 
     start = link; 
    else{ 
     tmp=start; 
     while (tmp->next !=NULL) tmp=tmp->next; 
     tmp->next=link; 
     } 

    } 

をして、VAR1

while (tmp!=NULL) 
{ 
    printf("%s",tmp->var1); 
    tmp=tmp->next; 
} 

の結果を印刷するためのコードが実行されるが、それは何も印刷されません。これは私が解決しようとしている練習の一部に過ぎず、どのように動作するのか簡単にわかり始めました。私は一度に1つの要素に対してのみメモリを割り当てたいとは思わない。私は、必要なすべてのメモリを割り当て、構造を記入してリンクリストを作成するように求められます。

+3

* "しかし、それはうまくいかない。" * - どのように?あなたの質問を編集してください。また、行ったデバッグも含めてください。 –

+3

毎日リンクされたリストの質問が最終的に到着しました。 –

+1

@SanchkeDellowar 10日で4日間。 –

答えて

4

あなたは正しい方法でいます。 typedefを使用することを余儀なくされていない場合は、あなたのリストに普通のstructを使用し、ノードとリストを混同しないように明確に名前nodeを使用することができます。ノードが後に続くノードはリストです。

struct node { 
    char * var1; 
    char * var2; 
    struct node *next; 
}; 

次に、ヘルパー機能を使用してノードをプッシュすることができます。

void pushvar1(struct node **head_ref, char *new_data) { 
    struct node *new_node = malloc(sizeof(struct node)); 
    new_node->var1 = strdup(new_data); 
    new_node->next = (*head_ref); 
    (*head_ref) = new_node; 
} 

ノード

void printListvar1(struct node *node) { 
    while (node != NULL) { 
     printf(" %s ", node->var1); 
     node = node->next; 
    } 
} 

を印刷する機能今、あなたは成功のちょうどmain機能足りません。

int main() { 
    struct node *head = NULL; 
    int i = 0; 
    for (i=0;i<40;i++) 
    { 
     pushvar1(&head, "AAAAAAAA"); 
    } 

    puts("Created Linked List: "); 
    printListvar1(head); 
    return 0; 
} 

コンプリートプログラム

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

struct node { 
    char *var1; 
    char *var2; 
    struct node *next; 
}; 

void pushvar1(struct node **head_ref, char *new_data) { 
    struct node *new_node = malloc(sizeof(struct node)); 
    new_node->var1 = strdup(new_data); 
    new_node->next = (*head_ref); 
    (*head_ref) = new_node; 
} 

void printListvar1(struct node *node) { 
    while (node != NULL) { 
     printf(" %s ", node->var1); 
     node = node->next; 
    } 
} 
void freeList(struct node* head) 
{ 
    struct node* tmp; 

    while (head != NULL) 
    { 
     tmp = head; 
     head = head->next; 
     free(tmp->var1); 
     free(tmp); 
    } 

} 
int main() { 
    struct node *head = NULL; 
    int i = 0; 
    for (i = 0; i < 40; i++) { 
     pushvar1(&head, "AAAAAAAA"); 
    } 

    puts("Created Linked List: "); 
    printListvar1(head); 
    freeList(head); 
    return 0; 
} 

テスト

./a.out 
Created Linked List: 
AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA 
+1

ありがとう、それは非常に明確でした!また、この演習を解決するための新しいアイデアを得るのを助けました。構造体をリンクリストに変換するのではなく、これは良い考えではありませんが、既にいくつかのデータを保持しているこの構造体の値を同様の構造化された構造体にコピーする方が良いと思います。新しいリンクリスト、小さな変更を加えたコードを使用してください! – baskon1

+0

@ baskon1あなたは答えが気に入ってうれしいです。私はあなたがCと簡潔にすることができ、Javaのようにいつもカプセル化を強制されていないので、C言語は他の言語よりも簡単かもしれないと思います。 –

+1

@DacSaundersはメモリを解放するのを忘れないでください –

関連する問題