尾插法建立链表详解

尾插法,顾名思义,就是把新加入的节点插入到上一个节点的尾部(头插法是把新加入的节点插入到上一个节点的头部),next存储下一个节点位置的地址,开始时,初始化定义头节点

head -> next = NULL;

表示头节点的下一个节点为空,就是该链表只有一个头节点,图形化表示为

由于头插法要把每一个新加入的节点插入到上一个节点的尾部,所以需要定义一个指针,记录每次插入变换后的最后一个节点的指针域信息

r = head;

将头节点赋值给r,r记录每次插入变换后尾部的信息

申请一个节点A1,将A1按照尾插法插入到链表当中,实现代码为

r -> next = p;
r = p;

第一句代码 r -> next = p的意思是将 r (当前还是代表头节点的地址)的下一个节点指向p,图像表示形式为

第二句代码 r = p的意思是将原本表示头部节点地址的指针赋值为新插入的A1,也就是说 r 当前表示为节点A1

当插入节点A2时,依然执行这两行代码,由于r是上一个新插入的节点,所以A2插入到了A1的尾部

插入后同样将r赋值给当前插入节点的地址

不断地执行上述过程,把新来的节点插入到上一个尾部,把最后一个节点的next值赋为空,实现尾插法代码的实现

完整代码如下

#include <stdio.h>
#include <stdlib.h>

typedef int Elemtype;
//结构体的定义
struct LNode{
    Elemtype data;//数据域,存储数据
    struct LNode *next;//指针域,存储指针,存放后继节点信息
};
typedef struct LNode* LNodePtr;//定义结构体指针型变量,将结构体指针等价于Linklist
typedef struct LNode LNode1;

//尾插法建立链表
LNodePtr CreateListTail(int n){
    struct LNode l1;
    LNodePtr p;
    LNodePtr r;
    int i;
    struct LNode* L = (struct LNode*)malloc(sizeof(struct LNode));
    L->next = NULL;
    L->data = 0;
    r = L;
    for(i = 0; i < n; i ++){
        p = (struct LNode*)malloc(sizeof(struct LNode));//每次动态申请一个结构体空间存储
        p->data = i;
        r->next = p;
        r = p;
    }
    r->next = NULL;
    return L;

}
//链表的遍历输出
void TraverseList(LNodePtr L){
    LNodePtr p, q;
    p = L;//将头指针赋值给p
    while(p->next != NULL){
        q = p->next;
        printf("%d\n", q->data);
        p = p->next;
    }
}
int main()
{
    LNodePtr l1 = CreateListTail(5);
    TraverseList(l1);
    return 0;
}

  • 153
    点赞
  • 452
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
Linux内核中的链表是一种常用的数据结构,它在内核中被广泛使用来组织和管理数据。链表使用双链表的形式,每个节点只包含指针域,没有数据域。在Linux内核中,链表的操作接口定义在`linux/list.h`头文件中。为了方便使用,内核提供了多种初始化链表的方式。宏定义是一种常用的初始化链表的方式,其中的一个宏定义是`INIT_LIST_HEAD(ptr)`。这个宏被用来初始化一个链表节点,将其next和prev指针都指向自身,表示这是一个空链表。通过这样的方式,可以方便地对链表进行插入和删除操作,以及遍历链表中的元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux内核链表理解与使用](https://blog.csdn.net/to_be_better_wen/article/details/127720433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [linux内核链表最细讲解](https://blog.csdn.net/yzw_yy/article/details/130094799)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Linux中的内核链表实例详解](https://download.csdn.net/download/weixin_38724363/14893522)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值