一、链表中结点的存储
链表的结点左边一部分是存放的数据,右边一部分是后继指针指向下一个结点的地址。C语言中通常定义一个结构体类型来存储一个结点,如下:
struct node
{
int data;
struce node *next; //下一个结点的类型也是struct node,所以后继指针的类型也必须是struct node *
};
二、让我们把结点连起来吧(头插法)
想要把结点一个个串起来,还需要三个struct node *类型的指针:head(头指针,指向链表的开始,方便从头遍历整个链表)、p(临时指针,指向那些还未连接的结点)、q(当前指针,指向当前最新串入的结点)。
当链表还没有建立时,头指针head为空。
struct node *head;
head=NULL; //头指针初始为空
现在我们来创建第一个结点,并用临时指针p指向这个结点。
struct node *p;
p=(struct node *)malloc(sizeof(struct node)); //为新结点动态申请一个空间,并用临时结点p指向这个新地址
scanf("%d",&a); //读取数据
p->data=a; //将数据存储到当前结点的data域中
p->next=NULL; //设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
把新加入的结点串进链表。如果该结点是创建的第一个结点,则将头指针指向这个结点再将当前指针指向这个结点;如果该结点不是第一个,则将上一个结点的后继指针指向该结点再修改当前指针指向这个新结点。
if(head==NULL)
head=p;
else
q->next=p;
q=p; //最后指针q也指向当前结点
三、释放链表
不释放动态申请的空间,代码运行也不会出错,但这样会很不安全。使用free()函数可以释放由malloc()申请的内存空间。
t=head;
u=t;
while(t!=NULL){
u=t->next;//t指向的结点内存空间释放后就不存在t->next这一说了,所以要提前让另一个指针指向t的下一个结点
free(t);
t=u;
}
四、建立链表并遍历输出最后释放内存空间的完整代码
#include
#include
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q,*t,*u;
int i,n,a;
scanf("%d",&n);
head=NULL;
for(i=;i
p=(struct node *)malloc(sizeof(struct node));
scanf("%d",&a);
p->data=a;
p->next=NULL;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
}
//输出链表
t=head;
while(t!=NULL){
printf("%d ",t->data);
t=t->next;
}
//释放链表
t=head;
u=t;
while(t!=NULL){
u=t->next;
free(t);
t=u;
}
return ;
}
c语言 创建链表
#include "malloc.h" #include "stdio.h" #define LEN sizeof(struct student) typede ...
C语言-创建链表及排序
#include #define NEWNODE (Node *)malloc(sizeof(Node)) typedef struct mynode{ int num ...
C语言数据结构-创建链表的四种方法
结点类型: typedef int datatype; typedef struct NODE{ datatype data; struct NODE *next; }Node,*LinkList; ...
用c语言创建双向环形链表
作为一个C开发人员,无论在求职笔试题中,还是在工程项目中,都会遇到用c语言创建双向环形链表.这个也是理解和使用c指针的一项基本功. #include<...>//头文件省略 typedef ...
c语言——单链表分拆——头插法创建链表,尾插法生成链表
#if 1 #include #include #include using namespace std; ...
[数据结构】【c语言】链表的创建和遍历
第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include #includ ...
C语言之链表list
#include #include #include #include
C语言之链表
这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...
C语言单链表实现19个功能完全详解
谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...
随机推荐
MemCache
MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度.Mem ...
topsort | | jzoj[1226] | | NOIP2003神经网络
今天终于通过了那道永远都看不懂题目的神经网络... 所谓拓扑排序,就是在有向无环图中,根据已经有的点和点之间的关系进行排序 引用jzyz教材上的栗子:比如说奶牛比较食量大小,我现在拿到的是cow[i] ...
李洪强-C语言6-控制结构
C语言流程控制 一.流程控制结构 (1)顺序结构:按书写顺序执行每一条语句. (2)选择结构:对给定的条件进行判断,根据判断结果决定执行哪一段代码. (3)循环结构:在给定条件成立的情况下,反复执行某 ...
hdu2817 A sequence of numbers
这题就是判断是等差数列还是等比数列,然后计算结果mod200907 因为数字比较大10的九次方 所以等比用到了快速幂求模 不懂可以看看算法导论,在大数那里有讲 #include
Chapter 1.简单工厂模式
该篇文章通过一个写计算器控制台程序,来导入文章主题. 首先,要注意代码规范,变量命名有意义,不能随意用A,B,C; 功能要封装好,不要写在一个主函数里,另外要考虑后期需求的更改,如果出现多个函数 ...
Log4j2 — Log4j2导入、LogEvent、配置文件编写及路径
1. Log4j2的导入 首先到http://logging.apache.org/log4j/2.x/download.html 上下载最新的log4j2的jar包,然后再eclipse中加入log ...
使用WinForm Chart控件 制作饼装,柱状,折线图
http://blog.csdn.net/dream2050csdn/article/details/53510340 chart控件的属性很多,主要用到Chart控件图表区域的属性有五个属性 1.A ...
python 反射的用法
class Foo(): def __init__(self,name): self.name=name def text(self): f=Foo() ''' hasattr(obj,name) 判 ...
一行js弹窗代码就能设计漂亮的弹窗广告
接到一个设计需求,要求xmyanke在网站右侧挂一个弹窗广告宣传最近的活动,找了半天都没看到合适的,自己鼓捣了一行js弹窗代码就能设计漂亮的弹窗广告,来瞧一下,欢迎拍砖提意见,js弹窗广告代码如下: ...
docker(二)不管怎么样,先跑起来。运行一个samba,运行一个hello world。
---恢复内容开始--- 继续上一篇文章 访问https://hub.docker.com/r/jackadam/samba/ 这是我写的一个docker镜像. 下面有 无脑测试用: docker r ...