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。

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

最新文章

  1. 扩展 ASP.NET MVC 模型扩展 &ndash; ASP.NET MVC 4 系列
  2. JAVA List&lt;&gt; 合并去重
  3. 【原】创建Hive表,分号分隔符“;”引起的异常
  4. Android的计量单位px,in,mm,pt,dp,dip,sp
  5. ###《Effective STL》--Chapter2
  6. 关于AFNetworking访问网络超时的设置
  7. UvaLive 6661 Equal Sum Sets (DFS)
  8. QT:给Widget设置背景图片——设置Widget的调色板,调色板使用图片和背景色
  9. grub 学习之路
  10. POJ-2349 Arctic Network---MST的第m长的边
  11. JavaScript第一阶段学习心得
  12. __module__ 和 __class__
  13. I want to learn Android Development, where do I start?
  14. 解决微信小程序要求的TLS版本必须大于等于1.2的问题
  15. 【MOOC EXP】Linux内核分析实验四报告
  16. WCF 学习文摘
  17. Ejb3.0+jboss 8 创建EJB demo
  18. 北京Uber优步司机奖励政策(4月16日)
  19. linux系统安装gcc
  20. yii2 中where条件查询

热门文章

  1. 关于git 命令的一些事
  2. ABP框架系列之三十七:(Navigation-导航)
  3. MVC+EF(CODEFIRST)+EASYUI医药MIS系统
  4. JAVA核心问题(一)反射之引言 构造函数
  5. Http协议和Tomcat服务器
  6. Codeforces Round #539--1113B - Sasha and Magnetic Machines
  7. hadoop2.4.0伪分布式搭建以及分布式关机重启后datanode没起来的解决办法
  8. 简介jsp
  9. Android退出所有Activity最优雅的方式
  10. nginx: [emerg] getpwnam(&quot;nginx&quot;) failed