C语言初级链表(之有头节点的单向链表)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}SLIST; //创建链表
SLIST *Slist_create()
{
SLIST *pHead, *pM, *pCur; //申请链表的辅助指针变量
int data; //数据域的接收 //创建头节点并初始化
pHead = (SLIST *)malloc(sizeof(SLIST));
if (NULL == pHead)
return NULL;
pHead->data = ;
pHead->next = NULL; //提示输入内容
printf("plz input the data \n");
scanf("%d", &data); //对当前结点进行定位
pCur = pHead; //循环创建业务节点
while (data != -)
{
//创建业务节点实际操作、然后初始化
pM = ((SLIST *)malloc(sizeof(SLIST)));
if (NULL == pM)
return NULL;
pM->data = data;
pM->next = NULL; //业务节点入链表
pCur->next = pM; //当前节点下移
pCur = pM; //提示输入内容
printf("plz input the data \n");
scanf("%d", &data); } return pHead;
} //打印链表
int Slist_printf(SLIST *pHead) //形参接收头节点地址
{
SLIST *tap = NULL; //创建临时指针变量
if (NULL == pHead)
return -; //临时指针变量初始化 :第一个节点
tap = pHead->next; printf("\nSTART\n");
while (tap)
{
//打印当前结点数据域的内容
printf("%d ", tap->data); //临时指针变量下移
tap = tap->next;
}
printf("END\n");
return ;
} //在链表中某一位置插入元素
int Slist_NodeInsert(SLIST *pHead, int x, int y)
{
//创建辅助指针变量
SLIST *pPre, *pCur, *pM; //前驱结点初始化
pPre = pHead;
//当前结点初始化
pCur = pHead->next;
//创建插入节点
pM = (SLIST *)malloc(sizeof(SLIST));
//插入节点初始化
pM->next = NULL;
//数据域为要插入的值
pM->data = y;
//遍历链表
while (pCur)
{
//判断元素节点,如果是跳出循环
if (pCur->data == x)
break;
//指针下移
pPre = pCur;
pCur = pCur->next; }
//插入节点入链表:分为两种情况,①找到要插入的节点插入在当前位置②未找到要插入的节点,插入在链表尾部
pM->next = pPre->next;
pPre->next = pM;
return ;
} //删除链表节点
int Slist_NodeDel(SLIST *pHead, int y)
{
//创建辅助指针变量
SLIST *pPre, *pCur;
//指针变量初始化
pPre = pHead;
pCur = pHead->next; //遍历链表
while (pCur)
{
//判断是否找到要删除的链表节点;如果是则跳出循环
if (pCur->data == y)
break; //指针下移
pPre = pCur;
pCur = pCur->next;
}
//判断是否找到要删除的链表节点:未找到
if (pCur == NULL)
{
printf("未找到要删除的节点\n");
return -;
}
//找到要删除的链表节点
pPre->next = pCur->next;
//这段判断语句的作用是:判断链表是否存在
if (pPre == NULL)
free(pCur); //释放当前节点内存(即要删除节点的内存)
return ;
} //链表逆置
int Slist_Reverse(SLIST *pHead)
{
//创建指针变量
SLIST *pPre, *pCur, *tap;
//判断是否需要逆置:(当链表元素>=2时才可以逆置)
if (pHead == NULL || pHead->next == NULL || pHead->next->next == NULL)
return -;
//初始化指针变量
pPre = pHead->next;
pCur = pHead->next->next;
//遍历链表
while (pCur)
{
//缓存当前结点的指针域
tap = pCur->next;
//对当前结点的指针域重新赋值为前驱结点; 即逆置
pCur->next = pPre; //(这里有做错:写成pCur->next = pPre-next)
//指针下移
pPre = pCur;
pCur = tap;
} //对头节点和第一个元素的指针域进行处理
pHead->next->next = NULL;
pHead->next = pPre; return ;
} //销毁链表
int Slist_Destory(SLIST *pHead)
{
//创建辅助指针变量
SLIST *tap; //判断链表是否存在
if (pHead == NULL)
return -;
//遍历链表
while (pHead)
{
//缓存当前节点的指针域
tap = pHead->next;
//释放当前结点
free(pHead);
//指针下移
pHead = tap;
}
return ;
} int main(void)
{
int ret = ;
SLIST *pHead = NULL; //创建链表
pHead = Slist_create();
ret = Slist_printf(pHead);
//给链表中插入元素
ret = Slist_NodeInsert(pHead, , );
ret = Slist_printf(pHead);
//删除链表中某个元素
ret = Slist_NodeDel(pHead, );
ret = Slist_printf(pHead);
//重置链表中的元素
ret = Slist_Reverse(pHead);
ret = Slist_printf(pHead);
//销毁链表
ret = Slist_Destory(pHead); return ; }
1.结构体的基本特点:(结构体中可以嵌套一个别的结构体; ..........可以嵌套一个别的结构体指针)
(结构体中不可以嵌套一个自身类型的结构体(原因:确定不了结构体的内存大小);
..........可以嵌套一个指向自身类型的指针(原因:不同类型的指针在同一操作平台下所占内存相同,有确定值)
2.数据类型的本质:固定大小的内存块别名。
3.链表的基础特点:(结构体; 两个域:数据域、指针域; 引用自身的结构体; 特点:非线性存储)
4.链表编程关键两点:
1)指针指向谁,就把谁的地址赋给指针
2)辅助指针变量&操作逻辑的关系(辅助指针:pHead(头节点) pPre(前驱结点) pCur(当前结点) pM(业务节点))
=========================================================
此段代码刚开始是: 两个文件.C 和 一个.h文件,传代码由于不方便放到一个.C文件。
编写这段代码时,最难理解的是辅助节点的建立和移动。
编写错误的:167 pCur->next = pPre;(正确写法)
pCur->next = pPre->next;(错误写法:这种写法造成对第二元素的循环打印,死循环。)
63 if (NULL == pHead);(正确写法)
if (NULL == tap); (错误写法:这种写法造成程序崩溃;)。
C语言初级链表(之有头节点的单向链表)的更多相关文章
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...
- java创建节点和单向链表
package datastructure; public class Node { private Object data; private Node next; public Node() { t ...
- Linux C 数据结构 ->单向链表<-(~千金散尽还复来~)
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- Linux C 数据结构 ->单向链表
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- 单链表 C++ 实现 - 含虚拟头节点
本文例程下载链接:ListDemo 链表 vs 数组 链表和数组的最大区别在于链表不支持随机访问,不能像数组那样对任意一个(索引)位置的元素进行访问,而需要从头节点开始,一个一个往后访问直到查找到目标 ...
- 数据结构和算法之单向链表二:获取倒数第K个节点
我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...
- C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。
//函数fun功能:用函数指针指向要调用的函数,并进行调用. #include <stdio.h> double f1(double x) { return x*x; } double f ...
- Java实现单向链表基本功能
一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...
- c/c++ 线性表之单向链表
c/c++ 线性表之单向链表 线性表之单向链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,最后一个节点的下一个节点是NULL. 真实的第一个节点是头节点,头节点不存放数据, ...
随机推荐
- 中间件和auth模块
中间件 1.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用 ...
- mybatis批量update,返回行数为-1
mybatis批量更新返回结果为-1,是由于mybatis的defaultExExecutorType引起的, 它有三个执行器:SIMPLE 就是普通的执行器:REUSE 执行器会重用预处理语句 ...
- 十二. 网络与数据库编程1.IP地址和InetAddress类
Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TC ...
- 【docker】解决docker pull镜像 拉取镜像龟速的问题,docker拉取镜像使用阿里云docker镜像加速器
在docker拉取mysql镜像过程中,出现龟速的问题,解决这个问题的方法: 这个页面 停留了好久好久,依旧没有下载完成. 碰上这种情况 1.先退出Ctrl+C 2.在浏览器上进入阿里云docker库 ...
- 【java】实体类中 Set<对象> 按照对象的某个字段对set排序
背景: User实体类 有个属性是 Set<PositionChange> 职位变更字段 如下: PositionChange实体类 有个属性是positionStartDate 什 ...
- 性能问题: SQL*Net message from client 等待时间太长
今天我终于自己遇到了这个问题, PO form 打不开了, 看了下 trace 发现 SQL*Net message from client 等待时间太长. 但是这不可能是网络问题, 这个环境是在我电 ...
- MVC工作原理
MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller) ...
- NHibernate中几个集合的选择
NHibernate是从Hibernate移植过来的基于NET平台的一个ORM框架,同时跟这框架一起的还有一个开源库,叫做Iesi.Collections,这个库扩展了NET平台下面的几个集合,所谓集 ...
- 转: RSA原理 阮一峰的博客
转:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 讲的非常细致,易懂.
- Boost.Asio c++ 网络编程翻译(21)
同步VS异步 Boost.Asio的作者做了一个非常惊艳的工作:它能够让你在同步和异步中自由选择,从而更好的适应你的应用. 在之前的章节中,我们学习了每种类型应用的框架,比方同步client,同步服务 ...