栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

单链表创建【头插尾插】(c语言实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单链表创建【头插尾插】(c语言实现)

作者为转行小白,刚接触数据结构算法,如有错误虚心接受批评指正。希望能够在计算机的学习过程中得到进步。

链表为线性表的一种,是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。地址空间是可以不连续的。将整体分为数据域和指针域两部分。

图片来自于  王道考研 头插法建立单链表

链表建立与插入类似,头插法即在头结点的后继插入,输出结果与输入结果相反,如下图想得到

a,b,c,d,,e应输入e,d,c,b,a

头插法核心代码

图片来自于  bilibili 青岛大学  王卓老师

头插法代码(如有错误,请指正,作者转行小白)

#include 
#include 
//头插法建立链表
typedef struct node
{
    int data;
    struct node* next;
}Node, * linkList;//数据建立

linkList create(linkList L, int arr[], int  n)
{
    linkList p;
    L = (linkList)malloc(sizeof(Node));//为头节点开辟空间,并将头指针L指向头结点
    if (L == NULL) {                  //判断空间分配是否成功(不判断会报错)
        printf("内存分配不成功!n");
    }
    else {
        L->next = NULL;                  //头结点指针域为空,空表判断
        for (int i = 0;i < 5;i++) {
            p = (linkList)malloc(sizeof(Node));  //为普通结点开辟空间
            if (p == NULL) {
                printf("内存分配不成功!n");//判断空间分配是否成功(不判断会报错)
            }
            else {
                p->data = arr[i];               //为结点设置数据域
                p->next = L->next;             //第一次为尾结点 后面为当前节点的next域指向后 
                                               //  一个节点
                L->next = p;                  //将当前节点与前一个节点相连 
            }
        }
    }   //判断空间分配是否成功(不判断会报错)对应上面L开辟的if
    return L;  //返回头指针 L
}


void print(linkList q){   //打印链表
    linkList p;  
    p = q->next;    //设置p为头结点
    while(p){                     // if(p)等价if(p!=NULL)
        printf("%d  ", p->data);
        p = p->next;          //跳向下一个结点
    }

}

int main() {
    linkList L = 0;
    linkList q = 0;
    int arr[5] = { 1,2,3,4,5 }; //链表成员
    int n = 0;   //链表总共n个
    q=create(L, arr, n);       //单链表建立
    print(q); //单链表打印/遍历
    return 0;
}
尾插法建立单链表

尾插法顾名思义为在尾部插入结点,与头插法不同在当同样输出a,b,c,d,e只需正序输入即可。在用尾插法时应注意创建尾指针与头指针共同指向头结点,再进行普通节点创建。

图片来自于  bilibili 回忆那山那水

尾插法创建单链表代码如下:

#include 
#include 
#include 
#include 
//头插法建立链表
typedef struct node {
    int data;
    struct node* next;
}node,*linkList;

linkList create(linkList L,int arr[],int n) {
   L = (linkList)malloc(sizeof(node)); //开辟空间并将头指针指向头结点
   if (L==NULL) {
    
       printf("内存分配不成功!n");
   }
   else
   {
       L->next = NULL;
       linkList end = L;//创建 尾结点并指向头结点
       linkList p;
       for (int i = 0;i < 5;i++) {
       p= (linkList)malloc(sizeof(node));
       if (p==NULL)
       {
           printf("内存分配不成功!n");
       }
       else {
       
           p->data = arr[i];
           end->next = p;   //将头指针的next域指向p(连接前后结点)
           end = p;        //将p的数据域指针域赋给尾结点,之后p继续创造下一个结点
         }
       }
       p->next = NULL; //最后的结点的指向为NULL
                       //该处p是否可以用end
   }
   return L;
}
void print(linkList q) {   //n为总个数
    linkList p;
    p = q->next;    //设置p为头结点
    while (p) {                     // if(p)等价if(p!=NULL)
        printf("%d  ", p->data);
        p = p->next;          //跳向下一个结点
    }

}
int main() {
    linkList L = 0;
    linkList q = 0;
    int arr[5] = { 1,2,3,4,5 }; //链表成员
    int n = 0;   //链表总共n个
    q=create(L, arr, n);       //单链表建立
    print(q); //单链表打印/遍历
    return 0;
}

头插法 尾插法流程图对比

头插法 尾插法代码对比
//头插法核心代码段: 
p->next = L->next;   //先将插入第n个节点与n+1连接            
L->next = p;         //再将n-1与第n节点相连

顺序不可以颠倒,n-1节点先连接n则导致后面找不到n+1

//尾插法核心代码段: 
 end->next = p;   //将头指针的next域指向p(连接前后结点)
 end = p;        //将p的数据域指针域赋给尾结点,之后p继续创造下一个结点

与头插法不同在于。尾插法是在上一结点尾部插入,
因此不需要进行第一步操作,即L—next=p—next;
直接进行头结点与当前相连即可,但end需指向p,p即可进行下一个节点的创建
最后要将尾结点next域置为空 即 p->next=NULL; 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352960.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号