【问题标题】:Error when adding number to linked list将数字添加到链表时出错
【发布时间】:2015-01-08 17:22:00
【问题描述】:

当我在列表中添加一个比任何内容都大的数字时,我遇到了这个运行时错误。我不明白为什么。我认为代码应该只添加包含数字的节点并将空指针称为下一个节点。

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


struct Node{
    int value;
    struct Node * next;
};

typedef struct Node Node;

void front(int, Node**);
void print(Node*);
void add(Node**,int);
Node**place(Node**,int);
void verwijder(Node**, int);
void clearList(Node**);

int main () {
int i;  
Node * l = 0;   
front(10,&l);
front(5,&l);
front(1,&l);
add(&l,9);
add(&l,5);
add(&l,11);
verwijder(&l,5);
verwijder(&l,9);
verwijder(&l,1);
clearList(&l);
free(l);
print(l);
}

void front(int number,Node ** start ) {
    Node * new = malloc(sizeof(Node));
    new->value = number;
    new->next = *start;
    *start = new;
}

Node** place(Node ** start, int number){
    while((*start)->value < number && (*start) != 0) {
        start = &((*start)->next);
    }
    return start;
}

void add(Node ** start, int number) {
    Node ** space = place(start,number);
    Node * new = malloc(sizeof(Node));
    new->value = number;
    new->next = *space;
    *space = new;
}

void verwijder(Node ** start, int number) {
      Node**space = place(start,number);
      Node * delete = *space;
      if(delete->value == number) {
      *space = (*space)->next;  
      }
      free(delete);
}

void print(Node * l) {
    while( l != 0) {
        printf("%i -> ",(l)->value);
        l = (l)->next;
    }
    printf("0 \n");
}

void clearList(Node** start) {
    Node * current = *start;
    while(current != 0) {
        *start = (*start)->next;
        free(current);
        current = *start;
    }
    free(current);
}

【问题讨论】:

  • 在函数place 中检查列表中的项目是否小于number 的任何原因?此外,为了避免总是遍历列表来添加项目,最好跟踪最后一个节点,即尾部。在这种情况下,您可以改为在O(1) 中执行此操作。
  • 我希望对新添加的元素进行排序,因此我会检查何时获得比我愿意添加的元素更高的元素,并将指针指向该节点。
  • 你有没有设法插入任何项目?
  • 项目似乎被添加,只要它们不超过最高数字的值。

标签: c list pointers null


【解决方案1】:

我认为您的问题在于功能 - Node** place(Node ** start, int number)

如果您尝试插入一个值大于列表中任何当前项目的新项目,start 将返回 NULL。所以在add 中,new-&gt;next 将是NULL,这可能就是为什么如果您在列表项的范围内添加一个项,它会起作用。

您需要检查是否要附加列表。如果您的项目将成为该列表中的最后一个项目,那么您需要确保之前的最后一个项目现在指向新项目。

【讨论】:

  • 我将我的 while 语句更改为以下内容:Node** place(Node ** start, int number){ while(*start != 0 &amp;&amp; (*start)-&gt;value &lt; number) { start = &amp;((*start)-&gt;next); } return start; } 但是它看起来和我一模一样,但现在代码可以工作了,知道为什么吗?
猜你喜欢
  • 2017-05-04
  • 1970-01-01
  • 2015-05-04
  • 2012-09-22
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多