• 在带头结点的单链表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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    完整代码实现

    此段代码实现创建单链表和输出,可视化删除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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
  • 相关阅读:
    JS闭包的应用场景
    PyTorch安装步骤
    彩色相机工作原理——bayer格式理解
    git学习
    协作乐高 All In One:DAO工具大全
    自主研发的流程引擎怎么样?好用吗?
    待办事项是什么意思,怎么用?
    Java新特性中的Preview功能如何运行和调试
    HTML(超文本标记语言)
    Python集合详细教程
  • 原文地址:https://blog.csdn.net/jifengm/article/details/125509675