此篇文章主要介绍存在头结点的情况下的头插法和尾插法。
头插法与尾插法
1.头插法与尾插法的优缺点
头插法:优点:在不是空表的情况下,插入结点不需要从头到尾查找直到找到尾结点,效率较高
缺点:插入的顺序相反
尾插法:优点:插人的顺序相同
缺点:在不是空表的情况下,插人结点需要从头到尾查找直到找到尾结点,效率低
2.头插法实现与演示
头插法是如何实现的呢
首先,我得先拥有一个空表头,并把头结点指向最后一个录入的结点
以下为简要代码:
typedef struct _node{
int value;
struct _node *next;
}Node;
Node *head;
head = (Node *)malloc(sizeof(Node));
Node *headnode;
headnode = (Node *)malloc(sizeof(Node));
head->next = headnode;
headnode->next = NULL; //以上为创建一个表头,一般为主函数创建,或单独创建函数调用
//头插简写
Node *C; //简略为主,这里就不对C进行赋值了,默认为C
C = (Node *)malloc(sizeof(Node));
C->next = headnode->next //这时C的next域将会变成空指针域,而下次插入B时由于
//(接上边)已经存在值,B的指针域就不会为空
headnode->next = C; //将头结点指向C
return head;
//注意:不能直接使用,后面会给整体源码
继续头插入一个结点:
以下为简要代码:
Node *B;
B = (Node *)malloc(sizeof(Node));
B->next = headnode->next
headnode->next = B;
return head;
//与插入C相似
插入A就不再进行展示,与插入B类似
完整代码:
#include<stdio.h>
typedef struct http{
int date;
struct http *next;
}Node;
Node *nodeadd(Node *head,Node *headnode)
{
Node *p;
p = (Node *)malloc(sizeof(Node));
printf("Input your value:\n");
scanf("%d",p->date);
p->next = headnode->next;
headnode->next = p;
return head;
}
int main(void)
{
Node *head;
head = (Node *)malloc(sizeof(Node));
Node *headnode;
headnode = (Node *)malloc(sizeof(Node));
head->next = headnode;
headnode->next = NULL;
head = nodeadd(head,headnode);
return 0;
}
3.尾插法的实现与演示
尾插法是直接顺序插入结点,即向每个结点的后面插人结点
完整代码及解释:
Node *nodeadd (Node *head,Node *headnode)
{
Node *p = NULL,*pr = headnode ;
//建立一个新节点,同时再建立一个*pr 方便我们后续操作
p = (Node *)malloc(sizeof(Node));
printf("Input your value:");
scanf("%d",&p->date);
//以上操作是判断新建的节点p是否有足够的内存被给予,若没有,则终止程序。
//(注意,此时我并不知道链表是否存在节点)
while (pr->next != NULL)
{
pr = pr->next;
}
pr->next = p;
//while语句的作用:当链表不是空链表时,我们得找到最后一个节点后,再将最后一个节点与新建节点链接起来
p->next = NULL; //将该节点作为新表尾
return head;
}
以上就是头插法和尾插法的全部内容啦
如果有不对的地方请指出~笔者会及时改正~
多多担待啦~