将节点插入链接列表中的最后位置

时间:2015-01-22 10:37:01

标签: c linked-list

我需要将一个节点插入到链表的最后位置。这就是我想出的:

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

struct node { float data;
                struct node * next;
};

struct node* makenode(float item){
    struct node* p=(struct node*)malloc(sizeof (struct node));
    if(p) p->data = item;
    return p;
}
void init (struct node **p){
    *p=0;
}
int addlast(struct node **ptr, float item){
    struct node* p=makenode(item);
    if(!p) return 0;
    struct node* temp=*ptr;
    while(temp->next)temp = temp->next;
    p->next=0;
    temp->next=p;
    return 1;
}      
float delfirst(struct node **ptr){
    struct node* p =*ptr;
    *ptr=(*ptr)->next;
    float temp=p->data;
    free(p);
    return temp;
}

void main(){
    struct node *list,*list2;
    init (&list);
    int i;

    for(i=0;i<10;i++)addlast(&list,i);

    while(list)printf("%4.2f\t",delfirst(&list));
    getchar();

}

但是当我编译我的代码时,它会继续崩溃并且错误在addlast函数中。但我找不到我错的地方。谁能告诉我addlast功能在哪里出错?

3 个答案:

答案 0 :(得分:0)

您的makenode函数存在缺陷,它不会初始化结构中的所有元素。

您的addlast也存在缺陷,因为当您添加第一个节点时,*ptrNULL并且您取消引用此NULL temp->next中的指针,指向undefined behavior

答案 1 :(得分:0)

struct node* temp=*ptr;
while(temp->next)temp = temp->next;

当您调用addlast() API时,传递一个指针NULL,并使用此指针初始化temp并开始使用temp。

访问/解除引用NULL指针将导致未定义的行为,从而导致崩溃。

答案 2 :(得分:0)

在使用temp之前测试temp->next是否为NULL。