【发布时间】:2026-01-01 04:50:01
【问题描述】:
我想在两个节点之间执行二元运算,将结果存储在一个节点中并消除另一个节点。这是我写的:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
struct n{
double value;
char op;
struct n *next;
};
void delete(struct n *head);
void add_item(struct n **ptr, double *data);
int main(){
struct n *head = NULL;
double result;
add_item(&head, 5);
add_item(&head, 3);
head->op = '*';
result = (head->next)->value * head->value;
(head->next)->value = result;
delete(head);
printf("%lf\n",head->value);
free(head);
return 0;
}
void add_item(struct n **ptr, double *data)
{
struct n *item = malloc(sizeof *item);
item->value = *data;
item->next = *ptr;
item->op = '?';
*ptr = item;
}
void delete(struct n *head)
{
struct n *temp;
temp = head->next;
head->next = temp->next;
free(temp);
}
在这个例子中,我有一个类似3 -> 5 -> NUll 的列表。我想得到这个15 -> NUll。
当我尝试打印剩余节点的值时,我得到3 而不是15
【问题讨论】:
-
您显示的代码接近到minimal reproducible example,但还不够接近。
head是什么?包含哪些头文件? -
并想一想当您执行
(head->next)->value = result;后跟delete(head)会无条件删除列表中的second 节点时会发生什么。 -
解决您的问题的方法是创建一个函数,从列表中删除(但不删除)“头”节点,然后返回它。然后你可以移除头部两次以获取它们的值,执行你想要的操作,并添加一个带有结果的新节点。将列表视为堆栈(带有推送和弹出操作)。
-
您的“删除”不会改变 head 的值。它仍然指向您要删除的相同元素。
-
很确定你的意思是
void delete(struct n **head) {struct n *tmp; tmp=(*head)->next; free(*head) ;*head=tmp;}
标签: c struct linked-list singly-linked-list