订购给定值时遇到一些麻烦。现在,输入文件为:
347 490 950 779 911 825 215 584 355 266 301 458 381 13 577 835
但是我得到了:
835 577 13 381 458 301 266 355 584 215 825 911 779 950 490 347
如何使用Insert()中的代码按升序对它们进行排序?
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// Node for building our linked list.
struct NodeTag {
int value;
struct NodeTag *next;
};
typedef struct NodeTag Node;
Node *insert( Node *head, int val )
{
Node *n = (Node *)malloc(sizeof(Node));
n->value = val;
n->next = head;
return n;
}
int main()
{
Node *head = NULL;
int x;
while ( scanf( "%d", &x ) == 1 ){
head = insert( head, x );
}
for(Node *n = head; n; n = n->next) {
printf("%d ", n->value);
}
printf("\n");
while(head) {
Node *next = head->next;
free(head);
head = next;
}
return 0;
}
任何帮助将不胜感激。谢谢!
答案 0 :(得分:4)
您要在列表的开头插入每个元素,因此它们的排列顺序与您阅读它们的顺序相反。那不是插入排序。
当您插入列表时,需要以正确的顺序放置新元素。当找到一个新值大于当前节点的值但小于下一个节点的值的节点时,可以在当前节点和下一个节点之间插入新节点。
如果它小于头节点,则将其设为新头。如果它大于末端节点,则将其放在末端。
答案 1 :(得分:0)
这是同一网页上的示例:
/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n)
{
int i, key, j;
for (i = 1; i < n; i++)
{
key = arr[i];
j = i-1;
/* Move elements of arr[0..i-1], that are
greater than key, to one position ahead
of their current position */
while (j >= 0 && arr[j] > key)
{
arr[j+1] = arr[j];
j = j-1;
}
arr[j+1] = key;
}
}