2012-01-25 5 views
2

リンクリストの抽象化を実装しようとしていますが、問題にぶつかっています。一度私はリンクされたリストを作成し、要素を追加します。リストを印刷すると、最初の要素が無限ループで印刷されます。つまり、最初の要素がリンクされているか、または印刷機能が正しくありません。しかし、私は問題を見つけることができない、誰かを助けることができる?Cでリンクされたリストは、正しく構築されているリストですか?

次は、リストの抽象化である:それは何か大きなものの一部であるとして

typedef struct _friend { 
    char *firstname; 
    char *lastname; 
    char birthdate[9]; 
} friend; 


typedef struct _node { 
    friend *value; 
    struct _node *next; 
} node; 

typedef struct _linkedlist { 
    node *head; 
} linkedlist; 

プログラムは、この抽象化に従わなければなりません。 は、以下のリストを印刷し、リストの先頭にノードを追加すべき機能です:printList ISNでforループ

void printList(linkedlist *llist,FILE *fp) 
{ 

    node *n; 
    friend *f; 
    // for each node, print out the friend attached to it 

    for(n = llist->head; n != NULL ; n = n->next) 
    { 
     // assign f to the friend of the right node 
     f = n->value; 
     // print the friend out 
     fprintf(fp,"%s %s: %s\n", 
     f->firstname, f->lastname, f->birthdate); 
    } 

} 
+0

llistがNULLであるかどうかを確認していますが、すぐにそのリストに書き込んでいます。あなたはllist-> headがヌルかどうかを知っていますか? – templatetypedef

+0

'if(llist == NULL)'と 'else'ブロックで同じ操作を*正確に*実行することに気づいていますか? – wildplasser

答えて

3

/* addHead 
    * 
    * This function takes two parameters - a linked list and a friend. 
    * This creates a node for the linked list and connects the friend to the 
    * node. Then it adds the node to the head of the linked list. 
    */ 

void addHead(linkedlist *llist, friend *f) 
{ 

    // create a node and put the friend in it 
    node *n = (node *)malloc(sizeof(node)); 
    n->value = f; 
    n->next = NULL; 

    // if the list is empty 
    if (llist == NULL) 
    { 
     // this link is the entire list 
     llist->head = n; 
     printf("adding friend to null list\n"); 

    } 
    // if the list is not empty 
    else 
    { 
     // make the new link's next pointer point to 
     // the first link in the list 
     n->next = llist->head; 
     printf("adding %s to head\n", n->value->firstname); 

     // make the head pointer point to the new link 
     llist->head = n; 


} 

} 

/* 
* printList 
* 
* This steps down through each of the nodes in a linked list and 
* prints out the information stored in the friend to which the node points. 
* Instead of automatically printing to the screen, it prints to the 
* file pointer passed in. If the programmer wants to print to the screen, 
* he/she will pass in stdout. 
*/ 

void printList(linkedlist *llist,FILE *fp) 
{ 

    node *n; 
    friend *f; 
    // for each node, print out the friend attached to it 

    for(n = llist->head; n != NULL ; n = llist->head->next) 
    { 
     // assign f to the friend of the right node 
     f = n->value; 
     // print the friend out 
     fprintf(fp,"%s %s: %s\n", 
     f->firstname, f->lastname, f->birthdate); 
    } 

} 

はあなたに

0

てみてくださいありがとうございましたかなり正しい:

for(n = llist->head; n != NULL ; n = llist->head->next) 

T彼は次のようになります。

for(n = llist->head; n != NULL ; n = n->next) 

をそれ以外の場合は以降、nが同じ値にひとつひとつの時間を設定します2回目の反復から。

以下はあなたの問題とは関係ありませんが、とにかく言及したいと思いました。次のコードでは:

if (llist == NULL) 
{ 
    // this link is the entire list 
    llist->head = n; 
    printf("adding friend to null list\n"); 

} 

llist == NULL場合、llist->head = nがセグメンテーションフォールトます。

addHead()の現在の署名では、llistNULL(多くの場合、エラーメッセージを出力して救済する以外)できません。

llist->headがNULLであるかどうかを確認する場合は、elseブロックが既に正しく処理しているので、その必要はありません。

0

n = nにする必要があります - >そうでなければ、毎回頭の次を取得しています。

0

私はあなたのプログラムに次のことを行っている:

  • はわずかfriend構造を変更しました。便宜上firstnameとlastnameを配列として宣言しました。
  • addHead()
  • にチェック
  • エラーがfriend構造体
  • は「malloc()たメモリを解放するためにfreeList()を追加作成create_friend()機能を追加した他の関数を呼び出すmain()
  • があなたの印刷でエラーをループ訂正編書きました機能

だからここに行く..

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

typedef struct _friend { 
    char firstname[10]; 
    char lastname[10]; 
    char birthdate[9]; 
} friend; 


typedef struct _node { 
    friend *value; 
    struct _node *next; 
} node; 

typedef struct _linkedlist { 
    node *head; 
} linkedlist; 


void addHead(linkedlist *llist, friend *f) 
{ 
    node *n = NULL; 

    if ((n = (node *)malloc(sizeof(node))) == NULL) { 
     printf("unable to allocate memory \n"); 
     exit(1); 
    } 

    n->value = f; 
    n->next = NULL; 

    if (llist == NULL) { 
     llist->head = n; 
     printf("adding friend to null list\n"); 
    } else { 
     n->next = llist->head; 
     printf("adding %s to head\n", n->value->firstname); 
     llist->head = n; 
    } 

    return; 
} 

void printList(linkedlist *llist) 
{ 
    node *n; 
    friend *f; 

    if (llist->head == NULL) { 
     printf("Empty list \n"); 
     return; 
    } 

    for(n = llist->head; n != NULL ; n = n->next) { 
     f = n->value; 
     printf("%s %s %d \n", f->firstname, f->lastname, f->birthdate); 
    } 

    return; 
} 

friend * create_friend(char *fn, char *ln, char *dob) 
{ 
    friend *fp = NULL; 

    if ((fp = malloc(sizeof(friend))) == NULL) { 
     printf("unable to allocate memory \n"); 
     exit(1); 
    } 

    strcpy(fp->firstname, fn); 
    strcpy(fp->lastname, ln); 
    strcpy(fp->birthdate, dob); 

    return fp; 
} 

void freeList(linkedlist *llist) 
{ 
    node *cur = llist->head; 
    node *prev = cur; 
    friend *f; 

    while (cur != NULL) { 
     prev = cur; 
     cur = cur->next; 
     f = prev->value; 
     printf("freeing .. %s %s %d \n", f->firstname, f->lastname, f->birthdate); 
     free(prev->value); 
     free(prev); 
    }  

    return; 
} 

int main(void) 
{ 
    linkedlist ll; 
    friend *f; 

    ll.head = NULL; 

    f = create_friend("firstname1", "lastname1", "12345678"); 
    addHead(&ll, f); 

    f = create_friend("firstname2", "lastname2", "12345678"); 
    addHead(&ll, f); 

    f = create_friend("firstname3", "lastname3", "12345678"); 
    addHead(&ll, f); 

    printList(&ll); 

    freeList(&ll); 
    ll.head = NULL; 

    printList(&ll); 

    return 0; 
} 

関連する問題