1

それを編集しただけで、あなたの言ったことを試してみましたがうまくいきませんでした。情報が奇妙に出力されてからクラッシュします..例:9-8-7-6-5-4-3-2-1を入力してから0を出力すると、0-0-0-9-が出力されます1-2-3-4-5-6-7-8 してからクラッシュしますか? 1-2-3-4-5-6-7-8-9 を入力してから 0 を入力すると、0-0-0-1-2-3-4-5-6-7- が返されます。 8-9 そしてクラッシュします。

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

struct listNode{
  int data;    //ordered field
  struct listNode *next;
};

//prototypes
void insertNode(struct listNode *Head, int x);
int printList(struct listNode *Head);
int freeList(struct listNode *Head, int x);

//main
int main(){
     struct listNode Head = {0, NULL};
     int x = 1;
     int ret = 0;
     printf("This program will create an odered linked list of numbers greater"
     " than 0 until the user inputs 0 or a negative number.\n");
     while (x > 0){
           printf("Please input a value to store into the list.\n");
           scanf("%d", &x);
           insertNode(&Head, x);
     }
     ret = printList(&Head);
     }
void insertNode(struct listNode * Head, int x){
     struct listNode *newNode, *current;
     newNode = malloc(sizeof(struct listNode));
     newNode->data = x;
     newNode->next = NULL;
     current = Head;
     while (current->next != NULL && current->data < x) 
     {
        current = current->next;
        }

        if(current->next == NULL){
             current->next = newNode;
        }
        else{
             newNode->next = current->next;
             current->next = newNode;
        }
}
int printList(struct listNode * Head){
    struct listNode *current = Head;
    while (Head != NULL){
          printf("%d \n", *current);
          current = current->next;
    }
}
4

2 に答える 2

0

最初のノードから始まり、次のノードがnullになるまで次のノードに進むイテレータを作成し、リストの終わりではなく、like nextを使用することをお勧めします(またはnextがあります)。

次に、単純にイテレータを続行して値を出力して印刷します。挿入するには、ヘッドアイテムとイテレータから始めて、値を比較します。

私は実際にはC++プログラマーではないため、いくつかの擬似コードを追加しました。

class iterator
{
    //provide a construction method for this
    listNode current = Head;
    listNode getValue() 
    {
        return current;
    }

    void next()
    {
        //probably want to include some checks for validity here
        current = current->next;
    }

    boolean hasNext()
    {
        return current->next != null;
    }
}
于 2012-11-05T21:10:05.507 に答える
0
int printList(struct listNode * Head){
struct listNode *current = Head;
while (Head != NULL){
      printf("%d \n", *current);
      current = current->next;
}

あなたはかなり近いです。

while ループの条件を見てください。プログラムがクラッシュする理由は、'Head' が更新されないためです。したがって、条件は常に true です。したがって、プログラムは、リストの最後に到達するまで停止することなく、'current' を 'current->next' に等しく設定し続けます。この時点で 'current->next' は NULL になり、プログラムはクラッシュします。

while ループを変更して、'head' ではなく 'current' が NULL かどうかを確認すると、リストの最後に到達するとループが停止し、プログラムがクラッシュしなくなります。

編集:リンクされたリストに表示される余分なゼロを修正するためのいくつかのポインターを追加します。

struct listNode Head = {0, NULL};

プログラムの最初に、連結リストに値 0 のノードを作成しています。したがって、入力が何であれ、少なくとも 1 つの 0 が常に存在します。代わりに、Head を NULL に初期化することを検討してください。その場合、insertNode 関数でその条件を確認する必要があります。

また、その決定を行うために使用する入力を取得する前にループ条件 ('while(x > 0)') をチェックしているため ('scanf("%d", &x); ')。「while」の代わりに「do...while」を使用して、その順序を変更することを検討してください。「do...while」の説明と例については、http://www.cprogramming.com/tutorial/c/lesson3.htmlを参照してください。

于 2012-11-06T00:38:48.957 に答える