标题:单链表删除结点后为什么原前驱结点和原后继结点间没有断链?
只看楼主
牧人马
Rank: 4
等 级:业余侠客
威 望:6
帖 子:49
专家分:229
注 册:2017-12-24
结帖率:33.33%
 问题点数:0 回复次数:1 
单链表删除结点后为什么原前驱结点和原后继结点间没有断链?
rt,附上代码。
题目是设计一个通过递归调用,实现删除不带头结点的单链表L中所有值为X的结点
假设输入1 2 3 1 4 5,删除“1”的结点,那么采用头插法生成的链表为5 4 1 3 2 1,首先要删除序号为3的“1”结点
我认为为此应该执行之前所学的4步操作:
(1)找到“1”的前驱结点“4”,赋值给结点s
(2)令结点p指向s的后继结点,也就是“1”
(3)令s指向p的后继结点,也就是“3”
(4)释放p的空间
可是题目答案的操作只有(1)(2)(4),并且在书上有专门解释是“有读者认为直接去掉p结点会造成断链,实际上因为L为引用,是直接对原链表进行操作,因此不会断链”
我并不能完全理解为什么不会发生断链,所以发帖询问
答案所示即为delectX函数内容,问题代码在delectX()中的注释部分
程序代码:
#include <iostream>
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode* next;
}LNode,*LinkList;

LinkList createList()
{
    int x;
    LinkList l = (LinkList)malloc(sizeof(LNode)); //head
    LNode* s;
    l->next = NULL;
    cin >> x;
    do
    {
        s = (LNode*)malloc(sizeof(LNode));
        s->data = x;
        s->next = l->next;
        l->next = s;
        cout << "add new data " << s->data << endl;
        cin >> x;
    } while (x > 0);
    return l;
}
void dis(LinkList l)
{
    l = l->next;
    while (l != NULL)
    {
        cout << l->data << " ";
        l = l->next;
    }
    cout << endl;
}
void delectX(LinkList &l, int x) //使用递归
{
    //cout << "delect" << endl;
    LNode* s;
    if (l == NULL) return;
    if (l->data == x) {
        s = l;
        l = l->next;  //5 4 1 3 2 1 ,删除第一个1后,4与3之间没有链接了应该会断链啊?
        free(s);
        delectX(l, x);
    }
    else
        delectX(l->next, x);
}
int main()
{
        LinkList l=createList();
        dis(l);
        delectX(l, 1);
        dis(l);
        return 0;
}


[此贴子已经被作者于2020-7-7 02:02编辑过]

搜索更多相关主题的帖子: 后继 next data 删除 结点 
2020-07-07 01:58
牧人马
Rank: 4
等 级:业余侠客
威 望:6
帖 子:49
专家分:229
注 册:2017-12-24
得分:0 
回复 楼主 牧人马
刚刚注册时只发帖不注意结帖,现在看着自己发红的结帖率后悔不已
2020-07-07 02:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502417-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.102337 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved