王道上几道链表的小题(上)

  • 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
void del_x(Linklist &L, ElemType x){
    LNode *p;
    if(L == NULL){
        return;
    }
    if(L->data == x){
        p = L;
        L = L->next;
        free(p);
        del_x(L, x);
    }else{
        del_x(L->next, x);
    }
}
  • 在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作
// 普通方式
void del_x(Linklist &L, ElemType x){
    LNode *p = L->next, *pre = L, *q;
    while(p != NULL){
        if(p->data == x){
            q = p;
            p = p->next;
            pre->next = p;
            free(q);
        }else{
            pre = p;
            p = p->next;
        }
    }
}

// 尾插法,值不为x的结点尾插建表,值为x的结点释放
void del_x(Linklist &L, ElemType x){
    LNode *p = L->next, *r = L,  *q;
    while(p != NULL){
        if(p->data != x){
            r->next = p;
            r = p;
            p = p->next;
        }else{
            q = p;
            p = p->next;
            free(q);
        }
    }
    r->next = NULL;
}
  • 设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值
// 递归输出后面的一个结点
void R_Print(Linklist L){
    if(L->next != NULL){
        R_Print(L->next);
    }
    print(L->data);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
王道408链表是指《王道计算机考研系列:数据结构(上)》中的一道考题,要求使用C语言实现链表的基本操作。链表是一种常用的数据结构,与数组相比,链表的大小可以动态变化,不需要预先指定大小。 链表的基本操作包括:初始化、插入元素、删除元素、遍历元素、搜索元素和销毁链表。 1. 初始化:初始化一个空链表,即创建一个头节点,并将头节点的指针域设置为空。 2. 插入元素:向链表中插入一个新的节点,可以在链表的任意位置插入。具体操作为:创建一个新的节点,将新节点的数据赋值给新节点的数据域,将新节点的指针域指向需要插入位置的下一个节点,将前一个节点的指针域指向新节点。 3. 删除元素:从链表中删除一个节点,可以根据节点的位置或者特定的值进行删除。具体操作为:找到该节点的前一个节点,将前一个节点的指针域指向该节点的下一个节点,释放该节点内存空间。 4. 遍历元素:从链表的头节点开始,通过遍历节点的指针域,依次输出链表中的所有元素,直到指针域为空。 5. 搜索元素:根据给定的值,在链表中搜索相应的节点。具体操作为:从头节点开始,通过遍历节点的数据域,逐个比较节点中的值,如果找到匹配的值,返回该节点的地址;如果遍历完链表仍未找到匹配的值,返回空。 6. 销毁链表:释放链表中所有节点的内存空间,以免内存泄漏。具体操作为:循环遍历链表,释放每一个节点的内存空间,同时将链表的头节点设置为空。 通过以上的基本操作,可以在C语言中实现对链表的增删改查等操作。但需要注意的是,具体的实现可能会根据题目的要求有所不同,例如可能需要处理链表中的特殊情况(如删除头节点)或者自定义其他操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值