吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1330|回复: 5
收起左侧

[讨论] C链表在返回值上的困惑

[复制链接]
ing 发表于 2019-12-28 14:27
本帖最后由 ing 于 2019-12-29 11:22 编辑

我不理解为什么最后返回 p(原链表) 的值会是{0,1,2,3,4,5}而不是{0,1,2,3,4}----原链表 p {0,1,2,3,4}
捕获4.PNG

在for循环结束后,临时指针 temp 只剩下了{4},代码 temp->next = e 运行完后,则为{4,5}
捕获3.PNG
上图可以看到,原链表 p 已经多了个“5”了,可我一直操作的是 临时指针temp,
这个值是怎么加上去的?为什么不是{4,5}而是{0,1,2,3,4,5}


完整代码
#include <stdio.h>
#include <stdlib.h>

typedef struct Link
{
    int elem;
    //代表指针域,指向后继元素
    struct Link * next;
}link;

link * initLink();
//链表插入的函数,p是链表,elem是插入的结点的数据域,add是插入的位置
link * insertElem(link * p,int elem,int add);
void display(link *p);

int main()
{
    //初始化链表(1,2,3,4)
    printf("初始化链表为:\n");
    link *p=initLink();
    display(p);

    printf("在第6的位置插入元素5:\n");
    p = insertElem(p,5,6);
    display(p);
}

link *initLink()
{
    //头节点创建
    link * p = (link*)malloc(sizeof(link));
    //声明一个指针指向头节点
    link * temp = p;
    //生成链表
    for (int i = 0; i < 5; ++i)
    {
        //节点 a 创建
        link * a = (link *)malloc(sizeof(link));
        a->elem = i;
        a->next = NULL;
        /* 头指针指向当前深度的结点,再让当前深度的结点作为头结点 */
        //↓↓↓↓↓↓↓↓
        p->next = a;    //每执行一次结点深度+1
        p = p->next;
        //↑↑↑↑↑↑↑↑
    }
    //返回指针
    return temp;
}

//p为原链表,elem表示新数据元素,add表示新元素要插入的位置
link * insertElem(link *p,int elem, int add)
{
    //创建临时节点
    link * temp = p;
    //找到要插入位置上的结点
    for (int i = 1; i < add; ++i) {
        //判断用户输入的插入位置是否有效
        if (temp==NULL)
        {
            printf("插入的位置无效");
            return p;
        }
        //达到指定位置(结点深度),每执行一次都会只剩下当前位置和后继元素
        //例如{0,1,2,3,4}执行一次后变成{1,2,3,4}
        temp = temp->next;
        //{{0,1,2,3,4}} = {1,2,3,4}
    }
    link * e = (link *)malloc(sizeof(link));
    e->elem = elem;
    //向链表中插入结点
    e->next = temp->next;   
    temp->next = e;
    return p;
}

void display(link *p){
    link* temp=p;
    while (temp->next) {
        temp=temp->next;
        printf("%d",temp->elem);
    }
    printf("\n");
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ing 发表于 2019-12-29 08:56
最后一个问题自己解决了
捕获.PNG
理解有不对的话还请指出
moranyuyan 发表于 2019-12-28 14:53
518 发表于 2019-12-28 16:44
深夜雪 发表于 2019-12-28 16:55
指针是指向地址的,你对指针的操作就是对地址里数据的操作,不管你用多少个指针变量,只要指向的是同一个地址,那么所有的操作都会改变地址里的数据。
就如同 爸爸、父亲和爹,都是同一个人。
菜菜同学 发表于 2019-12-28 17:34
初始链表为{0,1,2,3,4} 你这句  p = insertElem(p,5,6); 执行以后, 成了{ 0,1,2,3,4,5} ,你这个地址赋值,p的地址不就指向了临时链表temp了吗 - -+。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表