C - 从链表中弹出最后一项
C - Popping last item from linked lists
我正在学习链表,它们给我带来了很多麻烦。
我正在通过此调用调用该函数:
pop(&list);
代码如下:
void pop(NODE** first) {
if(*first != NULL && first!= NULL){
NODE* ptr = *first;
while(ptr->next->next != NULL){
ptr = ptr->next;
}
free(ptr->next);
ptr->next = NULL;
}
即使我调用它一次,它也会导致内存泄漏错误..
多次调用此函数时,内存泄漏错误较多
提前致谢,Mimpopo。
编辑:节点的定义
typedef struct node {
int data;
struct node *next;
} NODE;
完整代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} NODE;
NODE* insert(NODE *first, int n){
// create new node
NODE* new = (NODE*)malloc(sizeof(NODE));
new->data = n;
new->next = NULL;
// if first is NULL, this will be the first
if(first == NULL)
return new;
// otherwise, place it correctly
NODE* ptr = first;
// check inserting at the begining
if(ptr->data > new->data){
new->next = ptr;
return new;
}
// insert in the middle
while(ptr->next != NULL){
if(ptr->next->data > n && ptr->data < n){
new->next = ptr->next;
ptr->next = new;
break;
}
ptr = ptr->next;
}
// insert at the end of list
if(ptr->next == NULL){
ptr->next = new;
}
return first;
}
void traverse(NODE *first){
NODE* ptr = first;
while(ptr != NULL){
printf("%d\n", ptr->data);
ptr = ptr->next;
}
}
NODE* search(NODE *first, int n){
NODE* ptr = first;
while(ptr != NULL){
if(ptr->data == n){
printf("FOUND %d\n!", n);
return ptr;
}
ptr = ptr->next;
}
}
int main(){
NODE* first = NULL;
NODE* this = NULL;
first = insert(first, 7);
first = insert(first, 10);
first = insert(first, 11);
first = insert(first, 1);
first = insert(first, 3);
first = insert(first, 5);
first = insert(first, 22);
first = insert(first, 23);
first = insert(first, 24);
first = insert(first, 125);
pop(&first);
}
你的代码我没有全部看一遍,但是函数可以这样写
void pop( NODE ** first )
{
if ( *first != NULL )
{
NODE *prev = NULL;
NODE *current = *first;
while ( current->next )
{
prev = current;
current = current->next;
}
if ( prev != NULL ) prev->next = current->next;
else ( *first = NULL );
free( current );
}
}
至于你的函数实现,那么它有很多错误。例如在这个声明中
if(*first != NULL && first!= NULL){
你应该交换第一个和第二个比较。那就是条件看起来像
if(first != NULL && *first!= NULL){
在此声明中
while(ptr->next->next != NULL){
您必须确保 ptr->next
不等于 NULL。
也没有检查删除的节点是否是列表的第一个节点。
考虑到函数insert也是错误的。您只考虑此代码段中的一个条件
while(ptr->next != NULL){
if(ptr->next->data > n && ptr->data < n){
new->next = ptr->next;
ptr->next = new;
break;
}
ptr = ptr->next;
}
不过也可以这样
ptr->next->data >= n && ptr->data < n
或
ptr->next->data > n && ptr->data <= n
我正在学习链表,它们给我带来了很多麻烦。 我正在通过此调用调用该函数:
pop(&list);
代码如下:
void pop(NODE** first) {
if(*first != NULL && first!= NULL){
NODE* ptr = *first;
while(ptr->next->next != NULL){
ptr = ptr->next;
}
free(ptr->next);
ptr->next = NULL;
}
即使我调用它一次,它也会导致内存泄漏错误..
多次调用此函数时,内存泄漏错误较多
提前致谢,Mimpopo。
编辑:节点的定义
typedef struct node {
int data;
struct node *next;
} NODE;
完整代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} NODE;
NODE* insert(NODE *first, int n){
// create new node
NODE* new = (NODE*)malloc(sizeof(NODE));
new->data = n;
new->next = NULL;
// if first is NULL, this will be the first
if(first == NULL)
return new;
// otherwise, place it correctly
NODE* ptr = first;
// check inserting at the begining
if(ptr->data > new->data){
new->next = ptr;
return new;
}
// insert in the middle
while(ptr->next != NULL){
if(ptr->next->data > n && ptr->data < n){
new->next = ptr->next;
ptr->next = new;
break;
}
ptr = ptr->next;
}
// insert at the end of list
if(ptr->next == NULL){
ptr->next = new;
}
return first;
}
void traverse(NODE *first){
NODE* ptr = first;
while(ptr != NULL){
printf("%d\n", ptr->data);
ptr = ptr->next;
}
}
NODE* search(NODE *first, int n){
NODE* ptr = first;
while(ptr != NULL){
if(ptr->data == n){
printf("FOUND %d\n!", n);
return ptr;
}
ptr = ptr->next;
}
}
int main(){
NODE* first = NULL;
NODE* this = NULL;
first = insert(first, 7);
first = insert(first, 10);
first = insert(first, 11);
first = insert(first, 1);
first = insert(first, 3);
first = insert(first, 5);
first = insert(first, 22);
first = insert(first, 23);
first = insert(first, 24);
first = insert(first, 125);
pop(&first);
}
你的代码我没有全部看一遍,但是函数可以这样写
void pop( NODE ** first )
{
if ( *first != NULL )
{
NODE *prev = NULL;
NODE *current = *first;
while ( current->next )
{
prev = current;
current = current->next;
}
if ( prev != NULL ) prev->next = current->next;
else ( *first = NULL );
free( current );
}
}
至于你的函数实现,那么它有很多错误。例如在这个声明中
if(*first != NULL && first!= NULL){
你应该交换第一个和第二个比较。那就是条件看起来像
if(first != NULL && *first!= NULL){
在此声明中
while(ptr->next->next != NULL){
您必须确保 ptr->next
不等于 NULL。
也没有检查删除的节点是否是列表的第一个节点。
考虑到函数insert也是错误的。您只考虑此代码段中的一个条件
while(ptr->next != NULL){
if(ptr->next->data > n && ptr->data < n){
new->next = ptr->next;
ptr->next = new;
break;
}
ptr = ptr->next;
}
不过也可以这样
ptr->next->data >= n && ptr->data < n
或
ptr->next->data > n && ptr->data <= n