c - 删除第一个数字时出现分段错误
问题描述
问题是当我删除列表的第一个数字时,我可以删除任何人,但如果我删除第一个,则会出现分段错误。我是否错误地编写了插入或删除功能(或两者都写错了)?
int insert_values(list *l, int value){
node *new_node = (node*)malloc(sizeof(node));
if(!new_node) return 1; /*verify if the node was created*/
new_node->key = value;
new_node->next = l->head;
l->head = new_node;
return 0;
}
void del(list *l, int value){
node *p = l->head, *q;
while(p != NULL && p->key != value){
q = p;
p = p->next;
}
q->next = p->next;
free(p);
}
解决方案
如果在遍历列表以查找要删除的节点时保留指向当前节点的指针,则不必担心任何特殊情况,例如是否要删除头节点。例如:
/** delete node with value v from list (for loop) */
void del_node (list *l, int v)
{
node **ppn = &l->head; /* pointer to pointer */
node *pn = l->head; /* pointer to node */
for (; pn; ppn = &pn->next, pn = pn->next) {
if (pn->data == v) {
*ppn = pn->next; /* set address to next */
free (pn);
break;
}
}
}
这消除了特殊情况,因为ppn
保存了要删除的节点的地址。为节点的地址分配一个新的指针不会改变节点地址,只是它的内容不需要检查节点是否是你的第一个节点。在 Linus 中更全面地解释了理解指针
这假定您正在使用如下设置:
typedef struct node { /* list node */
int data;
struct node *next;
} node;
typedef struct { /* list wrapper with head & tail pointers */
node *head, *tail;
} list;
(从你的问题很明显你是)
推荐阅读
- css - 为什么 Position Fixed 表现得像 Position Absolute
- python - 如何制作没有标题栏的选项卡窗格?
- web-component - 如何使用 vue-cli 创建 Web 组件
- amazon-web-services - AWS CloudFormation 用户数据 EC2 环境变量
- php - 将音频上传到服务器 PHP android
- reporting-services - Ssrs reporting to default select parameter 2 when some value in parameter 1 is selected
- flutter - 创建新屏幕或检索现有屏幕?
- docker - 如何更新我的 Dockerfile 以使用 gcloud 注册表将应用程序打包到容器中?
- javascript - (Javascript)如何在两个用户输入的变量之间获得一个随机数?
- c# - 如果字符串包含单词替换整个字符串