链表中的节点删除

Node deletion in a chained list

如果我想删除它的第一个元素,如何更改指向链表第一个元素的名为“* FIRST”的指针?

-我的问题是,当我删除第一个节点时,指针指向第二个node.But 当我显示我指向的元素的地址时,我发现 FIRST=NULL.

提前致谢。

#include <stdio.h>
#include <stdlib.h>
typedef struct
{int note;
 struct personne *next;
}personne;
personne *first=NULL;

void saisi (personne *first,int mark)
{  personne *nouveau=malloc(sizeof(personne));
   nouveau->note=mark;
   nouveau->next=NULL;
   if(first==NULL)
   first=nouveau;  // here is the problem 
else
{  personne *tmp;
   tmp=first;
while (tmp->next!=NULL) tmp=tmp->next;
   tmp->next=nouveau;
}
}
void affichage (personne *first)
{int i=1;
    personne *tmp;
tmp=first;
    do
    {printf("la note %d : %d \n",i,tmp->note);
     i++;tmp=tmp->next;
    }while (tmp!=NULL);
}
void suppresion (personne *first,int n)
{personne *tmp1=NULL,*tmp2=NULL;
  tmp1=first;
while (tmp1 != NULL)
{ if ((tmp1->note) >n){
  tmp2->next=tmp1->next;
 }
  tmp2=tmp1;
  tmp1=tmp1->next;
}

}
int main()
{
int N=1,mark=0,n=0;
while (N!=4)
{ printf ("donner la note %d:",N);
  scanf ("%d",&mark);
  saisi (first,mark);
  N++;
}
  affichage (first);
  printf("donner n :");
  scanf("%d",&n);
  suppresion (first,n);
  affichage(first);
    return 0;
}

1.- 由于 "first" 是一个全局变量,您不需要在每次函数调用时将其作为参数传递。

2.- 在 "suppresion" 方法中,当您尝试调用 "temp2->next".

时,"temp2" 可能指向 NULL

3.- 删除列表中的元素时必须释放内存。

4.- 我不太明白你在问什么,但是如果你想删除链表中的许多元素,这是我制作抑制方法的方法,假设该方法删除所有带有 (mark > n) 的节点:

void suppresion (int n)
{
    personne *tmp1=NULL,*tmp2=NULL;

    tmp1=first;

    //First check all elements except the first one
    while (tmp1 != NULL)
    { 
        if ((tmp1->next != NULL)&&(tmp1->next->note >n))
        {
            tmp2=tmp1->next;
            tmp1->next = tmp2->next;
            free(tmp2);
        }
        else
        {
            tmp1=tmp1->next;
        }
    }
    //Now go for the first element
    if(first != NULL && first->note > n)
    {
        tmp1 = first;
        first = tmp1->next;
        free(tmp1);
    }
}

该方法搜索数组的所有元素,并在一次方法调用中删除所有具有标记 > n 的元素;通常你会创建一个删除具体元素的方法,然后在你的代码的另一部分的循环中调用它。

正如 dasblinkenlight 所评论的那样,使用指向指针的指针:

void saisi (personne **ppfirst, int mark)
{
personne **ppnode = ppfirst;
    personne *nouveau=malloc(sizeof(personne));
    nouveau->note=mark;
    nouveau->next=NULL;
    while(*ppnode != NULL)
        ppnode = &((*ppnode)->next);
    *ppnode = nouveau;
}

void suppresion (personne **ppfirst, int n)
{
personne **ppnode = ppfirst;
personne  *pnode;
    while (*ppnode != NULL)
    {
        if((*ppnode)->note > n){
            pnode = *ppnode;
            *ppnode = (*ppnode)->next;
            free(pnode);
        } else {
            ppnode = &((*ppnode)->next);
        }
    }
}
/* ... */
    saisi(&first, mark);
/* ... */
    suppresion(&first, n);