将节点插入到 LinkedList 中的最后一个位置
Insert a node to last position in a 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
函数哪里出错了?
您的 makenode
函数有缺陷,它没有初始化结构中的所有元素。
您的 addlast
也有缺陷,因为当您添加第一个节点时 *ptr
是 NULL
并且您正在取消引用此 NULL
指针temp->next
,导致 undefined behavior。
struct node* temp=*ptr;
while(temp->next)temp = temp->next;
当您调用 addlast()
API 时,您会传递一个指针 NULL
并使用该指针来初始化 temp 并开始使用 temp。
Accessing/Dereferencing NULL
指针将导致未定义的行为并因此导致崩溃。
在使用 temp->next
之前测试 temp
是否不为 NULL。
我需要在链表的最后一个位置插入一个节点。这是我想出的:
#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
函数哪里出错了?
您的 makenode
函数有缺陷,它没有初始化结构中的所有元素。
您的 addlast
也有缺陷,因为当您添加第一个节点时 *ptr
是 NULL
并且您正在取消引用此 NULL
指针temp->next
,导致 undefined behavior。
struct node* temp=*ptr;
while(temp->next)temp = temp->next;
当您调用 addlast()
API 时,您会传递一个指针 NULL
并使用该指针来初始化 temp 并开始使用 temp。
Accessing/Dereferencing NULL
指针将导致未定义的行为并因此导致崩溃。
在使用 temp->next
之前测试 temp
是否不为 NULL。