关于C语言动态链接表的问题。我是新手,以下是代码。

2025-06-27 12:41:39
推荐回答(2个)
回答1:

1、while(p1->num!=0)(这一段代码是否就是说如果输入的数是0的话就不执行这一段代码是吧。) //这句话很对。也就是你给p1->num赋值为0时,就结束循环了。
2、if(n==1)head=p1;
else p2->next=p1;(这一段代码是不是就是说如果n!=1的时候就执行这个代码,那N!=1的情况是什么情况,比如呢?) //“n!=1的时候就执行这个代码”也对。n=1的情况,就是head被开辟。然后就把head留着下面引用。接下来,就是对head后面的节点进行开辟了。n=1变相的说是,开辟第一节点。n!=1就是开辟第2.3.4.……节点。你看你哪里有个n=n+1;你就会懂的。
3、“还有就是p2->next=pl这个让我看了更模糊,P1与P2不是指向同一个地址吗,那么这个代码的意思是不是就是说把p1所存储的地址同时也是p2里存储的地址赋给p2->next,我搞不明白,既然要开辟第二个结点,应该把第二个结点的地址赋给p1里的next才对,也许我的理解有误,”这里你确实理解有问题。如果你对操作系统原理,进程,栈队,有了解的话,就很容易理解了。建议你去百度下栈队,链表的知识,口述是很麻烦的,最好友图像化。
反正简单的说,假设你要修一条路,有两个队,p1,p2,(struct student*p1,*p2;
)现在有p1先来开辟一块地(p1=(struct student*)malloc(LEN);),然后再有p2接管这块地(p2=p1;),p1再去开辟下一块地(p1=(struct student*)malloc(LEN);),p2就把他的桥指向p1(p2->next=p1;)。懂吧。下面就接着重复同样的操作。

回答2:

第一次进去while的时候n=1,第二次进去的时候n就先加1再if判断执行else。
动态链表关键就3个指针,head,p1,p2。head永远指向头节点地址不会变,p1 每次都会被重新开辟一个空间,p2总是指向链表最后一个地址,因此p2->next=p1是为了将新开辟的节点p1连接上去,然后p2=p1使p2指向最后一个节点(此时还未执行p1=(struct student*)malloc(LEN);因此二者指向同一空间)后面p1=(struct student*)malloc(LEN);又开辟一个新的节点空间(此时p1,p2便指向了不同的空间,p2是链表最后,p1是新开辟的)。如此循环,直到输入的p1->num==0跳出循环。希望对你有帮助 :)