带头结点单链表的头插法和尾插法

带头结点的单链表是一种常见的数据结构,其中头结点本身不存储数据,只用于指向链表的第一个实际节点。头插法和尾插法是两种常见的插入节点的方法。

头插法(Head Insertion)

头插法是指每次插入新节点时,新节点都成为链表的第一个实际节点。具体步骤如下:

  1. 创建一个新节点。

  2. 将新节点的 next 指针指向当前链表的第一个实际节点。

  3. 将头结点的 next 指针指向新节点。

// 头插法创建链表
void CreateList_HeadInsert(LinkList &L, int n) {
    L = new Lnode;  // 创建头结点
    L->next = nullptr;  // 头结点的next指针初始化为nullptr

    for (int i = 0; i < n; i++) {
        LinkList p = new Lnode;  // 创建新节点
        cout << "请输入数据域: ";
        cin >> p->data;  // 输入新节点的数据域
        p->next = L->next;  // 新节点的next指向当前头结点的next
        L->next = p;  // 头结点的next指向新节点
    }
}

尾插法(Tail Insertion)

尾插法是指每次插入新节点时,新节点都成为链表的最后一个实际节点。具体步骤如下:

  1. 创建一个新节点。

  2. 将当前链表的最后一个节点的 next 指针指向新节点。

  3. 更新尾指针,使其指向新节点。

// 尾插法创建链表
void CreateList_TailInsert(LinkList &L, int n) {
    L = new Lnode;  // 创建头结点
    L->next = nullptr;  // 头结点的next指针初始化为nullptr
    LinkList r = L;  // 尾指针r指向头结点

    for (int i = 0; i < n; i++) {
        LinkList p = new Lnode;  // 创建新节点
        cout << "请输入数据域: ";
        cin >> p->data;  // 输入新节点的数据域
        p->next = nullptr;  // 新节点的next指针初始化为nullptr
        r->next = p;  // 尾指针的next指向新节点
        r = p;  // 尾指针r指向新节点
    }
}

 

 

 

### 带头结点单链表尾插法实现 对于带有头节点的单链表,在C语言中的基本操作可以通过定义合适的结构体来表示链表节点,并通过一系列函数完成各种操作。下面展示的是如何利用尾插法构建这样的单链表。 #### 定义单链表结构体 为了方便管理遍历列表,通常会在链表前加上一个特殊的节点称为头节点。这里采用`typedef struct LNode`的方式定义了一个名为`LinkNode`的数据类型用于描述每一个链表元素[^1]: ```c #include <stdio.h> #include <stdlib.h> #define ElemType int // 设定ElemType为int型 typedef struct LNode { ElemType data; struct LNode *next; } LinkNode, *LinkList; ``` #### 创建并初始化空链表 当创建一个新的链表时,先分配内存给头节点并将它的`next`字段设为空指针(NULL),表明此时链表内没有任何实际数据项[^4]: ```c void InitList(LinkList &L){ L = (LinkList)malloc(sizeof(LinkNode)); if (!L) exit(-1); L->next = NULL; } ``` #### 使用尾插法向链表中添加新元素 在尾部插入新的节点可以提高效率,因为不需要每次都从头开始寻找插入位置。此方法涉及维护两个指针变量:一个是始终指向当前最后一个有效节点(`r`);另一个则是用来追踪整个过程中的最新加入者(`s`)。 ```c void CreateList_TailInsert(LinkList &L, int n){ LinkNode *s,*r=L; // r始终指向最后的一个节点 for(int i=0;i<n;++i){ s=(LinkNode *)malloc(sizeof(LinkNode)); printf("请输入第%d个元素:",i+1); scanf("%d",&(s->data)); s->next=NULL; r->next=s; r=s; } } ``` 这段代码实现了如下功能: - 动态申请空间存储即将被追加到队列末端的新项目; - 用户交互式输入待存入各节点的具体数值; - 更新现有记录中最右侧的位置至刚产生的实例上以便后续继续扩展。 以上就是基于C语言环境下运用尾插法带头节点的单链表执行基础增删改查等常规处理手段之一种方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值