标题:p2->next指向p1,p2又指向p1(p2和p1不是在一起吗),然后p1又指向一个新开 ...
只看楼主
新手714
Rank: 1
等 级:新手上路
帖 子:50
专家分:3
注 册:2020-4-25
结帖率:88.89%
已结贴  问题点数:20 回复次数:6 
p2->next指向p1,p2又指向p1(p2和p1不是在一起吗),然后p1又指向一个新开辟的空间,这样p2跟过来了?,输入数据后,
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{    long num;
    float score;
    struct Student*next;
};
int n;     //n为全局变量,本文件模块中各函数均可使用它
struct Student *creat(void)
//定义函数。此函数返回一个指向链表头的指针
{    struct Student *head;
    struct Student *p1,*p2;
    n=0;
    p1=p2=(struct Student*) malloc(LEN);  //开辟一个新单元
    scanf("%ld,%f",&p1->num,&p1->score);
    //输入第1个学生的学号和成绩
    head=NULL;
    while(p1->num!=0)
    {    n=n+1;
        if(n==1) head=p1;
        else p2->next=p1;                                //p2->next指向p1,p2又指向p1(p2和p1不是在一起吗),然后p1又指向一个新开辟的空间,这样p2跟过来了?,输入数据后,
        p2=p1;                                      新空间的next是NULL,返回值是NULL???这样是怎么输出第一个的data吗?怎么这么糊呢?理解过程哪里不对吗???///
        p1=(struct Student*)malloc(LEN);
        //开辟动态存储区,把起始地址赋给p1
        scanf("%ld,%f",&p1->num,&p1->score);
        //输入其他学生的学号和成绩
    }
    p2->next=NULL;
    return(head);
}
int main()
{    struct Student *pt;
    pt=creat();     //函数返回链表第一个结点的地址
    printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);
    //输出第1个结点的成员值
    return 0;
};
搜索更多相关主题的帖子: Student 指向 输入 next struct 
2020-05-23 16:58
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:7 
A:n等于0时,   head和p1及p2都指向首节点,然后p1指向新申请的空间
B:n等于1时 由A知p1已经指向新空间地址,将链表当前尾结点p2追加一个结点p1,然后再将p2指向链表追加后的尾结点p1,p1指向新申请空间地址
n>1时  循环B直到满足退出条件
注意:p1可能需要单独free
2020-05-23 17:22
新手714
Rank: 1
等 级:新手上路
帖 子:50
专家分:3
注 册:2020-4-25
得分:0 
回复 2楼 fulltimelink
head怎么也指向首节点,不是只有p1p2吗,然后不是p1p2都指向了新空间吗,然后在else的情况下,p2的尾结点不也是p1的么,而且不是p2尾结点指向了p1么,为什么还要把p1的地址赋给p2???
2020-05-23 18:47
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:0 
回复 3楼 新手714
玩过贪吃蛇吧,head就是"蛇头"   p2就是蛇尾   p1就是"食物"
2020-05-23 19:03
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:7 
p2、p1都是临时变量,其作用是设置malloc申请的空间中指针元素next的指向值,让所有malloc到的空间链接起来。
在楼主的creat函数中,p1总是指向新开辟的空间,而p2指向的是先前开辟的空间,当p2->next=p1后,就把先前空间和新开辟的空间链接起来了,p2就完成了使命,在让p2=p1,是好让p1空闲出来,让p1指向新空间。
就这么简单,如果实在难理解,楼主可以先用一个数据结构形式的数组来模拟链表操作试试(楼主可以试着把下题做出来)。
struct Student
{
    int num;   //数据
    int sub;   //下标
};
void main()
{
    struct Student a[10]={45,-1,12,-1,23,-1,9,-1,11,-1,67,-1,22,-1,83,-1,4,-1,52,-1};
    //......添加代码,在不实际移动数组a数据的情况下,按a[n].num的大小从小到大排序出来(用类似链表方式)
}

[此贴子已经被作者于2020-5-23 20:26编辑过]


能编个毛线衣吗?
2020-05-23 20:23
新手714
Rank: 1
等 级:新手上路
帖 子:50
专家分:3
注 册:2020-4-25
得分:0 
回复 5楼 wmf2014
刚又看了一遍问题感觉自己没用脑子思考可能用的是眼睛吧,,,不过还是有点难的。假如用这些代码形成链表,再添加一个输出的函数,用p=p->next时next确定是包含了下一节点的地址吗?因为p1p2一直在变 就是p1p2在换结点,指向了下一结点后,地址是怎么存在next里,难道它保留了?什么原理呢?
2020-05-23 23:16
JabinZ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:34
专家分:180
注 册:2020-5-7
得分:7 
2020-05-24 18:03



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




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

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