当前位置:首页 > 生活笔记 > 正文

尾插法程序 什么是尾插法

今天给各位分享尾插法程序的知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

  1. 什么是尾插法
  2. 线性表的尾插法用C语言表示
  3. 依次采用尾插法插入A,B,C,D,E元素。 用C语言实现
  4. c语言线性表的实现中的头插法和尾插法

什么是尾插法

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

具体算法实现

LinkListCreatListR(void)

{//返回单链表的头指针

charch;

LinkListhead;//头指针

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;

returnhead;

}

注意:

⒈开始结点插入的特殊处理

由于开始结点的位置是存放在头指针(指针变量)中,而其余结点的位置是在其前趋结点的指针域中,插入开始结点时要将头指针指向开始结点。

⒉空表和非空表的不同处理

若读入的第一个字符就是结束标志符,则链表head是空表,尾指针r亦为空,结点*r不存在;否则链表head非空,最后一个尾结点*r是终端结点,应将其指针域置空。

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

①头结点及作用

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

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

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

②带头结点的单链表

注意:

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

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

LinkListCreatListR1(void)

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

charch;

LinkListhead=(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;//终端结点的指针域置空,或空表的头结点指针域置空

returnhead;

}

注意:

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

线性表的尾插法用C语言表示

p=L;

while(p->next!=NULL)

{

p=p->next;

}

q->next=p->next;

p->next=q;

主要部分就是这些,其他的定义就可以参照数据结构上的定义来写。

自己动手写写哦,你可以的!~

依次采用尾插法插入A,B,C,D,E元素。 用C语言实现

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#defineok1

#defineerror0

#defineTRUE1

#defineFALSE0

#defineprint1

typedefcharElemType;

typedefstructLNode

{

ElemTypedata;

structLNode*next;

}LNode;

/*建立一个空链表*/

LNode*CreateLinkList(void)

{

LNode*head;

head=(LNode*)malloc(sizeof(ElemType));

head->next=NULL;

head->data=0;

#ifprint

printf("建立一个空链表,其头结点的指针为:%d\r\n",head);

#endif

returnhead;

}

/*在链表中插入数据e*/

voidInsertList(LNode*L,ElemTypee,intmark)

{

LNode*q;

LNode*p=L;

q=(LNode*)malloc(sizeof(LNode));

q->data=e;

if(mark)//在表尾插入数据

{

while(p->next)p=p->next;

q->next=NULL;

p->next=q;

}

else//在表头插入数据

{

q->next=p->next;

p->next=q;

}

L->data++;

#ifprint

printf("插入数据成功\r\n");

#endif

}

/*单链表遍历,同时将所有结点值打印输出*/

voidPrintList(LNode*L)

{

inti=0;

LNode*p=L;

while(p=p->next)

{

i++;

printf("%d\t",p->data);

if(!i%10)printf("\r\n");

}

printf("\r\n");

}

voidmain()

{

LNode*L;

L=CreateLinkList();

InsertList(L,'A',1);

InsertList(L,'B',1);

InsertList(L,'C',1);

InsertList(L,'D',1);

InsertList(L,'E',1);

PrintList(L);

}

c语言线性表的实现中的头插法和尾插法

头插法建表:算法:

p=(ListNode*)malloc(sizeof(ListNode));//生成新结点

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

p->next=head;

head=p;

尾插法建表:算法

p=(ListNode*)malloc(sizeof(ListNode));//生成新结点

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

if(head==NULL)

head=p;//新结点插入空表

else

rear->next=p;//将新结点插到*r之后

rear=p;//尾指针指向新表尾

时间复杂度都是O(n)

文章分享结束,尾插法程序的答案你都知道了吗?欢迎再次光临本站哦!

最新文章