【发布时间】:2020-01-25 20:04:58
【问题描述】:
我正在尝试搜索可能包含事件 (int) 的单链表。我需要跟踪当前正在处理的节点和它之前的两个节点(需要处理)。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int eventnum;
int eventfq;
struct node *next;
} node;
void insertevent(node **list, int event);
void srchevent(node *list, int xevent, node **current, node **previous, node **pprevious);
int main() {
node *list = NULL;
int i = 0;
for(i = 0; i < 10; i++) {
insertevent(&list, i);
}
}
void insertevent(node **list, int event) {
node *newnode = (node *)malloc(sizeof(node));
node *current, *previous, *pprevious;
srchevent(*list, event, ¤t, &previous, &pprevious);
}
void srchevent(node *list, int xevent, node **current, node **previous, node **pprevious) {
*pprevious = *previous = NULL;
*current = list;
printf("current:\naddr:%d\nval:%d\n\n", ¤t, current);
printf("previous:\naddr:%d\nval:%d\n\n", &previous, previous);
printf("pprevious:\naddr:%d\nval:%d\n\n", &pprevious, pprevious);
(*previous)->next = current;
/* nothing past here executes */
printf("current:\naddr:%d\nval:%d\n\n", ¤t, current);
printf("previous:\naddr:%d\nval:%d\n\n", &previous, previous);
printf("pprevious:\naddr:%d\nval:%d\n\n", &pprevious, pprevious);
(*pprevious)->next = *current;
}
输出:
adding 0
current:
addr:6422216
val:6422248
previous:
addr:6422220
val:6422244
pprevious:
addr:6422224
val:6422240
此代码应在列表中插入 10 个节点(插入功能尚未实现)。但是,执行在第 34 行结束 ((*previous)->next = *current;)。我不明白为什么分配上一个的下一个值会导致程序结束。
注意:srchevent(...) 的结构和参数不能更改。
【问题讨论】:
-
阅读How to Ask 和minimal reproducible example。发布您的输入和结果输出。
-
使用调试器和/或改进您的调试语句。至少,使用调试器或
printf检查所有指针值。您可能会发现一个或多个指针为 NULL 或无效。无论如何,我们无法调试不完整的代码,需要minimal verifiable example,如前所述。 -
感谢您的提示,已尝试实施您的建议
标签: c pointers singly-linked-list