0
点赞
收藏
分享

微信扫一扫

数据结构之线性表-单链表 创建单链表的两种方式(带有详细注释)

头插法

/* 头插法(每次新结点都插入在头结点后,第一个数据结点之前),形成逆序的单链表 */
//注意: 定义指针变量,为了安全起见和习惯,一般需要初始化为NULL

#include <stdio.h>
#include <stdlib.h>   //malloc函数的依赖
typedef int ElemType; //重命名int为ElemType

//结点定义
typedef struct LNode
{
    ElemType data;      //数据域
    struct LNode *next; //指针域
} LNode, *LinkList;     //结构体的一个普通变量(用于数据结点)和一个指针变量(用于头结点)

//创建链表(头插法): 传入指向链表头结点的头指针作为形参
LinkList Creat_list(LinkList head)
{
    head = (LinkList)malloc(sizeof(LNode)); //为头指针(头结点)开辟内存空间,由于malloc返回的是空指针类型,故前面才需进行强转
    head->next = NULL;                      //没有数据结点,故初始化头结点的指针域为空
    LNode *node = NULL;                     //定义工作指针,即用于辅助的指针变量,且安全起见初始化为NULL
    int count = 0;                          //初始化已创建的数据结点的个数为0
    printf("(head insert)Please input the number of Node: ");
    scanf("%d", &count); //输入需要创建的数据结点的个数
    //开始构造链表
    for (int i = 0; i < count; i++)
    {
        node = (LNode *)malloc(sizeof(LNode)); // 为新结点开启一个结点的内存空间
        node->data = i;                        //数据域的赋值
        //指针域的赋值,即新结点 插入 前驱结点头结点的后面(从右往左)
        node->next = head->next;
        head->next = node;
    }
    //返回指向头结点的指针,即头指针
    return head;
}

//test,打印链表
void main()
{
    LinkList head = NULL;
    LinkList linkList = Creat_list(head);
    LNode *p = linkList->next; //指向第一个数据结点
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
}

尾插法

/*尾插法(每次新结点都插入在尾结点后)
(为了提高查找尾结点的效率,需新定义一个尾指针专门指向尾结点,且始终指向尾结点)
(尾结点是带有数据的数据结点,而头结点是不带数据的)*/

#include <stdio.h>
#include <stdlib.h>   //malloc函数的依赖
typedef int ElemType; //重命名int为ElemType

//结点定义
typedef struct LNode
{
    ElemType data;      //数据域
    struct LNode *next; //指针域
} LNode, *LinkList;     //结构体的一个普通变量和一个指针变量(用于数据结点)和一个指针变量(用于头结点/尾结点)

//创建链表(尾插法): 传入指向链表头结点的头指针作为形参
LinkList Creat_list(LinkList head)
{
    head = (LinkList)malloc(sizeof(LinkList)); //为头指针(头结点)开辟内存空间
    head->next = NULL;                         //没有数据结点,故初始化头结点的指针域为空
    LNode *end = NULL;                         // 定义尾指针变量并初始化为NULL
    end = head;                                //没有数据结点,故尾指针初始化指向头结点
    LNode *node = NULL;                        //定义工作指针,即用于辅助的指针变量,初始化为NULL
    int count = 0;                             //初始化已创建的数据结点的个数为0
    printf("(tail insert)Please input the number of Node: ");
    scanf("%d", &count);
    //开始构造链表
    for (int i = 0; i < count; i++)
    {
        node = (LNode *)malloc(sizeof(LNode)); // 为新结点开启一个结点的内存空间
        node->data = i;                        //数据域的赋值
        //指针域的赋值,即新结点 插入 尾结点的后面
        end->next = node; //新结点连接在尾结点的后面
        end = node;       //新结点成为新的尾结点
    }
    end->next = NULL; //链表构造结束,令尾指针指向的尾结点的指针域为NULL
    //返回指向头结点的指针,即头指针
    return head;
}

//test,打印链表
void main()
{
    LinkList head = NULL;
    LinkList linkList = Creat_list(head);
    LNode *p = linkList->next; //指向第一个数据结点
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
}

如何选择


在这里插入图片描述

举报

相关推荐

0 条评论