怎样用尾插法建立链表?

怎样用尾插法建立链表?,第1张

每次将待插入的结点链在单链表的最后一个结点的后面

void creatlist(LinkList *LDatatype a[10])

{ L = (LinkList *) malloc (sizeof(struct node))

L->next = NULL                  //生成头结点    

r = L                           //r为指向表尾的指针

for(i = 0i<=9i++)

{ p = (LinkList *) malloc (sizeof(struct node))

p->data = a[i]         //生成新的结点

p->next = NULL

r->next = p            //将新生成的结点插在表尾

r = p                  //将表尾指针指向新插入的结点

}

}

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

什么是尾插法?

解析:

从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表尾上,直到读入结束标志为止。

具体算法实现

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是终端结点,应将其指针域置空。

(3) 尾插法建带头结点的单链表

①头结点及作用

头结点是在链表的开始结点之前附加一个结点。它具有两个优点:

⒈由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的 *** 作就和在表的其它位置上 *** 作一致,无须进行特殊处理

⒉无论链表是否为空,其头指针都是指向头结点的非空指针(空表中头结点的指针域空),因此空表和非空表的处理也就统一了。

②带头结点的单链表

注意:

头结点数据域的阴影表示该部分不存储信息。在有的应用中可用于存放表长等附加信息。

③尾插法建带头结点链表算法

LinkList CreatListR1(void)

{用尾插法建立带头结点的单链表

char ch

LinkList head=(ListNode *)malloc(sizeof(ListNode))生成头结点

ListNode *s,*r工作指针

r=head尾指针初值也指向头结点

while((ch=getchar())!='\n'){

s=(ListNode *)malloc(sizeof(ListNode))生成新结点

s->data=ch将读入的数据放入新结点的数据域中

r->next=s

r=s

}

r->next=NULL终端结点的指针域置空,或空表的头结点指针域置空

return head

}

注意:

上述算法里,动态申请新结点空间时未加错误处理,这对申请空间极少的程序而言不会出问题。但在实用程序里,尤其是对空间需求较大的程序,凡是涉及动态申请空间,一定要加入错误处理以防系统无空间可供分配。

把S结点插入到链表末尾,结果应该是这样的

所要做的工作就是,把F值所在的结点的next指向s结点,并且把s结点的next指向NULL

所以,有以下方法:

1>对应B选项

   把s结点的next指向null即:s->next = '\0'

   把p指针指向F所在的结点,也就是p结点的next指针所指向的结点:p = p->next

   把F所在的结点的next指向s结点;

2>对应C选项

   p指针指向F所在的结点:p = p->next

   s结点的next指针指向p->next,也就是NULL:s->next = p->next

   把F所在的结点的next指向s结点;

3>对应选项D

   这个选项其实和C选项采用的方法是一样的,只不过取值的方式不一样,C选项用指针取值的,而D选项首先把指针的所指向的地址给拿出来,在对其取值,相当于普通变量。所以C选项用的是'->'而D选项用的是'.'


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11644635.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存