2015-06-25 36 views
0

我想写插入数字(从用户)功能的节点(每个节点1号)的链接列表,然后将它们排序,按照升序方式。 我写了这个功能:排序按照升序方式

void insertnode(struct n_node *head) 
{ 
    struct n_node *temp = head; 
    int number; 
    printf("Please insert a number to the node\n"); 
    scanf("%d", &number); 
    while (number != SENTRY) 
    { 
     while ((temp->next != NULL) && (temp->next->num < number)) 
     { 
      temp = temp->next; 
     } 
     struct n_node *addNode = (struct n_node*)malloc(sizeof(struct n_node)); 
     addNode->num = number; 
     if (temp->next == NULL && number < temp->num) 
     { 
      addNode->next = temp; 
      head = addNode; 
     } 
     else 
     { 
      addNode->next = temp->next; 
      temp->next = addNode; 
     } 
     temp = head; 
     scanf("%d", &number); 
    } 
    options(); 
} 

它编译但右后我插入第一个数字是停,让我在这条线突破的消息,并指出:

while ((temp->next != NULL) && (temp->next->num < number)) 

没有出现在错误列表,任何帮助表示赞赏,谢谢!

+0

请[为什么不投(http://stackoverflow.com/q/605845/2173917)()''中的malloc C'的'返回值和家庭。 –

+0

此外,总是检查'malloc()'成功 –

+1

请注意,您无法通过新节点更新到列表的开头。 – BLUEPIXY

回答

2

在你的算法,你是不是在正确的顺序测试的特殊情况:

  • 如果列表是空的,headNULL和测试temp->next != NULL调用未定义的行为。
  • 如果数量比第一个节点的数量少,也没有必要去尝试,并遍历目录,节点需要在头部被插入。

你应该首先分配新节点和一个测试检查特殊情况:

struct n_node *addNode = malloc(sizeof(struct n_node)); 
addNode->num = number; 

if (head == NULL || number < head->num) { 
    addNode->next = head; 
    head = addNode; 
} 

否则,你的迭代循环是正确的,该节点是当你到达被temp后插入假条件:

while (temp->next != NULL && temp->next->num < number) { 
     temp = temp->next; 
    } 
    addNode->next = temp->next; 
    temp->next = addNode; 

循环变得简单多了:

void insertnode(struct n_node **headp) { 
    struct n_node *head = *headp; 
    int number; 
    printf("Please insert a number to the node\n"); 

    while (scanf("%d", &number) == 1 && number != SENTRY) { 
     struct n_node *addNode = malloc(sizeof(struct n_node)); 
     if (addNode == NULL) { 
      printf("out of memory\n"); 
      return; 
     } 
     addNode->num = number; 

     if (head == NULL || number < head->num) { 
      addNode->next = head; 
      *headp = head = addNode; 
     } else { 
      struct n_node *temp = head; 
      while (temp->next != NULL && temp->next->num < number) { 
       temp = temp->next; 
      } 
      addNode->next = temp->next; 
      temp->next = addNode; 
     } 
    } 
    options(); // head is not passed to the function? 
} 

还要注意在API的变化,使功能更新呼叫者的范围列表头,变更后的文件或补充一个神奇的数字非数字输入月底停止扫描数字。

+1

你的'临时'未被声明。 – Jokerah

+0

此功能也不起作用,因为当我尝试向节点输入一个数字时,它会得到两个数字,然后再次停止。 – Jokerah

+0

@Jokerah:你准确地输入了什么? – chqrlie