如何更改名为" * 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;
}
答案 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);