|
上一页 下一页
(2) 尾插法建表
① 算法思路
从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表尾上,直到读入结束标志为止。
具体方法【参见动画演示】
注意:
⒈采用尾插法建表,生成的链表中结点的次序和输入顺序一致
⒉必须增加一个尾指针r,使其始终指向当前链表的尾结点
② 具体算法实现
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;
}
注意:
⒈开始结点插入的特殊处理
由于开始结点的位置是存放在头指针(指针变量)中,而其余结点的位置是在其前趋结点的指针域中,插入开始结点时要将头指针指向开始结点。
⒉空表和非空表的不同处理
若读入的第一个字符就是结束标志符,则链表head是空表,尾指针r亦为空,结点*r不存在;否则链表head非空,最后一个尾结点*r是终端结点,应将其指针域置空。
上一页
下一页
|