对于初学者来说,您展示的代码不是 C++ 代码。这是一个C代码。
定义像这样的全局变量是一个坏主意first
and last
当函数依赖于全局变量时。在这种情况下,您不能在程序中创建多个列表。
至于功能delete
那么一般来说它有未定义的行为。可以调用它来获取空列表。
而且在这个;循环中
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