链表中的节点删除
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);
如果我想删除它的第一个元素,如何更改指向链表第一个元素的名为“* 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" 可能指向 NULL3.- 删除列表中的元素时必须释放内存。
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);