昨天我做了一个愚蠢的方法之后,我认为我现在走得很好。我想编程的是,我从用户那里获得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 是head
的value
。
当您创建第一个节点时,您将其添加为头部的next
,这意味着通过输入 5 1 9,您的链表将是:
head -> 5 -> 1 -> 9
打印时,您不仅要打印已创建的节点的值,还要打印头部的值,因为该值从未初始化过,并且在struct
中,编译器会自动将其初始化为 0int
(这取决于编译器实现,因此最好初始化它)。
如果你不希望前面有0,你有几个选择:
分配给
head->value
您输入的第一个数字调用打印列表作为
printList(head->node)
将链表实现更改为不让头部保存值
将打印列表更改为:
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]
在您的代码中,您缺少"对列表进行排序"阶段。
如果您添加交换函数并尝试您选择的排序算法之一,则更容易