我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

总结

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍了C语言如何建立动态链表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-23

c语言怎么建立多个动态链表

要建立多个动态链表,可以使用结构体和指针来实现。首先,定义一个结构体来表示链表的节点,包含一个数据域和一个指向下一个节点的指针域,如下所示:```ctypedef struct Node {int data; // 数
2023-08-25

c语言动态链表如何创建

动态链表的创建主要包括以下几个步骤:1. 定义链表节点的数据结构:```ctypedef struct Node{int data; // 节点存储的数据struct Node* next; // 指向下一个节点的指针
2023-08-25

c语言哈希链表如何建立

在C语言中,可以通过结构体和指针来实现哈希链表的建立。首先,定义一个哈希链表的节点结构体,包括键值对的数据和指向下一个节点的指针:```ctypedef struct Node {int key;int value;struct Node*
2023-08-25

C语言如何实现动态链表

今天小编给大家分享一下C语言如何实现动态链表的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。链表是一种物理存储单元上非连续、非
2023-06-30

c语言如何建立对照表

在C语言中,可以使用数组或者结构体来建立对照表。使用数组:可以使用一个二维数组来建立对照表。其中,第一维表示需要对照的元素的索引,第二维表示对应的值。例如,建立一个字符到整数的对照表,可以使用如下代码:#include int main(
2023-10-27

c语言单链表如何创建

创建单链表的基本思路如下:1. 定义一个结构体用来表示链表中的节点,结构体中包含一个数据域用来存储节点的值,还包含一个指针域用来指向下一个节点。```struct ListNode {int data;struct ListNode* ne
2023-08-25

c语言动态数组是如何建立和使用的

c语言中动态数组是一种可调整大小的数组,使用malloc()分配内存,通过realloc()调整大小,用free()释放。C 语言动态数组什么是动态数组?动态数组也称为可变数组或自增长数组,它是一种在运行时可以调整大小的数组。与传统静态数
c语言动态数组是如何建立和使用的
2024-05-22

c语言动态数组怎么建立和使用

在C语言中,要使用动态数组,需要使用指针和动态内存分配的函数来实现。下面是建立和使用动态数组的步骤:1. 声明一个指针变量来存储动态数组的地址:例如,`int* arr;`2. 使用动态内存分配的函数`malloc()`来为数组分配内存空间
2023-10-10

c语言如何创建双向循环链表

要创建一个双向循环链表,你可以按照以下步骤进行:1. 首先,定义一个节点结构体,包含一个数据域和两个指针域,分别指向前一个节点和后一个节点:```ctypedef struct Node {int data;struct Node* pre
2023-08-25

c语言链表如何实现

这篇“c语言链表如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c语言链表如何实现”文章吧。在计算机领域离不开算法和数
2023-06-19

C语言怎么实现线性动态单向链表

本篇内容主要讲解“C语言怎么实现线性动态单向链表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现线性动态单向链表”吧!什么是链表链表是数据结构里面的一种,线性链表是链表的一种,线性链
2023-06-30

C语言中如何使用链表

这篇文章主要介绍C语言中如何使用链表,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、结构体的概念比如说学生的信息,包含了学生名称、学号、性别、年龄等信息,这些参数可能有些是数组型、字符型、整型、甚至是结构体类型的数
2023-06-29

C语言中单链表如何实现

这篇文章主要介绍“C语言中单链表如何实现”,在日常操作中,相信很多人在C语言中单链表如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中单链表如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-07-04

C语言如何编写一个链表

这篇文章主要介绍了C语言如何编写一个链表,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例为大家分享了C语言编写一个链表的具体代码,具体内容如下链表具备的基本功能:1.创
2023-06-15

C语言如何实现双向链表

本篇内容介绍了“C语言如何实现双向链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!双向链表的基本操作 1.利用尾插法建立一个双向链表
2023-06-16

C语言如何复制复杂链表

这篇文章主要讲解了“C语言如何复制复杂链表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言如何复制复杂链表”吧!什么是复杂链表?复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录