在带头结点的单链表L中,删除所有值为x的节点,并释放其空间,假设值为x的 不唯一,编写算法实现以上操作(c语言实现)

在带头结点的单链表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;
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值