C语言数据结构之单链表存储详解

 更新时间:2022年07月27日 10:42:43   作者:代码骑士  
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将和大家一起聊聊C语言中单链表的存储,感兴趣的可以学习一下

如果说,顺序表的所占用的内存空间是连续的,那么链表则是随机分配的不连续的,那么为了使随机分散的内存空间串联在一起形成一种前后相连的关系,指针则起到了关键性作用。

单链表的基本结构:

头指针:永远指向链表第一个节点的位置。

头结点:不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题。

首元结点:首个带有元素的结点。

其他结点:链表中其他的节点。

1、定义一个链表结点

包括数据域和指针域

typedef struct Link{
    char elem;//数据域 
    struct Link *next;//指针域,用来连接后继元素 
}link;//link为节点名,每个结点都是一个link结构体 

2、初始化单链表

(1)创建一个头结点

(2)声明一个临时指针指向头结点

(3)用循环创建新的结点并赋值且依次相连

newLink a;

a->data=i;

a->next=null;

temp->next=a;

temp=a;

过程如下:

带头结点:

link * initLink(){
    link *p=(link*)malloc(sizeof(link));//创建头结点
    link*temp = p;//声明一个指针temp指向头结点,也就是头结点的地址赋值给指针变量(注意这不是头指针而是用来连接数组的临时指针变量)
    //生成链表
    for(int i=1;i<5;i++)
    {
        link *a=(link*)malloc(sizeof(link));//生成一个结点 
        a->elem=i;//给结点的数据域赋值
        a->next=NULL;//指针域设置为空 
        temp->next=a;//上一个结点的指针指向新增结点 
        temp=temp->next;//临时指针向后移动也可写成temp=a 
    } 
    //返回头结点,通过头节点的指针即可找到整个链表
    return p;
} 

无头结点的单链表初始化:

 link * initLink2(){
    link *p=NULL;//创建头指针
    link*temp=(link*)malloc(sizeof(link));//创建首元结点
    //首元结点初始化
    temp->elem=1;
    temp->next=NULL;
    p=temp;//头结点指向首元结点
    //接下来从第二个结点开始创建
    for(int i=2;i<5;i++){
        //创建一个新结点并初始化
        link *a=(link*)malloc(sizeof(link));
        a->elem=i;
        a->next=NULL;
        //将temp结点与新建的a结点建立逻辑关系
        temp->next=a;
        temp=a;    
    }
    //返回建立的节点,只返回头指针 p即可,通过头指针即可找到整个链表
    return p; 
}

3、输出链表数据

带头结点:

void display(link *p){
    link*temp=p;//将temp指向头结点
    //只要temp指针指向的结点的next不是Null,就执行输出语句。
    while(temp->next){
        temp=temp->next;
        printf("%d ",temp->elem);
    } 
    printf("\n");
} 

不带头结点:

void display2(link *p){
    link* temp=p;//将temp指针重新指向头结点
    //只要temp指针指向的结点的next不是Null,就执行输出语句。
    while (temp) {
        printf("%d ",temp->elem);
        temp=temp->next;
    }
    printf("\n");
}

4、完整代码

#include<stdio.h>
#include<stdlib.h>
 
typedef struct Link{
    int elem;//数据域 
    struct Link *next;//指针域,用来连接后继元素 
}link;//link为节点名,每个结点都是一个link结构体 
 
//带头结点 
link * initLink(){
    link *p=(link*)malloc(sizeof(link));//创建头结点
    link*temp = p;//声明一个指针temp指向头结点,也就是头结点的地址赋值给指针变量(注意这不是头指针而是用来连接数组的临时指针变量)
    //生成链表
    for(int i=1;i<5;i++)
    {
        link *a=(link*)malloc(sizeof(link));//生成一个结点 
        a->elem=i;//给结点的数据域赋值
        a->next=NULL;//指针域设置为空 
        temp->next=a;//上一个结点的指针指向新增结点 
        temp=temp->next;//临时指针向后移动也可写成temp=a 
    } 
    //返回头结点,通过头节点的指针即可找到整个链表
    return p;
} 
 
//不带头结点 
link * initLink2(){
    link *p=NULL;//创建头指针
    link*temp=(link*)malloc(sizeof(link));//创建首元结点
    //首元结点初始化
    temp->elem=1;
    temp->next=NULL;
    p=temp;//头结点指向首元结点
    //接下来从第二个结点开始创建
    for(int i=2;i<5;i++){
        //创建一个新结点并初始化
        link *a=(link*)malloc(sizeof(link));
        a->elem=i;
        a->next=NULL;
        //将temp结点与新建的a结点建立逻辑关系
        temp->next=a;
        temp=a;    
    }
    //返回建立的节点,只返回头指针 p即可,通过头指针即可找到整个链表
    return p; 
}
 
//带头结点 
void display(link *p){
    link*temp=p;//将temp指向头结点
    //只要temp指针指向的结点的next不是Null,就执行输出语句。
    while(temp->next){
        temp=temp->next;
        printf("%d ",temp->elem);
    } 
    printf("\n");
} 
 
//不带头结点 
void display2(link *p){
    link* temp=p;//将temp指针重新指向头结点
    //只要temp指针指向的结点的next不是Null,就执行输出语句。
    while (temp) {
        printf("%d ",temp->elem);
        temp=temp->next;
    }
    printf("\n");
}
 
int main()
{
    display(initLink());
    return 0;
}

输出结果:

以上就是C语言数据结构之单链表存储详解的详细内容,更多关于C语言单链表存储的资料请关注脚本之家其它相关文章!

相关文章

  • 一起来看看C语言世界中的结构体

    一起来看看C语言世界中的结构体

    这篇文章主要为大家详细介绍了C语言世界中的结构体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • MFC实现学生选课系统

    MFC实现学生选课系统

    这篇文章主要为大家详细介绍了MFC实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C++构造函数的类型,浅拷贝与深拷贝详解

    C++构造函数的类型,浅拷贝与深拷贝详解

    这篇文章主要为大家详细介绍了C++构造函数的类型,浅拷贝与深拷贝,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++ XML库用法详解

    C++ XML库用法详解

    TinyXML-2是C++中一个轻量级、易于使用的XML解析库,支持XML的读取和写入,内存占用小,适合嵌入式系统,本文给大家介绍C++ XML库用法,感兴趣的朋友一起看看吧
    2025-03-03
  • C++ opencv图像处理实现图片几何变换示例

    C++ opencv图像处理实现图片几何变换示例

    这篇文章主要为大家介绍了C++ opencv图像处理实现图片几何变换示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言大小端模式、判断大小端、大小端转换方法详解

    C语言大小端模式、判断大小端、大小端转换方法详解

    这篇文章主要介绍了C语言大小端模式、判断大小端、大小端转换的相关资料,大端和小端是数据在内存中的存储方式,大端模式下高字节存于低地址,小端模式则相反,大小端问题由数据类型多字节存储引起,不同选择形成不同存储模式,需要的朋友可以参考下
    2024-10-10
  • C++深入细致探究二叉搜索树

    C++深入细致探究二叉搜索树

    二叉搜索树是以一棵二叉树来组织的。每个节点是一个对象,包含的属性有left,right,p和key,其中,left指向该节点的左孩子,right指向该节点的右孩子,p指向该节点的父节点,key是它的值
    2022-05-05
  • c++ std::sort使用自定义的比较函数排序方式

    c++ std::sort使用自定义的比较函数排序方式

    文章介绍了使用std::sort对容器内元素进行排序的基本方法,包括自定义排序函数和在类中调用自定义成员函数进行排序的方法,文章还指出了在传递成员函数指针时可能会遇到的错误,并提供了使用Lambda表达式的解决办法
    2025-02-02
  • c++学习之构造函数

    c++学习之构造函数

    类多么重要我就不多说了,只讲讲学习,因为个人认为类的学习无论从概念的理解还是实际代码的编写相对其他C兼容向的代码都是比较有难度的, 对于以前学C 的人来说这才是真正的新概念和内容,STL其实还比较好理解,不就是一个更大的函数库和代码可以使用嘛。
    2015-06-06
  • 深入ORACLE变量的定义与使用的详解

    深入ORACLE变量的定义与使用的详解

    本篇文章是对ORACLE变量的定义与使用进行了详细的分析与介绍,需要的朋友参考下
    2013-05-05

最新评论