向链表添加编号时出错

时间:2014-11-12 00:23:42

标签: c list pointers null

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

#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);
}

1 个答案:

答案 0 :(得分:0)

我认为您的问题与功能有关 - Node** place(Node ** start, int number)

如果您尝试插入值大于列表中任何当前项的新项,start将返回NULL。因此,在add中,new->next将为NULL,这可能是您在列表项范围内添加项目时的原因。

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