1

私は宿題に取り組んでいます、そしてこれは私が得た限りです。リストに入力された情報を印刷する方法を知る必要があります。また、insertNode関数を再構成して、リストを最小から最大に並べ替える必要があります。

#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 x);
int freeList(struct listNode *Header, int x);

//main
int main(){
     struct listNode Head = {0, NULL};
     int x = 1;
     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);
     }
     printf("Program terminated.\n");
     system("PAUSE");
     }
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;
        }
}
4

4 に答える 4

3

Header->next開始時に NULL であり、要素を追加するときに current を次のように変更しますHeader

 current = Header;
 write(current->next !=NULL);
 // set current to be Header->next (which is NULL)
 current = current->next;
 // dereference null
 current->next = newNode;

代わりに、新しい要素を末尾に追加します。

current = Header;
while (current->next != NULL)
    current = current->next;
current->next = newNode;
于 2012-11-05T19:38:25.977 に答える
0
 current = Header;
 write(current->next !=NULL);
 current = current->next;
 current->next = newNode;

すべてが割り当てられていない状態で current->next にアクセスしようとしています。そして、リンクされたリストに挿入する正しい場所を実際に探しているわけではありません(あなたの質問から、ソートされるはずのように聞こえます)。

次のようなものを試してください:

current = Header;
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;
}
于 2012-11-05T19:45:08.673 に答える
0

printList および freeList 関数を作成する方法を理解する必要があります。

#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 x);
int freeList(struct listNode *Head, int x);

//main
int main(){
     struct listNode Head = {0, NULL};
     int x = 1;
     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);
     }
     printf("Program terminated.\n");
     system("PAUSE");
     }
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;
        }
}
于 2012-11-05T21:00:54.990 に答える
0

実装には 3 つの問題があります。

  1. 最後に新しい番号を追加する必要があるため、リストに 2 つのポインターが必要です。1 つは先頭を指し、もう 1 つは末尾を指します (リストの先頭に追加することもできます。その場合、必要なポインターは 1 つだけですが、リストは逆順です)

  2. ポインタ連鎖コードが間違っています。ヘッドノードの後に​​新しい要素を挿入しようとしていると思うので、コードは次のように書く必要があります。

    current=Header->next; // ノード Header->next が現在指しているノード

    Header->next=newNode; // header->next が新しい ele を指すようにする

    newNode->next=current; // 新しい ele の次のポイントが古いトップ ele を指すようにします

  3. header-node はどういうわけか特別で役に立たないので、空のリストを特別なケースとして処理する必要があり、header は最初は 0 である必要があり、insertnode は次のように機能します。

    もし (ヘッダー==0)

     header=newNode
    

    そうしないと

    // 2.で書いたようなことをする.

これは確かに別の方法で行うことができますが、これはそのリストの問題に対する1つの一般的なアプローチです...(うーん、どういうわけか、コードの先頭の4つの空白は機能しませんか?)

于 2012-11-05T19:46:41.447 に答える