链接列表中的节点删除

时间:2015-01-08 13:47:29

标签: c nullpointerexception

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

-my的问题是,当我删除第一个节点时,指针点在seconde节点中。但是当我显示我指向的元素的地址时,我发现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;
}

2 个答案:

答案 0 :(得分:0)

1.-从&#34;第一&#34;是一个全局变量,您不需要在每次函数调用时将其作为参数传递。

2.-在&#34; suppresion&#34;方法,&#34; temp2&#34;当你试图调用&#34; temp2-&gt; next&#34;时可能指向NULL。

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

4.-我不太清楚你在问什么,但是如果你想删除你链接列表中的许多元素,这就是我制作抑制方法的方法,假设该方法删除所有带有(mark&gt; 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);
    }
}

该方法搜索数组的所有元素并删除所有带有标记&gt;的元素。 n只用一个方法调用;通常,您创建一个删除具体元素的方法,并从代码的另一部分的循环中调用它。

答案 1 :(得分:0)

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