在带头结点的单链表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 的结果。
#include#include 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; }



