尾插法建链表建表问题 r->next=s;//将新结点插到*r之后 r=s;//尾指针指向新表尾 这两句看不懂高手解释下
LinkListCreatListR(void){//返回单链表的头指针charch;LinkListhead;//头指针ListNode*s,*r;//工作指针head...
LinkList CreatListR(void)
{//返回单链表的头指针
char ch;
LinkList head;//头指针
ListNode *s,*r; //工作指针
head=NULL; //链表开始为空
r=NULL;//尾指针初值为空
ch=getchar(); //读入第1个字符
while(ch!='\n'){
s=(ListNode *)malloc(sizeof(ListNode));//生成新结点
s->data=ch; //将读入的数据放入新结点的数据域中
if (head!=NULL)
head=s;//新结点插入空表
else
r->next=s;//将新结点插到*r之后
r=s;//尾指针指向新表尾
ch=getchar(); //读入下一字符
}//endwhile
if (r!=NULL)
r->next=NULL;//对于非空表,将尾结点指针域置空head=s;
return head;
}
整个算法我都发上来了,麻烦高手给解答一下,为什么用r->next=s; r=s; 这2个语句,虽然后面有"//"解释,还是看不明白.r是之前定义的一个指针,然后就没再用了,这里又怎么突然就出来了,疑惑!这2个语句怎么就能在头指针不为空的情况下,现实插入呢? 展开
{//返回单链表的头指针
char ch;
LinkList head;//头指针
ListNode *s,*r; //工作指针
head=NULL; //链表开始为空
r=NULL;//尾指针初值为空
ch=getchar(); //读入第1个字符
while(ch!='\n'){
s=(ListNode *)malloc(sizeof(ListNode));//生成新结点
s->data=ch; //将读入的数据放入新结点的数据域中
if (head!=NULL)
head=s;//新结点插入空表
else
r->next=s;//将新结点插到*r之后
r=s;//尾指针指向新表尾
ch=getchar(); //读入下一字符
}//endwhile
if (r!=NULL)
r->next=NULL;//对于非空表,将尾结点指针域置空head=s;
return head;
}
整个算法我都发上来了,麻烦高手给解答一下,为什么用r->next=s; r=s; 这2个语句,虽然后面有"//"解释,还是看不明白.r是之前定义的一个指针,然后就没再用了,这里又怎么突然就出来了,疑惑!这2个语句怎么就能在头指针不为空的情况下,现实插入呢? 展开
1个回答
推荐于2017-11-24
展开全部
本来 r 为 尾指针
要在末尾插入一个新结点, 就需要
r->next=s; //将新结点插到*r之后, 原来的尾结点r的next 记录新结点的地址
r=s; //新结点变成当前的表尾
r是之前定义的一个指针,并不是就没再用了, 而是一开始链表中没有结点的时候,r = NULL.
当链表中有了结点以后, 就用到 r 了
要在末尾插入一个新结点, 就需要
r->next=s; //将新结点插到*r之后, 原来的尾结点r的next 记录新结点的地址
r=s; //新结点变成当前的表尾
r是之前定义的一个指针,并不是就没再用了, 而是一开始链表中没有结点的时候,r = NULL.
当链表中有了结点以后, 就用到 r 了
追问
ListNode *s,*r, 这个定义为什么r就变成了尾指针了?把r换成任意其他字母是不是都表示尾指针?
"r->next=s; //将新结点插到*r之后, 原来的尾结点r的next 记录新结点的地址
r=s; //新结点变成当前的表尾" 将新结点插到r之后,那r不就不是尾指针了?s才是尾指针,还是不理解!"r->next=s"这个语句可以理解成用r的next记录s,这个r=s语句把s赋给了r,那不变成了s的next记录s了吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询