循环列表和排序

Cycle through List and Ordering

我想创建一个链表。 用户添加数字,思路是数字按降序插入列表。

这是我所做的,但是在重新排列时,它只排序了第一个数字...

int addInputNumber(numberList **node){

  numberList *temp;
  int userInput;
  temp = (numberList*)malloc(sizeof(numberList));
  //Memory Check
  if ( temp == 0 )//out of memory, return 0
      return 0;
  //Get the users input
  printf("Give me a Number!\n");
  scanf("%d",&userInput);

 //Add it to the list.
  temp->numbero = userInput;
  ///Link to the list.
  temp->next = *node; 
  *node = temp; 

  //Lets cycle through the list.
  numberList *temp2;
  int helpNumber;
  temp2 = *node;

  //Rearrange the list.
  while(temp2 != 0){
    if(temp->numbero < temp2->numbero){

      //Switch position..
      helpNumber= temp2->numbero;
      temp2->numbero = temp->numbero;
      temp->numbero = helpNumber;
      temp2 = *node;// If we change number, we must cycle from the beginning AGAIN. 
    }//eof if
    temp2 = temp2->next;
  }//eof while

  return 0;
}//eof addNUmber function.

以下是以防万一的结构:

typedef struct dynamicNumberList {
  int numbero;
  struct dynamicNumberList *next;
}numberList;

我有 2 个简单的问题。

  1. 为什么只排第一个数?

  2. 这个列表在左边(视觉上)添加了一个 space,我怎样才能让它在右边添加一个 space?

您需要养成为每个任务创建一个函数的习惯,而不是将所有内容都塞进一个函数中。它使代码更易于阅读和重用,并减少出错的机会。

正确的实现可能如下所示:

#include <stdio.h>
#include <stdlib.h>

typedef struct s_List
{
  int n;
  struct s_List *next;
} List;

void print_list (List *head)
{
    List *ptr;

    for (ptr = head; ptr; ptr = ptr->next) {
        printf ("%d\t", ptr->n);
    }
    putchar ('\n');
}

List * make_node (int n, List *next)
{
    List * node = malloc (sizeof(List));
    node->n = n;
    node->next = next;
    return node;
}

void insert_number_front (List **head, int n)
{
    *head = make_node (n, *head);
}

void insert_number_after (List *prev, int n)
{
    prev->next = make_node (n, prev->next);
}

// If HEAD is sorted, it will stay sorted after insertion
void insert_number_sorted (List **head, int n)
{
    List *ptr;
    List *ptr2;

    // search for the rightmost node whose number is smaller than n.
    ptr2 = NULL;
    for (ptr = *head; ptr; ptr = ptr->next) {
        if (ptr->n >= n)
            break;
        ptr2 = ptr;
    }

    // If such a node exists we insert the new node after it,
    // otherwise we insert it at the front of the list.
    if (ptr2) {
        insert_number_after (ptr2, n);
    }
    else {
        insert_number_front (head, n);
    }
}   

int input_number ()
{
    int n;

    printf ("enter a number: ");
    scanf ("%d", &n);
    return n;
}

int main ()
{
    List *head = NULL;
    int i;

    // By adding elements exclusively with insert_number_sorted()
    // we ensure the list is always sorted
    for (i = 0; i < 5; i++) {
        int n;

        n = input_number ();
        insert_number_sorted (&head, n);
    }

    print_list (head);

    return 0;
}

回答你的第二个问题,你这里有一个单链表,可以用指向第一个节点的指针来描述。如果您希望能够在后面插入节点,则需要维护一个指向最后一个节点的附加指针。然而,在这种情况下这不是必需的。