单链表尾插入的若干疑问

来源:百度知道 编辑:UC知道 时间:2024/07/05 05:40:17
typedef struct node
{
char data;
struct node *next;
}SNode;
void CreateListR(SNode *&L,char a[],int n)
{
SNode *s,*r;
int i;
L=(SNode *)malloc(sizeof(SNode));
L->next=NULL;
[color=Red]r=L;[/color]
for(i=0;i<n;i++)
{
s=(SNode *)malloc(sizeof(SNode));
s->data=a[i];
r->next=s;
[color=Red]r=s;[/color]
}
r->next=NULL;
}
---------------------------------------------------------------------------------------
[color=Red]红色部分表示r被赋值了2次,请问,这两次地址,是后一次覆盖前一次的还是同时存在?
我这样认为的原因是,r没有被分配内存,如果分配内存,只能存放一个地址,对吗?[/color]

另外一个是r->next=s; 是把s的地址,赋值给r的next成员
紧接着下面的r=s;又是为什么? s的地址不是已经赋值给r了吗?

直接问问题嘛,让我来看好烦哟

首先,你的想法都是错的。

全部丢掉!!!

首先程序调用该函数时,L是空的指针,a是数组,存放将创建的链表的各个节点的值,n则是数组的个数,即最后链表的节点数。

L=(SNode *)malloc(sizeof(SNode));
L->next=NULL;

此时 生成初始链表 头指针 L

r=L; 指针r指向头指针。

接着一个for循环,将数组数据一个个的插入链表中。

详解for循环

for(i=0;i<n;i++)
{
s=(SNode *)malloc(sizeof(SNode)); 创建一个节点
s->data=a[i]; 给节点赋值
r->next=s; 将新建节点s插入到指针r所指的节点的后面, 不管什么时候,r总是最后一个节点,下面一句代码保证了这个
r=s; 将指针r指向s节点,既然s是新建的,自然是最后一个节点,所以此时要让r指向链表的最后一个节点,进入下次循环,r还是最后一个节点
}
总之,进入循环,先创建节点s,插入到链表的尾部,r再指向链表的尾部,为下一次循环做准备。

退出循环,
此时r指向最后一个节点,而且链表已经插入完毕,

r->next=NULL; 将r的next指针指向NULL,就是在最后插入一个空节点,完成链表的必要工作。

建议:

画图,跟着循环一步步画,一下子就清楚了。