单链表——带头结点和不带头结点的头插法和尾插法(图解)

头插法

带头节点的

  • 图解(动图)
    请添加图片描述

  • 代码

    LinkList HeadInster(LinkList &L,int n){
        LNode *s;
        int x=1;
        L= (LinkList)malloc(sizeof(LNode));     //创建头结点
        L->next=NULL;                                //初始为空链表
        while(x!=n){
            s=(LNode*) malloc(sizeof(LNode));   //创建新结点
            s->data=x;
            s->next=L->next;
            L->next=s;
            x++;
        }
        return L;
    }
    

    注意:下面两句一定不要更换顺序

    s->next=L->next;
    L->next=s;
    

    如果更换结果如图,所以不要换不要换
    请添加图片描述

  1. 运行结果
    在这里插入图片描述

不带头结点

  1. 图解
    请添加图片描述

  2. 代码

    LinkList Headinster(LinkList &L,int n){
        LNode *s;
        int x=1;
        L= (LinkList)malloc(sizeof(LNode));
        L->data=x++;
        L->next=NULL;
        while(x!=n){
            s=(LNode*) malloc(sizeof(LNode));
            s->data=x;
            s->next=L;
            L=s;
            x++;
        }
        return L;
    }
    
  3. 运行结果
    在这里插入图片描述

尾插法

头插法虽然很简单,但是头插法顺序是反的,所以我们用尾插法生成一样的顺序

带头节点

  1. 图解
    请添加图片描述

  2. 代码

    LinkList TailInster(LinkList &L,int n){
        int x=1;
        L= (LinkList)malloc(sizeof(LNode));
        LNode *s,*r=L;
        while(x!=n){
            s=(LNode*) malloc(sizeof(LNode));
            s->data=x;
            r->next=s;
            r=s;
            x++;
        }
        r->next=NULL;
        return L;
    }
    
  3. 运行结果
    在这里插入图片描述

不带头结点

  1. 图解(略)可以参考一下上面的图解

  2. 代码

    LinkList Tailinster(LinkList &L,int n){
        int x=1;
        L= (LinkList)malloc(sizeof(LNode));
        L->data=x++;
        LNode *s,*r=L;
        while(x!=n){
            s=(LNode*) malloc(sizeof(LNode));
            s->data=x;
            r->next=s;
            r=s;
            x++;
        }
        r->next=NULL;
        return L;
    }
    
  3. 运行结果
    在这里插入图片描述

完整代码

#include "stdio.h"
#include "stdlib.h"

typedef int ElemType;
typedef struct LNode{
   ElemType data;           //数据域
   struct LNode *next;      //指针域
}LNode,*LinkList;

/*
 * 头插法 设有头结点
 */
LinkList HeadInster(LinkList &L,int n){
    LNode *s;
    int x=1;
    L= (LinkList)malloc(sizeof(LNode));     //创建头结点
    L->next=NULL;                                //初始为空链表
    while(x!=n){
        s=(LNode*) malloc(sizeof(LNode));   //创建新结点
        s->data=x;
        s->next=L->next;
        L->next=s;
        x++;
    }
    return L;
}

/*
 * 头插法 没有头结点
 */
LinkList Headinster(LinkList &L,int n){
    LNode *s;
    int x=1;
    L= (LinkList)malloc(sizeof(LNode));
    L->data=x++;
    L->next=NULL;
    while(x!=n){
        s=(LNode*) malloc(sizeof(LNode));
        s->data=x;
        s->next=L;
        L=s;
        x++;
    }
    return L;
}

/*
 * 尾插法、有结点
 */
LinkList TailInster(LinkList &L,int n){
    int x=1;
    L= (LinkList)malloc(sizeof(LNode));
    LNode *s,*r=L;
    while(x!=n){
        s=(LNode*) malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        x++;
    }
    r->next=NULL;
    return L;
}
/*
 * 尾插法、有结点
 */
LinkList Tailinster(LinkList &L,int n){
    int x=1;
    L= (LinkList)malloc(sizeof(LNode));
    L->data=x++;
    LNode *s,*r=L;
    while(x!=n){
        s=(LNode*) malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        x++;
    }
    r->next=NULL;
    return L;
}


/*
 * 便利链表、头结点
 */
void PrintList(LinkList L){
    LNode *s;
    s=L->next;
    while (s!=NULL) {
        printf("%d\t",s->data);
        s=s->next;
    }
}

/*
 * 便利链表
 */
void Print(LinkList L){
    LNode *s;
    s=L;
    while (s!=NULL) {
        printf("%d\t",s->data);
        s=s->next;
    }
}

int main(){
    LinkList L,S,P,Q;
    printf("有头结点的头插法:");
    HeadInster(L,10);
    PrintList(L);

    printf("\n无头结点的头插法:");
    Headinster(P,10);
    Print(P);
    
    printf("\n有头结点的尾插法:");
    Tailinster(S,10);
    Print(S);

    printf("\n无头结点的尾插法:");
    Tailinster(Q,10);
    Print(Q);

}

运行结果图

在这里插入图片描述

  • 10
    点赞
  • 44
    收藏
  • 打赏
    打赏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:像素格子 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

仔仔木

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值