打印有序链表(Print an ordered linked list)

2019-08-02 08:48发布

只是做了一些关于它的编辑,我想你说的什么,但它没有工作,所以我尝试的东西我有点更熟悉,但它似乎没有正常工作。 它古怪的打印信息,然后崩溃。对于〔实施例:当我开关输入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;
    }
}

Answer 1:

我建议创建开始于第一个节点,并进入到下一个节点迭代,直到下一个节点为null,并且使用像下一个建议,而不是最终名单(或旁边)。

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

增加了一些伪代码,因为我不是一个真正的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;
    }
}


Answer 2:

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

你是八九不离十。

拿上你的while循环来看看的条件 - 你的程序崩溃的原因是,“头”是从来没有更新,所以病情总是如此。 因此,该程序只是不断设置“当前”等于“电流 - >下一个”不停止,直到你得到你的列表的末尾,在这一点“的电流 - >未来”为空,程序崩溃。

如果你改变你的while循环来检查“当前”是否是空的,而不是“头”,其会在到达列表的末尾停止,你的程序将不会崩溃。

编辑:在固定多余的零显示出来的链接列表中添加一些指点。

struct listNode Head = {0, NULL};

在你的程序的开始,你创建你的链接列表的节点,其中值0。所以,你总是有至少一个0不管你输入的是什么。 你可能会考虑初始化头,而不是为NULL。 如果你这样做,你必须检查你的insertNode功能状态。

你还得到一些额外的零,因为你正在检查您的循环条件(“而(x> 0)”)你,你用它来做出这样的决定('的scanf(‘%d’,&X)的输入之前 ; “)。 您可能要考虑使用一个改变是为了“做......而”而不是“而”。 看看http://www.cprogramming.com/tutorial/c/lesson3.html为的解释“做......而”举例。



文章来源: Print an ordered linked list