关于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 //定义结点结构体,单链表
{
int num;
float score;
struct stu *next;
} *h,*p1,*p2;

/*malloc动态分配一个节点空间A,返回该空间的指针给p1 */
p1=(struct stu *)malloc(sizeof(struct stu));
/*p1赋给h(通常意味头指针),可以理解为使用h表示空间A*/
h=p1;
/*malloc动态分配一个节点空间B,返回该空间的指针给p1*/
p1=(struct stu *)malloc(sizeof(struct stu));
/*h节点的next成员指向空间B,就把A-B链起来了,可以理解为使用p1表示空间B*/
h.next=p1;
/*p1赋给p2,此时用p2表示空间B了*/
p2=p1;
/*malloc动态分配一个节点空间C,返回该空间的指针给p1*/
p1=(struct stu *)malloc(sizeof(struct stu));
/*p2(空间B)的next指向空间p1,把B-C链起来*/
p2.next=p1;
/*又用p2表示空间C,此时链表的结构是A-B-C了。*/
p2=p1;
/*综上所述,这个程序建立了一个链表,h指向头结点,p2指向尾结点,每次新增结点时,都把新分配的结点空间赋给p1,再把p1链到p2上去*/追问

如果我在h=p1处加上p2=p1那么h.next=p1是否可以不要,而改为p2.next=p1呢

追答

是可以的,这里要清楚,指针只是用来存一个地址的,h=p1和p2=p1都是把新建的空间的地址进行赋值,但实际上,空间还是一个空间,就像你家只有一间房,只有一个门牌号,你把这个门牌号抄给多少人,都不会使你家的房子变多的,只不过这些人都能找到你家而已。所以当h和p2都指向同一个地址的时候,这两个做的是同一个操作

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-08
h p1 p2 分别为指向一整个结构体的指针,而next分别为各结构体的内部定义的指向另一个结构体的指针

h->next=p1 就是h结构体的成员next指向p1结构体,
p2->next=p1 如上述解析。
相似回答