返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言如何建立动态链表问题
  • 649
分享到

C语言如何建立动态链表问题

C语言动态链表建立动态链表C语言建立动态链表 2022-12-23 12:12:52 649人浏览 八月长安
摘要

目录C语言建立动态链表静态链表和动态链表的区别静态链表和动态链表的区别一、静态链表二、动态链表总结C语言建立动态链表 所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即

C语言建立动态链表

所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。

代码如下:

#include <stdio.h>
#include <stdib.h。
#define LEN sizeof(struct Student)
 
struct Student{
       long num;
       float score;
       struct Student * next;
};
 
int n;
 
struct Student * creat(void){
       struct Student * head;
       struct Student * p1, *p2;
       n = 0;
       p1 = p2 = (struct Student *)malloc(LEN);
       scanf("%ld,%f",&p1->num,&p1->score);
       head = null;
       while(p1->num != 0){
             n = n+1;
             if(n == 1)
                head = p1;
             else
                p2->next = p1;
             p2 = p1;
             p1 = (struct Student *)malloc(LEN);
             scanf("%ld,%f,&p1->num,&p1->score);
       }
       p2->next = null;
       return (head);
}

静态链表和动态链表的区别

静态链表和动态链表的区别

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。

1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。

2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。

一、静态链表

结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为“引用自身的结构体”。如:

struct node
{
  char ch;
    int num;
  struct node *p;
};
 
struct node a;	//声明一个结构体变量

p是一个可以指向struct node类型变量的指针成员。因此,a.p = &a 是合法的表达式,由此构成的存储结构如下图所示:

参考程序如下所示:


 
#include <stdio.h>
 

struct node
{
    int num;
    struct node *next;
};
 
int main()
{
    struct node stu[3];
    struct node *head, *p;
 
    stu[0].num = 10;		//对结点的num成员赋值
    stu[1].num = 20;
    stu[2].num = 30;
 
    head = &stu[0];		//头指针指向第1个结点stu[0]
    stu[0].next = &stu[1];	//将结点stu[1]的地址赋值给stu[0]结点的next成员
    stu[1].next = &stu[2];	//将结点stu[2]的地址赋值给stu[1]结点的next成员
    stu[2].next = NULL;		//stu[2]是最后一个结点,其next成员不存放任何结点的地址,置为NULL
 
    //遍历静态链表
    p = head;			//使p指针也指向第1个结点
    
    do{
        printf("%d\n", p->num);	//输出p所指向结点的数据
        p = p->next;		//然后让p指向下一个结点
    } while (p != NULL);	//直到p的next成员为NULL,即完成遍历
 
    return 0;
}

输出结果为:

root@ubuntu:~/2017/1010$ ./static_link 
10
20
30

二、动态链表

到目前为止,凡是遇到处理“批量”数据时,我们都是利用数组来存储。定义数组必须(显式的或隐含的)指明元素的个数,从而也就限定了一个数组中存放的数据量。在实际应用中,一个程序在每次运行时要处理的数据的数目通常并不确定。如果数组定义的小了,就没有足够的空间存放数据,定义大了又浪费存储空间。

对于这种情况,如果能在程序执行过程中,根据需要随时开辟存储空间,不需要时再随时释放,就能比较合理的使用存储空间。C 语言的动态存储分配提供了这种可能性。每次动态分配的存储单元,其地址不一定是连续的,而所需处理的批量数据往往是一个整体,各数据之间存在着接序关系。链表的每个节点中,除了要有存放数据本身的数据域外,至少还需要有一个指针域,用它来存放下一个节点元素的地址,以便通过这些指针把各节点连接起来。由于链表每个存储单元都由动态存储分配获得,故称这样的链表为“动态链表”。

参考程序如下所示:


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

struct Student
{
    int No;		//学号
    struct Student *next;
};
 
int main()
{
    struct Student *p1, *p2;
	struct Student *head, *p;
 
    int n = 0; //结点个数
 
    head = NULL;
    p1 = (struct Student *)malloc(sizeof(struct Student));
    printf("请输入第1个学号\n");
    scanf("%d", &p1->No);
 
    p2 = p1; //开始时,p1和p2均指向第1个结点
    while (p1->No != 0)
    {
        n++;
        if (n == 1)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
 
        p2 = p1;//p2是最后一个结点
        printf("请输入学号,输入0终止:\n");
        p1 = (struct Student *)malloc(sizeof(struct Student));
        scanf("%d", &p1->No);
    };
 
    p2->next = NULL;//输入完毕后,p2->next为NULL
 
    //遍历动态链表
	p = head;
    printf("\n学号为:\n");
 
    while (p != NULL)
    {
        printf("%d\n", p->No);
        p = p->next;
    }
 
    return 0;
}

输出结果为:

root@ubuntu:~/2017/1010$ ./dynamic_link 
请输入第1个学号1请输入学号,输入0终止:2请输入学号,输入0终止:3请输入学号,输入0终止:4请输入学号,输入0终止:0学号为:1234

注意:动态链表中,每个节点没有自己的名字,只能靠指针维系节点之间的关系。一旦某个节点的指针“断开”,后续节点就再也无法找寻!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: C语言如何建立动态链表问题

本文链接: https://lsjlt.com/news/175644.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言如何建立动态链表问题
    目录C语言建立动态链表静态链表和动态链表的区别静态链表和动态链表的区别一、静态链表二、动态链表总结C语言建立动态链表 所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即...
    99+
    2022-12-23
    C语言动态链表 建立动态链表 C语言建立动态链表
  • c语言怎么建立多个动态链表
    要建立多个动态链表,可以使用结构体和指针来实现。首先,定义一个结构体来表示链表的节点,包含一个数据域和一个指向下一个节点的指针域,如...
    99+
    2023-08-25
    c语言
  • c语言动态链表如何创建
    动态链表的创建主要包括以下几个步骤:1. 定义链表节点的数据结构:```ctypedef struct Node{int data;...
    99+
    2023-08-25
    c语言
  • c语言哈希链表如何建立
    在C语言中,可以通过结构体和指针来实现哈希链表的建立。首先,定义一个哈希链表的节点结构体,包括键值对的数据和指向下一个节点的指针:`...
    99+
    2023-08-25
    c语言
  • C语言如何实现动态链表
    今天小编给大家分享一下C语言如何实现动态链表的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。链表是一种物理存储单元上非连续、非...
    99+
    2023-06-30
  • C语言如何实现头插法建立单链表
    目录怎么将结点一个个插入在某个结点前面呢?然后再在头结点的后面插入新的结点首先要明确一点,利用头插法建立出来的单链表的输出都是逆序的(就是和你的输入顺序反着来的)然后就是要明确生成的...
    99+
    2024-04-02
  • c语言如何建立对照表
    在C语言中,可以使用数组或者结构体来建立对照表。 使用数组: 可以使用一个二维数组来建立对照表。其中,第一维表示需要对照的元素的索...
    99+
    2023-10-27
    c语言
  • c语言单链表如何创建
    创建单链表的基本思路如下:1. 定义一个结构体用来表示链表中的节点,结构体中包含一个数据域用来存储节点的值,还包含一个指针域用来指向...
    99+
    2023-08-25
    c语言
  • c语言动态数组是如何建立和使用的
    c语言中动态数组是一种可调整大小的数组,使用malloc()分配内存,通过realloc()调整大小,用free()释放。 C 语言动态数组 什么是动态数组?动态数组也称为可变数组或自...
    99+
    2024-05-22
    c语言 标准库
  • c语言动态数组怎么建立和使用
    在C语言中,要使用动态数组,需要使用指针和动态内存分配的函数来实现。下面是建立和使用动态数组的步骤:1. 声明一个指针变量来存储动态...
    99+
    2023-10-10
    c语言
  • C语言实现动态链表的示例代码
    目录结构体定义已经函数声明函数实现创建一个链表判断链表是否为空获得链表中节点的个数在某个特定的位置插入一个元素获得指定下标的节点的元素删除一个节点链表逆序链表的清空链表的销毁链表的遍...
    99+
    2024-04-02
  • c语言如何创建双向循环链表
    要创建一个双向循环链表,你可以按照以下步骤进行:1. 首先,定义一个节点结构体,包含一个数据域和两个指针域,分别指向前一个节点和后一...
    99+
    2023-08-25
    c语言
  • c语言链表如何实现
    这篇“c语言链表如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c语言链表如何实现”文章吧。在计算机领域离不开算法和数...
    99+
    2023-06-19
  • C语言怎么实现线性动态单向链表
    本篇内容主要讲解“C语言怎么实现线性动态单向链表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现线性动态单向链表”吧!什么是链表链表是数据结构里面的一种,线性链表是链表的一种,线性链...
    99+
    2023-06-30
  • C语言数据结构之单链表的查找和建立
    目录单链表的查找按位查找按值查找单链表的建立尾插法头插法建立单链表单链表的查找 其实在单链表的插入和删除中,我们已经使用过单链表的查找方法,因为插入和删除的前提都是先找到对应的结点,...
    99+
    2024-04-02
  • C语言中如何使用链表
    这篇文章主要介绍C语言中如何使用链表,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、结构体的概念比如说学生的信息,包含了学生名称、学号、性别、年龄等信息,这些参数可能有些是数组型、字符型、整型、甚至是结构体类型的数...
    99+
    2023-06-29
  • C语言邻接表建立图详解
    目录有向图无向图邻接表存图进行拓扑排序总结有向图 代码: #include<stdio.h> #include<stdlib.h> #include<...
    99+
    2024-04-02
  • C语言如何实现双向链表
    本篇内容介绍了“C语言如何实现双向链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!双向链表的基本操作    ...
    99+
    2023-06-16
  • C语言如何复制复杂链表
    这篇文章主要讲解了“C语言如何复制复杂链表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言如何复制复杂链表”吧!什么是复杂链表?复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用...
    99+
    2023-06-16
  • C语言如何编写一个链表
    这篇文章主要介绍了C语言如何编写一个链表,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例为大家分享了C语言编写一个链表的具体代码,具体内容如下链表具备的基本功能:1.创...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作