赞
踩
此篇文章主要介绍存在头结点的情况下的头插法和尾插法。
头插法:优点:在不是空表的情况下,插入结点不需要从头到尾查找直到找到尾结点,效率较高
缺点:插入的顺序相反
尾插法:优点:插人的顺序相同
缺点:在不是空表的情况下,插人结点需要从头到尾查找直到找到尾结点,效率低
头插法是如何实现的呢
首先,我得先拥有一个空表头,并把头结点指向最后一个录入的结点
以下为简要代码:
- 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;
- }
尾插法是直接顺序插入结点,即向每个结点的后面插人结点
完整代码及解释:
- 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;
- }
以上就是头插法和尾插法的全部内容啦
如果有不对的地方请指出~笔者会及时改正~
多多担待啦~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。