在带头结点的单链表L中,删除所有值为x的节点,并释放其空间,假设值为x的 不唯一,编写算法实现以上操作
具体实现操作
link *deletx(link *p,int elem){
link *t = p->next;
link *pret = p;//建立两个指针,一个指向要删除的结点,一个指向要删除的前驱结点
link *del;
while(t != NULL){
if(t->data == elem){
del = t;//临时储存要删除的值,以防丢失
t = t->next;
pret->next = t;//删除了该结点
free(del);//释放空间
}else {//同步后移
pret = t;
t = t->next;
}
}
return p;
}
完整代码实现
此段代码实现创建单链表和输出,可视化删除x 的结果。
/*在带头结点的单链表L中,删除所有值为x的节点,并释放其空间,
假设值为x的不唯一,编写算法实现以上操作
@季风ss*/
#include <stdio.h>
#include <stdlib.h>
typedef struct LINK//定义结构链表
{
int data;//数据域
struct LINK *next;//指针域
}link;
link * initlink();
void putout(link *p);
link *deletx(link *p,int elem);
int main(){
printf("请输入n项数值初始化链表,输入999结束:\n");
link *p = initlink();
printf("输入要删除的x值:\n");
int x;
scanf("%d",&x);
p = deletx(p,x);
putout(p);
return 0;
}
link * initlink(){//尾插法初始化一个单链表
link * p=(link*)malloc(sizeof(link));//创建头结点
link *temp = p;
int i;
scanf("%d",&i);
while(i != 999){
link *a = (link*)malloc(sizeof(link));
a->data = i;
temp->next = a;
temp = a;
scanf("%d",&i);
}
temp->next = NULL;
return p;
}
void putout(link *p){
link* temp=p;
while (temp->next) {
temp=temp->next;
printf("%d ",temp->data);
}
printf("\n");
}
link *deletx(link *p,int elem){
link *t = p->next;
link *pret = p;//建立两个指针,一个指向要删除的结点,一个指向要删除的前驱结点
link *del;
while(t != NULL){
if(t->data == elem){
del = t;//临时储存要删除的值,以防丢失
t = t->next;
pret->next = t;//删除了该结点
free(del);//释放空间
}else {//同步后移
pret = t;
t = t->next;
}
}
return p;
}