首页 > 解决方案 > 删除第一个数字时出现分段错误

问题描述

问题是当我删除列表的第一个数字时,我可以删除任何人,但如果我删除第一个,则会出现分段错误。我是否错误地编写了插入或删除功能(或两者都写错了)?

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);
}

标签: cpointerssingly-linked-list

解决方案


如果在遍历列表以查找要删除的节点时保留指向当前节点的指针,则不必担心任何特殊情况,例如是否要删除头节点。例如:

/** 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;

(从你的问题很明显你是)


推荐阅读