insert関数は、リンクリストを作成し、そのリンクリストに0からiまでの数字を追加することになっています。しかし、それはまた、リスト/リスト自体の先頭へのポインタを返すことになっているので、それを行う方法を理解できないようです。私は、最初のノードを追加した後にポインタを作成して先頭に設定しようとしましたが、リスト全体ではなく最初のノードのみを返します。誰かが助けてくれますか?ありがとう。ノードを追加した後にリンクリストの先頭にポインタを戻していますか?
答えて
おそらく、前のノードを覚えておいて、次のポインタを割り当てることができます。ノードを追加するときに、古いヘッドへの次のポインタを設定すると、リストの新しいヘッドになります。ループの最後の反復後に返すことができるもの。
Node *insert(int i) {
Node *head, *prev = NULL;
for (int c = 0; c < i; c++) {
head = malloc(sizeof(Node));
head->num = i;
head->next = prev;
prev = head;
}
return head;
}
更新:リストの最後にそれぞれの新しい要素を挿入するために、あなたはもう少し簿記必要があります。
Node *insert(int i) {
Node *last_node = NULL;
Node *first_node = NULL;
for (int c = 0; c < i; c++) {
Node *node = malloc(sizeof(Node));
node->num = i;
node->next = NULL;
if (!last_node) {
// Remember the first node, so we can return it.
first_node = node;
}
else {
// Otherwise, append to the existing list.
last_node->next = node;
}
last_node = node;
}
return first_node;
}
これは動作しますが、リストはiから0からiではなく0になります。リストの順序を逆にしないようにする方法はありますか? –
@ P.Sate:はい、できます。あなたはそれを行うことができるはずです。リストの最後の項目だけでなく最初の項目も指し示す必要があります。あなたは最初を返しますが、最後の後に新しい項目を追加します。 –
をそれは別の変数を導入するのと同じくらい簡単です。現在、リストの先頭を追跡するにはhead
があります。リストの尾を追跡するために別のものを追加します。
struct node {
struct node *next;
int num;
} Node;
Node *insert(int i) {
Node *head;
Node *tail;
head = malloc(sizeof(Node));
head.num = 0;
tail = head;
for (int c = 1; c < i; c++) {
// allocate a new node at the end of the list:
tail->next = malloc(sizeof(Node));
// set "tail" to point to the new tail node:
tail = tail->next;
tail->num = c;
}
return head;
}
必要な場合にも、i == 0
のための特別なケースを追加することができます。
ちなみに、これはおそらく練習としてあなたに与えられた仕事だと気づいていますが、insert
は実際に作成して完全に新しいリストを埋め込む関数のひどい名前です。
- 1. リンクリストの先頭に追加
- 2. リンクリストの先頭にノードを追加するにはC++?私はコンセプトを熟考しています
- 3. リンクリストの終わりにノードを追加して、後方ポインタと開始ポインタを持つ
- 4. リストビューの先頭に戻るarrayadapterのデータを更新した後
- 5. リンクリストの先頭にノードを挿入する
- 6. 単一リンクリストの先頭にノードを挿入する
- 7. フェッチ後に新しいモデルをコレクションの先頭に追加する(コンパレータなし)
- 8. リンクリスト(C++)の最後にノードを追加しますか? int型メイン内部
- 9. プッシュ機能(リストの先頭に新しいノードを追加する)C++
- 10. リンクリストの先頭に挿入
- 11. リンクリストに新しいノードを追加しようとしたときに、既存のリンクリストに新しいノードを追加する
- 12. PHP addChildをリストの先頭に追加しますか?
- 13. プッシュキューの先頭にタスクを追加しますか?
- 14. 変数の先頭に何かを追加していますか?
- 15. 行の先頭に追加
- 16. なぜDataOutputStream.writeUTF()は先頭に2バイトを追加しますか?
- 17. 配列の先頭に要素を追加して最後に削除numpy
- 18. C++でのデータ構造。リンクリストのノードの先頭に挿入
- 19. URLの先頭にクエリ変数を追加します(ベースURLの後)
- 20. ノードを使用してリンクリストにインスタンスを追加する
- 21. リンクリストの最後にノードを追加する
- 22. Cのグリッドビューの先頭に行を追加します。
- 23. リンクリストにノードを追加する
- 24. CSVファイルの先頭に新しい列を追加する
- 25. アルファベットカウンターを各行の先頭に追加します。
- 26. JavaFX:TableViewの先頭に行を追加します
- 27. リッチテキストボックスの先頭にテキストを追加します
- 28. SQL Server - 各レコードの先頭にテキストを追加します。
- 29. Pythonはファイルの先頭にUnicode文字を追加します。
- 30. RecyclerViewの先頭にDividerItemDecorationエフェクトを追加します
あなたのもっと大きな問題は、head-> nextに値を割り当てていないということです。実際にリンクされたリストを作成しているわけではなく、スペースの周りに浮かんでいるノードの束だけです。 – happydave
私はわかる。私は頭を再割り当てしているので、head-> nextのnum値は1ではないでしょうか?だから、0 - > 1 - > 2 - > 3 ..... - > cというリンクされたリストでしょうか? –
'head = head-> next;を指定すると、割り当てられたばかりのポインタに初期化されていないポインタが割り当てられます。あなたはメモリをリークし、未定義のポインタを格納しました。あなたには大きな問題があります。また、関数は値を返すはずですが、返さないとします。 –