菜鸟求大解答一下

qq_35812170 2017-01-14 11:39:10
#include<stdio.h>
#include<stdlib.h>

struct Student
{
char cName[20]; /*姓名*/
int iNumber; /*学号*/
struct Student* pNext; /*指向下一个结点的指针*/
};

int iCount; /*全局变量表示链表长度*/

struct Student* Create()
{
struct Student* pHead=NULL; /*初始化链表头指针为空*/
struct Student* pEnd,*pNew;
iCount=0; /*初始化链表长度*/
pEnd=pNew=(struct Student*)malloc(sizeof(struct Student));
printf("please first enter Name ,then Number\n");
scanf("%s",&pNew->cName);
scanf("%d",&pNew->iNumber);
while(pNew->iNumber!=0)
{
iCount++;
if(iCount==1)
{
pNew->pNext=pHead; /*使得指向为空*/
pEnd=pNew; /*跟踪新加入的结点*/
pHead=pNew; /*头指针指向首结点*/
}
else
{
pNew->pNext=NULL; /*新结点的指针为空*/
pEnd->pNext=pNew; /*原来的为节点指向新结点*/
pEnd=pNew; /*pEnd指向新结点*/
}
这段代码看的我头晕眼花,希望大神帮忙解释一下
pNew=(struct Student*)malloc(sizeof(struct Student)); /*再次分配结点内存空间*/
scanf("%s",&pNew->cName);
scanf("%d",&pNew->iNumber);
}
free(pNew); /*释放没有用到的空间*/
return pHead;
}

void Print(struct Student* pHead)
{
struct Student *pTemp; /*循环所用的临时指针*/ 这是怎么循环的???
int iIndex=1; /*表示链表中结点的序号*/

printf("----the List has %d members:----\n",iCount); /*消息提示*/
printf("\n"); /*换行*/
pTemp=pHead; /*指针得到首结点的地址*/

while(pTemp!=NULL)
{
printf("the NO%d member is:\n",iIndex);
printf("the name is: %s\n",pTemp->cName); /*输出姓名*/
printf("the number is: %d\n",pTemp->iNumber); /*输出学号*/
printf("\n"); /*输出换行*/
pTemp=pTemp->pNext; /*移动临时指针到下一个结点*/
iIndex++; /*进行自加运算*/
}
}


int main()
{
struct Student* pHead; /*定义头结点*/
pHead=Create(); /*创建结点*/
Print(pHead); /*输出链表*/
return 0; /*程序结束*/
}
...全文
154 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35812170 2017-01-16
  • 打赏
  • 举报
回复
多谢了,要的就是这样的东西。
小灸舞 版主 2017-01-16
  • 打赏
  • 举报
回复
1.pNew->pNext=NULL; //这一行你的理解是对的,将新结点的pNext指针指向空
2.pEnd->pNext=pNew; //这一行你的理解好像就不对了,并不是将pNew的值给了pEnd,而是将pEnd(指向最后一个结点)的pNext指向指向了新结点(实现了新节点的插入操作)
3.pEnd=pNew; //这行理解也不对,并不是pNew(空)给了pEnd,此时的pNew并不为空,它是刚刚malloc出来的啊
意思是:pEnd指向pNew(pEnd始终保持指向最后一个结点)
qq_35812170 2017-01-16
  • 打赏
  • 举报
回复
else语句,第一行pNew一开始指向空,第二行将pNew的值给了pEnd,第三行怎么又将pNew(空)给了pEnd呢?大神我是纯属自学,下学期才开课了。基础不好请见谅
自信男孩 2017-01-16
  • 打赏
  • 举报
回复
因为开始时,链表为空,当iCount为1时,就是创建第一个节点时,即头节点。后面创建的节点直接放在头节点之后。
小灸舞 版主 2017-01-16
  • 打赏
  • 举报
回复
iCount为1的时候,也就是这是你第一个插入的结点:
pNew->pNext=pHead; /*使得指向为空*/
pEnd=pNew; /*跟踪新加入的结点*/
pHead=pNew; /*头指针指向首结点*/
感觉注释讲的很清楚了啊?

else分支:
pNew->pNext=NULL; /*新结点的pNext指针为空*/
pEnd->pNext=pNew; /*原来的最后一个结点的pNext指向新结点,也就连上了新的结点到链表上了*/
pEnd=pNew; /*pEnd指向新结点(最后一个结点)*/
幻夢之葉 2017-01-15
  • 打赏
  • 举报
回复
1: 如果链表没有节点 把新的节点赋值给头结点 否则 把新节点追加到尾节点的下一个节点 2: 链表结构简化为下面 Head-->1-->2-->3-->......-->NULL 一直找下去直到NULL为止

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧