【数据结构】单链表建立的头插法和尾插法

此篇文章主要介绍存在头结点的情况下的头插法和尾插法。

头插法与尾插法

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;  
}

 

以上就是头插法和尾插法的全部内容啦

如果有不对的地方请指出~笔者会及时改正~

多多担待啦~ 

  • 14
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值