从图中我们可以看出,如果要把b这个节点删除,有两种方法:
1、让C(包括C)后面的数据整体上向前移动一个位置,把b位置的数据进行覆盖处理
2、利用a这个节点进行操作。利用a->next = a->next->next来把a的下一个指针指向c,并把b的next指针置空即可
讨论:
1)第一种方法,的确可以使得b的数据被覆盖删除,但是问题是,如果c后面的数据有很多,而你又必须记下当前位置和链表尾部位置时才能进行的操作,那么在时间上就消耗比较多,这种方法不建议使用
2)第二种方法,只要我找到了删除点的前一个位置,那么我就可以使用结构体指针的作用改写当前位置next指向的位置。
程序:
typedef struct node
{
int data;
struct node next;
}*listlink;
void display(listlink head)
{
listlink p = head->next;
while(p != NULL)
{
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
bool delete_node(int val,linklist head)
{
listlink p = head->next;
listlink q = head;
if(p->next == NULL)
{
printf("No data delete\n");
return false;
}
while(p != NULL)
{
if(p->next->data == val)
{
q->next = p->next;
free(p);
}
else
{
q = p;
}
p = p->next;
}
display(head);
return true;
}
int main()
{
int val,value;
while(1)
{
int ret = scanf("%d",&val);
if(ret != 1)
break;
printf("enter a nuber:");
scanf("&d",&value);
switch(val)
{
case 1:insert(value,head)//这个插入函数请自己写
break;
case 2:delete(value,head);break;
default:break;
}
}
return 0;
}
注意,删除的前提是已经有插入的数据,不然就没办法删除
插入的程序比较简单,留给读者自己编写:
1、创建一个节点,并让这个节点的next指向NULL,数据有键盘输入
2、判断插入的数据是否为尾端(这里采用尾端插入),是的话就开始插 入
3、利用一下语句(p = p->next,new为创建好的新节点)
new->next = NULL;
p->next = new;
即可创建插入一个节点