我想创建一个将元素添加到链表末尾的函数。如果元素成功添加,它也必须返回0,如果元素没有分配/保存,则返回1。
问题是,我如何知道内存是否已成功分配或元素是否已成功添加?这是代码:
int push_back(pos_t *head, int new_value) {
pos_t *temp = head;
while (temp->next != NULL) {
temp = temp->next;
}
pos_t *temp1 = (pos_t *)malloc(sizeof(pos_t));
temp1->data = new_value;
temp1->next = NULL;
temp = temp1;
}
答案 0 :(得分:1)
您需要添加以下代码
if (temp1 == NULL) { return 1; }
因为malloc
被定义为返回指向已分配内存的指针,或
您可以控制不要求大小为零,因此如果使用正大小并且malloc
返回NULL,则可以推断出发生错误。
许多系统都有"手册"安装。如果您使用的是Linux系统,请使用命令" man malloc"将拉出malloc
的手册页。如果您正在使用Windows系统,则the manual for malloc
的网络搜索将为您提供足够的详细信息来处理详细信息。
答案 1 :(得分:0)
该函数有一个缺点:它不能用于分配列表中的第一个节点,即列表是否为空。
原型应改为
int push_back(pos_t **headp, int new_value);
传递列表指针的地址而不是其值。
测试malloc()
失败很简单:juts将返回的指针与NULL
或0
进行比较。
以下是相应的代码:
int push_back(pos_t **headp, int new_value) {
pos_t *temp = *headp;
pos_t *temp1 = malloc(sizeof(pos_t));
if (temp1 == NULL) { // allocation failure
return 1;
}
temp1->data = new_value;
temp1->next = NULL;
if (temp == NULL) { // empty list
*headp = temp1;
} else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = temp1; // append node to the end of the list
}
return 0;
}