头插法建立链表详解

头插法就是建立一个头节点,进行初始化定义,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;
//结构体的定义
typedef struct{
    Elemtype data;//数据域,存储数据
    struct LNode *next;//指针域,存储指针,存放后继节点信息
}LNode;
typedef LNode *Linklist;//定义结构体指针型变量,将结构体指针等价于Linklist

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


    }

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

 


版权声明:本文为qq_40741513原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>