【发布时间】:2022-01-05 23:54:08
【问题描述】:
我的任务是从单链表中删除一个节点,并将该节点的 dataPtr 指向的结构设置为一个新值。我创建了一个结构指针来保存弹出节点的数据。有两种情况我想捕捉 1) 这个新指针为空,我想将它设置为弹出的节点 2) 如果指针不为空,我想对其进行一些操作。
NODE* printer;
printer = (NODE*) malloc(sizeof (NODE)); //dynamically allocate
if(printer==NULL){ //if it has no data
printer= deleteNode(sList); //call deleteNode function which returns popped node from the passed singly linked list
} else if (printer!=NULL && sList->count!=0) { //if it has data
(((PRINTJOB *) printer->dataPtr)->pageNums) -= PAGESPERMINUTE; //decrement the pageNums field by 1 (PAGESPERMINUTE)
if ((((PRINTJOB *) printer->dataPtr)->pageNums) <= 0) { //if the field is less than 0
printer = NULL; //set pointer back to null
}
printf("printers pageNum is: %d\n", ((PRINTJOB *) printer->dataPtr)->pageNums);
}
我的编译器在第 4 行给我一个错误:该值从未使用过。 它还在我的 else if 语句中给了我一个错误:第一个条件始终为真。 当我也运行此代码块时,它会使我的程序崩溃。
我的deleteNode函数是:
#include "headers.h"
void* deleteNode(LIST* list){
NODE *toDelete;
toDelete = list->head;
list->head = toDelete->next;
return toDelete;
}
我的节点结构是:
typedef struct node{
void* dataPtr;
struct node* next;
} NODE;
【问题讨论】:
-
你不需要测试
printer!=NULL,如果它恰好是NULL,它只会得到它 -
代码没有多大意义。您正在为新节点分配未初始化的内存。如果分配失败,则调用
deleteNode函数将最前面的项目从列表中弹出。如果分配成功,您将开始尝试访问此未初始化节点中的内容,这将导致未定义的行为。如果这没有崩溃,那么您有可能最终将指针设置为 NULL,这会泄漏内存,然后您的printf调用将在您执行 NULL 取消引用后崩溃。 -
你的删除函数有一个bug,当你从函数返回时你没有改变列表的头部
-
我的删除功能有什么错误?
-
@vmp 这是不必要的。可以将列表作为指针传递。那不是错误。如果有的话,应该鼓励 OP简化他们对指针的使用,因为他们显然难以理解如何使用它们。
标签: c linked-list dynamic-memory-allocation singly-linked-list