C语言创建链表
一、链表中结点的存储
链表的结点左边一部分是存放的数据,右边一部分是后继指针指向下一个结点的地址。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语言创建链表的更多相关文章
- c语言 创建链表
#include "malloc.h" #include "stdio.h" #define LEN sizeof(struct student) typede ...
- C语言-创建链表及排序
#include <stdio.h> #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<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...
- [数据结构】【c语言】链表的创建和遍历
第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...
- C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- C语言之链表
这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...
- C语言单链表实现19个功能完全详解
谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...
随机推荐
- 英语dialogite红纹石dialogite菱锰矿
红纹石又称菱锰矿(dialogite)属于三方晶系.晶体呈菱面体,通常呈粒状.块状或结核状.玫瑰色,容易氧化而转变成褐黑色.玻璃光泽.解理平行菱面体{1011}完全.硬度3.5-4.5.比重3.6-3 ...
- Direct Access to Video Encoding and Decoding
来源:http://asciiwwdc.com/2014/sessions/513 Direct Access to Video Encoding and Decoding Session 5 ...
- JAVA类与类之间的关系及代码示例
参考链接:https://blog.csdn.net/wq6ylg08/article/details/81092056
- 201871010112-梁丽珍《面向对象程序设计(java)》第四周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...
- 201671010402-陈靖 实验十四 团队项目评审&课程学习总结
项目 内容 任课教师博客主页链接 https://www.cnblogs.com/nwnu-daizh/ 作业要求链接地址 https://www.cnblogs.com/nwnu-daizh/p/1 ...
- linux 以导入文件形式添加定时任务(crontab)时需要注意的坑
在实际操作过程中发现,使用导入文件形式添加定时任务时,会将用户已有的定时任务全部覆盖清理(先清空,再重新导入),所以在使用文件导入定时任务时,需要先将已有定时任务导出,然后将新任务进行追加到已有定时任 ...
- MongoDB在windows及linux环境下安装
linux下安装配置 整理中... windows下安装配置 1.下载: https://www.mongodb.com/download-center?jmp=nav 2.解压到D盘 3.D:\下创 ...
- ES6学习笔记 -- 尾调用优化
什么是尾调用? 尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数. function f(x) { return g(x) } 如上,函数 f 的最后一 ...
- java生成前端验证码+验证「kaptcha」
1.前言 kaptcha是一个非常实用的短信验证码生成工具,通过简单配置即可实现多样化的验证码. 2.引入依赖 <!--第三方验证码--><dependency> < ...
- 【librosa】及其在音频处理中的应用
[持续更新] display specshow(data[, x_coords, y_coords, x_axis, …]) Display a spectrogram/chromagram/cqt/ ...