Для начала код, который вы показали, не является кодом C ++. Это код C.
Это плохая идея определять глобальные переменные, такие как first
и last
, и когда функции зависят от глобальных переменных. В этом случае вы не можете создать более одного списка в программе.
Что касается функции delete
, то в общем случае она имеет неопределенное поведение. Его можно вызвать для пустого списка.
Более того, в этом; l oop
for(p=q=first;p=0;q=p,p=p->urm)
в выражении условия есть опечатка. Вы используете оператор присваивания вместо оператора сравнения.
И функция игнорирует случай, когда список содержит только один узел, потому что в этом случае он не обновляет последний узел.
Тем не менее Используя ваш подход, функция удаления может выглядеть следующим образом.
void delete(int x)
{
if ( first )
{
if ( first->key == x )
{
NOD *tmp = first;
first = first->urm;
free( tmp );
if ( first == NULL ) last = NULL;
}
else
{
NOD *p = first;
while ( p->urm != NULL && p->urm->key != x )
{
p = p->urm;
}
if ( p->urm != NULL )
{
NOD *tmp = p->urm;
p->urm = p->urm->urm;
free( tmp );
if ( p->urm == NULL ) last = p;
}
}
}
}
Вот демонстрационная программа.
#include <stdio.h>
#include <stdlib.h>
typedef struct nod
{
int key;
struct nod *urm;
} NOD;
NOD *first=0,*last=0;
void add(int x)
{
NOD *p=(NOD*)malloc(sizeof(NOD));
p->key=x;
p->urm=0;
if(0==first)
{
first=p;
last=p;
}
else{
last->urm=p;
last=p;
}
}
void delete(int x)
{
if ( first )
{
if ( first->key == x )
{
NOD *tmp = first;
first = first->urm;
free( tmp );
if ( first == NULL ) last = NULL;
}
else
{
NOD *p = first;
while ( p->urm != NULL && p->urm->key != x )
{
p = p->urm;
}
if ( p->urm != NULL )
{
NOD *tmp = p->urm;
p->urm = p->urm->urm;
free( tmp );
if ( p->urm == NULL ) last = p;
}
}
}
}
void show()
{
for(NOD *p=first;p!=0;p=p->urm)
{
printf("%d ",p->key);
}
printf("\n");
}
int main()
{
add(10);
add(20);
add(30);
add(40);
show();
delete(30);
show();
add( 50 );
add( 60 );
add( 70 );
add( 80 );
show();
delete(80);
show();
return 0;
}
Ее вывод
10 20 30 40
10 20 40
10 20 40 50 60 70 80
10 20 40 50 60 70