作业帮 > 综合 > 作业

关于c语言链表的一个问题h->next=p1,p2->next=p1是什么意思,又有什么作用

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/16 05:47:18
关于c语言链表的一个问题h->next=p1,p2->next=p1是什么意思,又有什么作用
struct stu { int num; float score; struct stu *next; } *h,*p1,*p2; p1=(struct stu *)malloc(sizeof(struct stu)); h=p1; p1=(struct stu *)malloc(sizeof(struct stu)); h.next=p1; p2=p1; p1=(struct stu *)malloc(sizeof(struct stu)); p2.next=p1; p2=p1;
如果我在h=p1处加上p2=p1那么h.next=p1是否可以不要,而改为p2.next=p1呢
struct stu //定义结点结构体,单链表
\x09{
\x09\x09int num;
\x09\x09float score;
\x09\x09struct stu *next;
\x09} *h,*p1,*p2;
\x09\x09/*malloc动态分配一个节点空间A,返回该空间的指针给p1 */
\x09p1=(struct stu *)malloc(sizeof(struct stu));
\x09\x09/*p1赋给h(通常意味头指针),可以理解为使用h表示空间A*/
\x09h=p1;
\x09\x09/*malloc动态分配一个节点空间B,返回该空间的指针给p1*/
\x09p1=(struct stu *)malloc(sizeof(struct stu));
\x09\x09/*h节点的next成员指向空间B,就把A-B链起来了,可以理解为使用p1表示空间B*/
\x09h.next=p1;
\x09\x09/*p1赋给p2,此时用p2表示空间B了*/
\x09p2=p1;
\x09\x09/*malloc动态分配一个节点空间C,返回该空间的指针给p1*/
\x09p1=(struct stu *)malloc(sizeof(struct stu));
\x09\x09/*p2(空间B)的next指向空间p1,把B-C链起来*/
\x09p2.next=p1;
\x09\x09/*又用p2表示空间C,此时链表的结构是A-B-C了.*/
\x09p2=p1;
\x09\x09/*综上所述,这个程序建立了一个链表,h指向头结点,p2指向尾结点,每次新增结点时,都把新分配的结点空间赋给p1,再把p1链到p2上去*/
再问: 如果我在h=p1处加上p2=p1那么h.next=p1是否可以不要,而改为p2.next=p1呢
再答: 是可以的,这里要清楚,指针只是用来存一个地址的,h=p1和p2=p1都是把新建的空间的地址进行赋值,但实际上,空间还是一个空间,就像你家只有一间房,只有一个门牌号,你把这个门牌号抄给多少人,都不会使你家的房子变多的,只不过这些人都能找到你家而已。所以当h和p2都指向同一个地址的时候,这两个做的是同一个操作