c语言链表的头节点是什么,C语言初级链表(之有头节点的单向链表)

#define _CRT_SECURE_NO_WARNINGS

#include

#include

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语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include #include ...

java创建节点和单向链表

package datastructure; public class Node { private Object data; private Node next; public Node() { t ...

Linux C 数据结构 ->单向链表<-(~千金散尽还复来~)

之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...

单链表 C++ 实现 - 含虚拟头节点

本文例程下载链接:ListDemo 链表 vs 数组 链表和数组的最大区别在于链表不支持随机访问,不能像数组那样对任意一个(索引)位置的元素进行访问,而需要从头节点开始,一个一个往后访问直到查找到目标 ...

数据结构和算法之单向链表二:获取倒数第K个节点

我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...

C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。

//函数fun功能:用函数指针指向要调用的函数,并进行调用. #include double f1(double x) { return x*x; } double f ...

Java实现单向链表基本功能

一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...

c/c++ 线性表之单向链表

c/c++ 线性表之单向链表 线性表之单向链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,最后一个节点的下一个节点是NULL. 真实的第一个节点是头节点,头节点不存放数据, ...

java 实现单向链表

package cn.com.factroy2; /** * 可以看做是操作链表的工具类,链表的核心结构就是节点的数据结构 * @author wanjn * */ public class Sing ...

随机推荐

深入浅出 Redis client/server交互流程

综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...

开发工程师面试的秘密( 整理自 Export C Programming )

开发工程师面试的秘密 因为打算转战linux平台,所以一直在配置自己喜欢的linux操作系统.同时在看那本,这本书主要是针对ANSI C 介绍的,所以和Linux(Unix ...

loopback 04

数据库相关 关系定义 relationship 定义关系之后的使用 relations: { "images": { "type": "hasMany ...

Sonar+Hudson+Maven构建系列之二:迁移Sonar

摘要:由于昨天在一台机器上安装的东西太多了,导致Linux机器上非常卡,一台Linux负担了jira, fisheye, confluence, sonar, hudson, mysql 等等,本来已 ...

SVN svnserve.conf: Option expected 的解决方法 以及 Authorization failed 的解决方法

① 在 CentOS 6.5 上安装配置了 SVN,在本地 Checkout 的时候报错: 显示:/www/svnroot/webfile/conf/svnserve.conf:12: Option ...

tomcat6-7配置管理用户

tomcat6: <?xml version='1.0' encoding='utf-8'?>  

SpringMVC、SpringMVC XML配置(纯XML方式)

1.引入SrpingMVC所使用的Java包: cglib-nodep-2.1_3.jar.commons-logging.jar.spring-aspects-4.1.7.RELEASE.jar.s ...

python学习笔记之九:模块和包

Python的标准安装包括一组模块,称为标准库.这里介绍模块的工作方式,学习如何使用它们. 一. 模块 1.1 用import从外部模块获取函数并为自己的程序所用: >>> from ...

python基础二(基础数据类型)

一. 引子 1. 什么是数据 x=10,10是我们要存储的数据 2. 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3.数据类型 数字 字符串 列表 元组 字 ...

渐进式Web应用(PWA)入门教程(下)

上篇文章我们对渐进式Web应用(PWA)做了一些基本的介绍. 渐进式Web应用(PWA)入门教程(上) 在这一节中,我们将介绍PWA的原理是什么,它是如何开始工作的. 第一步:使用HTTPS 渐进式W ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值