༄༊࿆水下月ོྂཾ࿆࿐ 2023-07-22 19:40 采纳率: 98%
浏览 26
已结题

为什么删除结点要返回元素e的值呢

**单链表的结点删除并返回删除的值C语言数据结构
每一句基本上都有注释,如还有哪些细节不懂,欢迎下方评论

#include<stdio.h>
#include<stdlib.h> 

#define NULL 0
//创建单链表结构体 
typedef struct LNode{ 
    int data;                        //表示结点的数据域 
    struct LNode * next;            //表示结点的指针域 
}LNode,*LinkList;
//声明ADT 
LinkList InitList_L(LinkList &L);
void GreateList_L(LinkList &L,int n);
LinkList ListDelete_L(LinkList &L,int del,int &e);
void Display_L(LinkList &L,int n);
//主函数,对数据的操作都在这里 
int main(){
    LinkList L;
    int n,del; 
    int * e;
    //对数据进行初始化 
    InitList_L(L);
    printf("请输入链表的长度:");
    scanf("%d",&n);
    //使用头插法创建链表 
    GreateList_L(L,n);
    printf("\n创建的");
    //将创建的链表打印出来 
    Display_L(L,n);
    printf("\n请输入要删除第几个节点:");
    scanf("%d",&del);
    //对链表中的某个结点进行删除 
    L = ListDelete_L(L,del,*e); 
    printf("\n删除结点的值为:%d",*e);
    printf("\n删除后的");
    Display_L(L,n);
    return 0;
    
} 
//链表的初始化,使链表变为只有头结点的链表 
LinkList InitList_L(LinkList &L){
    L=(LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    return L;
}
//创建链表 
void GreateList_L(LinkList &L,int n){
    //这里采用头插法,使用倒序输入 
    LinkList p;
    int i;
    //有的书上这里是对链表L进行头结点的分配内存
    //因为这个代码已经有初始化函数了,这里就不用再给头结点进行操作了
    //此时的链表中已经包含了头结点 
    for(i=n;i>0;--i){
        //为新节点分配内存 
        p = (LinkList)malloc(sizeof(LNode));
        printf("\n请输入链表的值:");
        scanf("%d",&p->data);
        //将头结点的下一个结点的地址赋值给要插入结点的指针域中
        //使得新结点位于链表的最前,头结点的后面 
        p->next = L->next;
        //将新插入的结点地址赋值给头结点的指针域,使得头结点和新结点进行连接 
        L->next = p; 
    }
}
//删除结点,并返回删除结点的数据 
LinkList ListDelete_L(LinkList &L,int del,int &e){
    LinkList p,q;
    p = L;
    //计数 
    int j = 0;
    //进入循环的条件为,链表不为空,且计数器要小于要删除结点的位置 
    while(p->next  && j<del-1){
        //p指针每次循环向后移动一位 
        p = p->next;
        //计数+1 
        j++;
    }
    //如果链表为空或者计数器大于要删除结点的位置,则返回该链表 
    if(!(p->next) || j>del+1){
        return L;
    }
    //使用一个空闲指针,将要删除结点的地址赋值给它 
    q = p->next;
    //再将要删除结点的下一个结点的地址赋值给要删除结点的前一个结点的指针域 
    p->next = q->next;
    //并将要删除结点的数据域赋值给该数据域指针类型,用于返回数据 
    e = q->data;
    //释放空闲指针 
    free(q);
    return L;
} 
//打印单链表 
void Display_L(LinkList &L,int n){
    LinkList p;
    int i;
    //首先将指针指向首元结点 
    p = L->next;
    printf("单链表为:");
    for(i=0;i<n;i++){
        printf("%d ",p->data);
        p = p->next;
        //每打印一个结点,指针向后移动一位 
    }
}

为什么删除结点时要保存或返回元素e的值呢?意义在哪里?我觉得只要delede元素后就已经完成删除了,为什么会出现这一步骤呢?
版权声明:本文为CSDN博主「ylffly21」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44208167/article/details/123057193

  • 写回答

2条回答 默认 最新

  • 喝茶品入生 2023-07-22 20:13
    关注

    这个删除时是否返回数据看你的设计思路,没有硬性规定必须要返回元素值,你可以返回1表示删除成功,0表示失败甚至不返回值也行。将返回值返回给调用函数,可以更好的了解程序运行状况,避免误删除

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月23日
  • 已采纳回答 7月22日
  • 创建了问题 7月22日

悬赏问题

  • ¥15 soildworks装配体的尺寸问题
  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑