一、链表中结点的存储

链表的结点左边一部分是存放的数据,右边一部分是后继指针指向下一个结点的地址。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 <stdio.h>
#include <stdlib.h>
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<n;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语言创建链表的更多相关文章

  1. c语言 创建链表

    #include "malloc.h" #include "stdio.h" #define LEN sizeof(struct student) typede ...

  2. C语言-创建链表及排序

    #include <stdio.h> #define NEWNODE (Node *)malloc(sizeof(Node)) typedef struct mynode{ int num ...

  3. C语言数据结构-创建链表的四种方法

    结点类型: typedef int datatype; typedef struct NODE{ datatype data; struct NODE *next; }Node,*LinkList; ...

  4. 用c语言创建双向环形链表

    作为一个C开发人员,无论在求职笔试题中,还是在工程项目中,都会遇到用c语言创建双向环形链表.这个也是理解和使用c指针的一项基本功. #include<...>//头文件省略 typedef ...

  5. c语言——单链表分拆——头插法创建链表,尾插法生成链表

    #if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...

  6. [数据结构】【c语言】链表的创建和遍历

    第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...

  7. C语言之链表list

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

  8. C语言之链表

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

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

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

随机推荐

  1. APS助众生药业突破运营管理瓶颈

    众生药业一直致力于为了世界提供世界级的产品及服务,成立以来公司先后实施了ERP系统,CRM系统,WMS系统,OA系统,精益生产,朝着行业信息化水平领先的目标迈进. 但近年随着业务量的不断扩大,仅仅拥有 ...

  2. Python之虚拟环境

    场景:本地开发环境使用不同版本的包进行不同项目开发 总结:Linux通过配置环境变量来进行虚拟环境的切换,而Windows要通过虚拟环境目录下的Scripts的activate和deactivate进 ...

  3. JMETER 生成测试报告

    JMETER测试报告样例 JMETER 提供的生成测试报告功能,能够生成漂亮的HTML测试报告. 上图是测试统计图 20个用户并发,测试时长一分钟,发起流程320次,没有出错,TPS为6.5,平均发起 ...

  4. <pre> 保留文本格式显示在网页上

    <code> 标签 解释:保留输入的格式空格等不变,原样显示在网页上 例如: <pre> 通知 即日起不再提供公共设施 个店铺需自行准备. 望周知~!! 2020/10/10 ...

  5. Nginx 反向代理功能-动静分离

    Nginx 反向代理功能-动静分离 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. IDEA中常用的一些设置

    一.idea常用设置1.报错级别    idea默认不会像eclipse一样需要ctrl+s进行保存,并且在保存时会进行编译(可以在File>Settings>Build,Executio ...

  7. Python 模块B

    包 ​ 包可以把一个模块分成多个文件同样的导入方式即可,用了包之后导入方式不变,使用者感觉不到变化.包其实是一个文件夹(必须得含有__init__.py 这个文件) ​ 导包就是导入init ​ 包的 ...

  8. C# XML封装

    /************************************************* * 描述: * * Author:yuanshuo@healthcare.cn * Date:20 ...

  9. 【Matplotlib】使用速记

    [持续更新] pyplot matplotlib.pyplot is a state-based interface to matplotlib. It provides a MATLAB-like ...

  10. Mybatis集成ehcache

    Mybatis集成ehcache 1.为什么需要缓存 拉高程序的性能 2. 什么样的数据需要缓存 很少被修改或根本不改的数据 业务场景比如:耗时较高的统计分析sql.电话账单查询sql等 3. ehc ...