2011-07-08 9 views
1

私はCでリンクリストデータ構造体を作成しています。しかし、私はaddLast関数を実装する際に奇妙な振る舞いをしています。追加された要素は、次回addLastを呼び出すまで表示されないようです。私のコード(私は私のコードが動作しているどのように考えるか、インラインコメントを通じて説明します):C - リンクリストのaddLast関数のための奇妙な振る舞い

ヘルパーコード:

typedef struct LinkedList linkedlist; 
typedef int ListElement; 

struct LinkedList{ 
    ListElement data; 
    linkedlist *next; 
}; 

//Initializes a list; 
void CreateList(linkedlist *list, ListElement contents){ 
    list->data = contents; 
    list->next = NULL; 
} 

//Prints the items of the list, head first. 
void displayList(linkedlist *list){ 
    printf("(%d", list->data); 
    linkedlist *node = list->next; 

    if(node == NULL){ 
    } 
    else{ 
    while(node->next != NULL){ 
     printf(" %d", node->data); 
     node = node->next; 
    } 
    } 

    printf(")"); 
} 

問題のコード:

//Adds an element at the tail of the list 
void addLast(linkedlist *list, ListElement forAdding){ 
    linkedlist *node = list; 
    linkedlist *NewNode = (linkedlist *) malloc(sizeof(linkedlist)); 

    //Go to the last element in the list 
    while(node->next != NULL){ 
    node = node->next; 
    } 

    //Prepare the node we will add 
    NewNode->data = forAdding; 
    NewNode->next = NULL; 

    //Since node is pointing to the tail element, set its 
    //next to the NewNode---the new tail 
    node->next = NewNode; 
} 

//Special attention to this function! 
void List(ListElement items[], linkedlist *list, int numItems){ 
    int i = 0; 

    while(i < numItems){ 
    addLast(list, items[i]); 
    printf("Before "); 
    displayList(list); 
    printf("\n"); 
    printf("Added %d", items[i]); 
    displayList(list); 
    printf("\n"); 
    i++; 
    } 
} 

主な機能:

int main(){ 
    linkedlist *l= (linkedlist *) malloc(sizeof(linkedlist)); 
    CreateList(l, 0); 
    int a_list[5] = {1, 2, 3, 5, 6}; 
    List(a_list, l, sizeof(a_list)/sizeof(a_list[0])); 
    printf("A list of five elements: %d", sizeof(a_list)/sizeof(a_list[0])); 
    displayList(l); 
    removeLast(l); 
    addLast(l, 7); 
    printf("\nAdded something at last position: "); 
    displayList(l); 
    printf("\n"); 
} 

出力は次のとおりです。

Before (0) 
Added 1(0) 
Before (0) 
Added 2(0 1) 
Before (0 1) 
Added 3(0 1 2) 
Before (0 1 2) 
Added 5(0 1 2 3) 
Before (0 1 2 3) 
Added 6(0 1 2 3 5) 
A list of five elements: 5(0 1 2 3 5) 
Added something at last position: (0 1 2 3 5 6) 

表示されているように、追加されたアイテムはaddLastの次の呼び出し時にのみ表示されるようです。

これまでのところ、であることが分かりましたが、実際にはですが何らかの理由で印刷されません。例えば、私は別のaddLast(list, 6);呼び出しを行う場合、私は、関数リストを閉じる(しかし、ループの外で、もちろん!)、addLast(l, 7);への呼び出し後に発生する出力ラインAdded something at last position...が(実際に表示されますAdded something at last position: (0 1 2 3 5 6 6)

をだから前に、私が間違って何をやっている?

ありがとう!

+0

'removeLast(l);'関数も表示できますか?それはあなたのサンプルで呼ばれ、表示されません。 – Bruce

+0

私の悪い。私はそのコードで私は_compiled_を削除しました。しかし、指摘されているように、私の問題は私の 'displayList()'にあるようですので、とにかくそれは関係ありません。それにもかかわらず、それを指摘してくれてありがとう:D。 – skytreader

答えて

4

問題は、それは単にあなたのdisplayList()機能:)でAddLast()ではありません。最後の要素の前に1要素の印刷を停止します。そのような

変更displayList()機能:

void displayList(linkedlist *list){ 
    printf("("); 
    linkedlist *node = list; 

    while(node != NULL){ 
    printf(" %d", node->data); 
    node = node->next; 
    } 

    printf(")"); 
} 

この関数は、あまりにも空のリストを印刷することができます。

+0

もちろん、ああ。私はあまりにも私の追加/削除ループ内の 'node-> data'不変式に惑わされてしまったと思います。それを指摘してくれてありがとう! – skytreader

1

あなたはリストの最後の項目を印刷していません。

node->dataがNULLの場合、現在のノードの後に​​NO MOREノードが存在することがわかります。しかし、あなたは停止する前に最後のものを表示する必要があります!

これを行うには、node != NULLにチェックを変更することができます。

1

あなたの表示機能がerronousです:あなたのループでは、リストの最後の要素のために、あなたが得た

node->next = NULL 
node->data != NULL 

あなたのループは、それを表示されません。

while(node->next != NULL){ 
    printf(" %d", node->data); 
    node = node->next; 
} 

あなたが好き修正することができますそのwhile (node != NULL) {

1

あなたの問題はDISPLAYLISTである::

... 
    while(node->next != NULL){ 
     printf(" %d", node->data); 
     node = node->next; 
... 

node-> nextが最後の項目に到達すると、nullになり、したがって表示されません。

関連する問題