私は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)
。
をだから前に、私が間違って何をやっている?
ありがとう!
'removeLast(l);'関数も表示できますか?それはあなたのサンプルで呼ばれ、表示されません。 – Bruce
私の悪い。私はそのコードで私は_compiled_を削除しました。しかし、指摘されているように、私の問題は私の 'displayList()'にあるようですので、とにかくそれは関係ありません。それにもかかわらず、それを指摘してくれてありがとう:D。 – skytreader