头插法建立链表详解

头插法就是建立一个头节点,进行初始化定义,next存储下一个节点位置的地址,初始化定义指针域为空,表示该头部节点后面指向任何位置的地址,开始时只有一个头部节点。

head -> next = NULL;

图形化表示为

申请一个新节点A1,将A1按照头插法插入到head节点的后面,实现代码为

p -> next = head -> next;
head -> next = p;

p -> next表示p后面指向的地址,将该地址赋值给为头部节点的所指向的下一个节点,也就是空节点(head->next初始化为NULL)

也就是相当于p->next = head -> next =NULL

head -> next 表示头部节点指向的下一个节点,为p,表示head的下一个节点为p, p的下一个节点为空

图像化表示为(该节点用A1表示)

当继续采用头插法插入节点A2时,依旧执行代码

p -> next = head -> next;
head -> next = p;

在此时各个节点的对应情况为

p -> next = head -> next = p(A1) 也就是说A2 后面对应的是节点A1

head -> next = p(A2) 头节点后面对应的节点是A2

图像化表示为

新来的A2破坏了原本head和A1之间的关系,并且建立了新联系

后面的操作过程就是不断地重复上诉过程,把头节点和新插入的节点之间建立联系,新插入的节点和上一个插入的节点之间建立联系,最终实现一个完整的链表

c语言代码实现如下

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

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

//头插法建立链表
void CreateListHead(Linklist L, int n){//n为创建链表的大小空间
    Linklist p;
    int i;
    L->next = NULL;//开始时,该节点的指针域为空,也就是下一个节点为空,不包含其他节点
    for(i = 0; i < n; i ++){//定义含有i个空间大小的空间
        p = (struct LNode *)malloc(sizeof(struct LNode));//申请足够大小的空间,将该空间的基地址赋值给p
        p->data = i;//在数据域中存储数据
        p->next = L->next;
        L->next = p;//重新定义头指针的下一个,为当前的开始位置
    }

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

  • 46
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
头插法创建链表是一种在链表头部插入新节点的方法。在C语言中,可以使用以下代码实现头插法创建链表: ```c typedef struct Lnode { char data; struct Lnode* next; } Lnode, *Linklist; Linklist Establish_Linklist_head1(void) { char arr\[5\] = {'a', 'b', 'c', 'd', 'e'}; int i = sizeof(arr) / sizeof(arr\[0\]); Linklist l = (Linklist)malloc(sizeof(Lnode)); l->next = NULL; l->data = arr\[i - 1\]; while (i--) { Lnode* p = (Linklist)malloc(sizeof(Lnode)); p->data = arr\[i - 1\]; p->next = l; l = p; } return l; } ``` 这段代码会创建一个带有头结点和头指针的链表,其中头结点的数据域为空,头指针指向第一个节点。通过循环将数组中的元素依次插入链表的头部,最后返回链表的头指针。 方法1和方法2都是使用头插法创建链表,它们的最终结果是一样的。方法1是在头结点之后插入新节点,而方法2是在链表的最前面插入新节点。方法2在产生头结点时可能会出现跨界访问的问题,但是编译器可能不会报错或警告。为了避免非法访问,可以改变循环条件,并在循环之后再插入一个头结点。方法2仅供参考,学习链表时建议使用方法1。 希望对你有帮助! #### 引用[.reference_title] - *1* *2* *3* [c语言单链表的创建(头插法和尾插法)](https://blog.csdn.net/m0_69251699/article/details/129103530)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值