2015-01-22 7 views
0

Мне нужно вставить узел в последнюю позицию связанного списка. Это то, что я придумал:Вставьте узел в последнюю позицию в LinkedList

#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?

ответ

0

Функция makenode ошибочна, она не инициализирует все элементы в структуре.

Ваш addlast также недостатки, в том, что при добавлении первого узла затем *ptr является NULL и вы разыменование этого NULL указателя в temp->next, что приводят к undefined behavior.

+0

Большое спасибо за указание на то, что – Mike

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

При вызове API addlast() ваш пропуск указатель, который NULL и использовать этот указатель, чтобы инициализировать темп и начать использовать темп.

Доступ к вызову/Dereferencing NULL Указатели приведут к неопределенному поведению и, следовательно, к сбою.

0

Проверка, если temp не является NULL, прежде чем использовать temp->next.

Смежные вопросы