C语言链表初学者都说很难,今天就来为大家讲讲链表

讲链表之前不得不介绍一下结构体,在链表学习之前大家都应该已经学了结构体,都知道结构体里面能有许多变量,每个变量可以当做这个结构体的属性,例如:

struct Stu{
char name[6];
int age;
};

在这里我们就定义了一个名为Stu的结构体,他有2个属性,name和age,在使用的时候我们先定义一个变量

struct Stu student;

通过 student.name 来获取 name属性的值。

这里的结构体只有2个东西,是不是和链表特别像?其实链表和结构体是一家人。

一个包含了指向自己指针的结构体就叫做链表。我把上面的结构体改成链表大家看看

struct Stu{
char name[6];
int age;
struct Stu * next;
};

  这就是一个链表了,就是多了一个指针struct Stu * next;  为什么要加上这么一句它才是链表呢?

学习链表时大家都知道链表分为date 和 next 2个部分,date部分用来存放链表中的数据,这里又要说一点,date只是一个抽象的说法,date并不是一个变量,而是链表中存放的所有数据的总称,这里 name和age统称date部分。next 用来存放下一个数据块的地址,因为链表的类型是struct Stu ,那么指向下一个数据块地址的指针就必须是struct Stu * 类型的,所以这里要这么写 struct Stu * next; 当然了,不一定要叫next,但是习惯性还是用next这个名字,不然数据多了会用错。

定义好了大家就想使用了吧,不然我们花这么大力气去定义一个链表干嘛,那么如何使用链表呢?

1、定义一个链表的结构,如上面的例子

2、定义一个链表变量,struct Stu student

3、为新定义的链表student 分配空间

4、使用链表(增删改查)

要想使用一个链表要经历这么几个步骤,之前自学的时候愣是没有弄明白,结症就在这里。

首先我们要定义一个链表结构,因为只有这样,电脑才能知道我们要在链表中存入什么数据,然后就是定义一个新的链表了,但是定义完了却不能马上使用,因为你定义完了系统并没有为它分配空间,你要存一个数据,系统并不知道应该存到哪里,就好比你没有住的地方,但是你邀请一个人去你家做客,那个人能知道去哪里做客吗?所以接下来我们要为这个新的链表建一个家(分配一段内存),然后我们就可以对链表进行增删改查了。下面贴一段代码

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> typedef struct Node01{
int i;
struct Node * pNext;
}Node,*pNode; pNode CreateNode(){
pNode p,ptail;
int len,i,k;
pNode q;
p = (pNode)malloc(sizeof(Node));
ptail = p;
ptail->pNext = NULL;
printf("请输入成绩数量:");
scanf("%d",&len);
for(i = 0;i<len;i++){ q=(pNode)malloc(sizeof(Node));
if(NULL==q){
printf("内存分配失败!");
return p;
}
printf("请输入第%d个成绩:",i+1);
scanf("%d",&k);
q->i = k;
ptail->pNext = q;
ptail = q;
ptail->pNext = NULL;
}
return p;
} int main(void){
pNode stuGrade,p;
stuGrade = CreateNode();
p = stuGrade->pNext;
free(stuGrade);
while(NULL!=p){
printf("%d ",*&*p);
p=p->pNext;
}
getch();
return 0;
}

  这是一段可以 直接运行的代码,已经测试过。首先来介绍一下定义链表的结构吧,以免大家不明白。

这里用到了typedef,他的意思是定义一个新的类型,typedef + 类型结构 + 新名字

在这里我们用typedef定义了一个结构为

struct Node01{
int i;
struct Node * pNext;
}

的新变量Node以及一个指向这个变量的指针*Node。这样在后面的代码中我们就可以利用Node来代替struct Stu 这个名字了。比如定义一个新链表应该是struct Stu student,现在我们可以这样定义Node student 是不是很方便呢?

在定义了一个链表之后我们需要为新的链表分配空间,这是在CreatNode函数里面,通过malloc来分配内存,sizeof(Node)代表一个链表数据块的长度,也就是struct Stu的长度。malloc返回的类型应该是一个指针,并且是struct Stu类型的指针,所以前面要加上 struct Stu *也就是pNode。

了解了这些大家应该对指针有了更加深入的了解了吧~

C语言之链表的使用的更多相关文章

  1. C语言之链表

    这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...

  2. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

  3. YTU 2430: C语言习题 链表建立,插入,删除,输出

    2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 576  解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...

  4. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  5. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  6. C语言:链表实现的一个实例

    问题:写一个程序输入你一年看过的所有电影以及每部电影的各种信息(简化问题:每部电影只要求输入片名和评价) 链表实现: #include<stdio.h> #include<stdli ...

  7. C语言单链表实现19个功能完全详解

    谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...

  8. (转)c语言_链表实例讲解(两个经典例子)

    建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. #include <stdio.h>#include <stdlib.h> struct grade {    ...

  9. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

    Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...

  10. c语言_链表实例讲解(两个经典例子)

    建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. demo1 // lianbiao.cpp : Defines the entry point for the console app ...

随机推荐

  1. 返回头部js

    $('.backTop, .backCss').click(function() { var id=$(this).attr('class'); $('html, body').animate({sc ...

  2. 第36章:MongoDB-集群--Replica Sets(副本集)

    ①副本集 副本集是一种在多台机器同步数据的进程,副本集体提供了数据冗余,扩展了数据可用性.在多台服务器保存数据可以避免因为一台服务器导致的数据丢失.也可以从硬件故障或服务中断解脱出来,利用额外的数据副 ...

  3. JDK源码核心包

    一.核心包有哪些? Jdk的包中,除开了lang包下面的类,用得最多的应该要属于util包下面的类了, 本篇文章主要针对Jdk的util包下面的类(util目录下面的类,暂时不包括util 包下面的子 ...

  4. async/await让你的代码更加优雅

    一. 回调地狱:回调函数里面嵌套着回调函数嵌套着回调函数”,这就是被传说中的“回调地狱callbackHell () { const api = new Api() let user, friends ...

  5. 居于H5的多文件、大文件、多线程上传解决方案

    文件上传在web应用中是比较常见的功能,前段时间做了一个多文件.大文件.多线程文件上传的功能,使用效果还不错,总结分享下. 一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件进行上传: 支 ...

  6. 从MATLAB到FPGA 视频和图像处理——讲座学习小结(视频地址https://ww2.mathworks.cn/videos/from-matlab-to-fpga-video-and-image-processing-102492.html)

    1.HDLcoder产品介绍 图像处理分为两个部分: 这里主要讨论第一部分图像处理部分. 一般产品设计流程如下: 适用人群有以下两类: 这里先用一张slider来进行整体概括: 基于模型的设计的好处— ...

  7. js-运动函数包

    function move(obj, attr, dir, target, endFn) { clearInterval(obj.timer) //  避免全局变量,所以要用oBox.timer di ...

  8. mybatis中使用常量

    mybatis的mapper文件中项要使用常量的话${@类的全称路劲@常量名称}

  9. so静态分析进阶练习——一个CreakeMe的分析思路

    i春秋作家:HAI_ 原文来自:https://bbs.ichunqiu.com/thread-41371-1-1.html 说明 拿到一个CreakeMe,写一个分析思路.CreakMe主要是对.s ...

  10. Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率

    前言 大家好,给大家带来Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率的概述,希望你们喜欢 学习目标 掌握两个插件的安装和使用,能够实现 ...