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
int printList(struct listNode * Head){
struct listNode *current = Head;
while (Head != NULL){
      printf("%d \n", *current);
      current = current->next;
}

你很接近。

看看你的while循环的条件——你的程序崩溃的原因是'Head'永远不会更新,所以条件总是正确的。所以程序只是保持设置 'current' 等于 'current->next' 而不会停止,直到你到达列表的末尾,此时 'current->next' 为 NULL 并且程序崩溃。

如果您更改 while 循环以检查 'current' 是否为 NULL 而不是 'Head',它将在到达列表末尾时停止并且您的程序不会崩溃。

编辑:添加一些关于修复显示链接列表的额外零的指针。

struct listNode Head = {0, NULL};

在程序开始时,您在链表中创建一个值为 0 的节点。因此,无论您的输入是什么,您总是至少得到一个 0。您可能会考虑将 Head 初始化为 NULL。如果这样做,则必须在 insertNode 函数中检查该条件。

您还会得到一些额外的零,因为您在获得用于做出该决定的输入之前检查您的循环条件 ('while(x > 0)') ('scanf("%d", &x); ')。您可能需要考虑通过使用“do...while”而不是“while”来更改该顺序。请查看http://www.cprogramming.com/tutorial/c/lesson3.html以了解“do...while”的示例。

于 2012-11-06T00:38:48.957 回答
0

我建议创建一个从第一个节点开始并转到下一个节点的迭代器,直到下一个节点为空,并建议使用类似的下一个而不是列表的结尾(或有下一个)。

然后通过迭代器简单地打印您并打印出值。要插入您从头项目和迭代器开始并比较值。

添加了一些伪代码,因为我不是真正的 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 回答