C语言 从 stdin 中获取值并将其存储在链表节点中



昨天我做了一个愚蠢的方法之后,我认为我现在走得很好。我想编程的是,我从用户那里获得n个值,并且我正在尝试将每个值存储到链表节点中,该链表节点必须在每次输入后进行排序。

所以这意味着:

输入: 5 1 9

输出: 1 5 9

输入: 2 3

输出: 1 2 3 5 9

到目前为止我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct node {
int val;
struct node* next;
} node;
void printList(node* n) {
while (n != NULL) {
printf("%d ", n->val);
n = n->next;
}
}
void push(node * head, int val) {
node * current = head;
while (current->next != NULL) {
current = current->next;
}
/* now we can add a new variable */
current->next = malloc(sizeof(node));
current->next->val = val;
current->next->next = NULL;
}
int main() {
char input[20];
char* ptr;
node* head = NULL;
head = (node*) malloc(sizeof(node));
do {
printf("Eingabe:");
fgets(input,20,stdin);
ptr = strtok(input," ");
while(ptr!=NULL){
int val = atoi(ptr);
push(head,val);
ptr = strtok(NULL, " ");
}
printList(head);
}
while(*input != '0');
return 0;
}

编辑了我的代码,节点创建正在工作,但是当我输入 5 1 9 时,它输出 0 5 1 9 那个 0 从哪里来?

0 是headvalue

当您创建第一个节点时,您将其添加为头部的next,这意味着通过输入 5 1 9,您的链表将是:

head -> 5 -> 1 -> 9

打印时,您不仅要打印已创建的节点的值,还要打印头部的值,因为该值从未初始化过,并且在struct中,编译器会自动将其初始化为 0int(这取决于编译器实现,因此最好初始化它)。

如果你不希望前面有0,你有几个选择:

  1. 分配给head->value您输入的第一个数字

  2. 调用打印列表作为printList(head->node)

  3. 将链表实现更改为不让头部保存值

  4. 将打印列表更改为:

    void printList(node* n) {
    n = n->next;
    while (n != NULL) {
    printf("%d ", n->val);
    n = n->next;
    }
    }
    

正确的方法可能是(伪代码):

[START]
Read new line from the STDIN;
While there are new values:
Read new value;
Add it on new node (easier adding on top of the list);
Sort the list;
Print the list;
Loop to [START]

在您的代码中,您缺少"对列表进行排序"阶段。

如果您添加交换函数并尝试您选择的排序算法之一,则更容易

相关内容

  • 没有找到相关文章

最新更新