[C语言]数据结构之单链表

数据结构 单链表 C语言实现 单链表 单链表 顺序存储线性表 分配方式 分散存储 集中存储 时间性能 查找O(n) 插入删除O(1) 查找O(1) 插入删除O(n) 空间性能 无需分配空间,元素可以无限扩充 分配空间,元素个数有限 c语言代码实现(单链表) // // main.c // 线性表链式存储结构 // // Created by Kinble Wu on 2020/3/2. /... 阅读详情

简介

本文将实现单链表的基础接口功能
1.初始化/销毁
2.增删改查
头文件.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
typedef int SLDataType;
typedef struct SListNode{
	SLDataType data;
	struct SListNode *next;
} SListNode;

typedef struct SList{
	 struct SListNode *first;//first{? , next}
}SList;

//接口
//初始化/销毁
void SListInit(SList *list);
void SListDestroy(SList *list);
//增/删/查/改
//头插
void SListPushFront(SList *list, SLDataType data);
//头删
void SListPopFront(SList *list);

//尾插
void SListPushBack(SList *list, SLDataType data);
//尾删
void SListPopBack(SList *list);

//查找
SListNode *SListFind(SList *list, SLDataType data);

//在pos结点后面插入
void SListInsertAfter(SListNode *pos, SLDataType data);

//删除pos结点后面的结点
void SListEraseAfter(SListNode *pos);

//删除第一个遇到的data结点
void SListRemove(SList *list, SLDataType data);

//打印
void SListPrint(SList *list);

函数实现部分SList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

void SListInit(SList *list)
{
	 assert(list != NULL);
	 list->first = NULL;
}

void SListDestroy(SList *list)
 {
	  SListNode *next;
	  for (SListNode *cur = list->first; cur != NULL; cur = next){
		   next = cur->next;
		   free(cur);
	  }
	  list->first = NULL;
 }

//创建空间
SListNode *BuySListNode(SLDataType data)
{
	 //然后创建一个结点
	 SListNode *node = (SListNode *)malloc(sizeof(SListNode));
	 assert(node != NULL);
	 //赋值
	 node->data = data;
	 node->next = NULL;
	 return node;
}

//头插
void SListPushFront(SList *list, SLDataType data)
{
	 assert(list != NULL);
	 //1.Node 空间
	 //SListNode *node = (SListNode *)malloc(sizeof(SListNode));
	 //assert(node);
	 ////2.赋值
	 //node->data = data;
	 //3.新的第一个结点的下一个结点就是原来的第一个结点
	 SListNode *node = BuySListNode(data);
	 node->next = list->first;
	 //4.记录新的第一个结点
	 list->first = node;
}

//头删
void SListPopFront(SList *list)
{
	 assert(list != NULL); //没有链表
	 assert(list->first != NULL);//有链表但是链表是空的,排除一开始一个结点都没有
	 SListNode *old_first = list->first;
	 list->first = list->first->next;
	 free(old_first);
}

//尾插
void SListPushBack(SList *list, SLDataType data)
{
	 //没有链表
	 assert(list != NULL);
	 //链表为空的情况就是头插
	 if (list->first == NULL){
		  SListPushFront(list, data);
		  //头插完记得返回
		  return;
	 }
	 //先找出最后一个结点
	 SListNode *cur = list->first;
	 for (; cur->next != NULL; cur = cur->next){
	 }
	 ////然后创建一个结点
	 //SListNode *node = (SListNode *)malloc(sizeof(SListNode));
	 //assert(node != NULL);
	 ////赋值
	 //node->data = data;
	 //node->next = NULL;
	 SListNode *node = BuySListNode(data);
	 cur->next = node;
}

//尾删
void SListPopBack(SList *list)
{
	 assert(list != NULL);
	 //链表为空
	 assert(list->first != NULL);
	 //链表只有一个结点就用头删
	 if (list->first->next == NULL){
		  SListPopFront(list);
		  return;
	 }
	 //找到倒数第二个结点
	 SListNode *cur = list->first;
	 for (; cur->next->next != NULL; cur = cur->next){
	 }
	 //先释放,再指向空
	 free(cur->next);
	 cur->next = NULL;
}

//查找
SListNode *SListFind(SList *list, SLDataType data)
{
	 for (SListNode *cur = list->first; cur != NULL; cur = cur->next){
		  if (cur->data == data){
		  	 return cur;
		  }
	 }
	 return NULL;
}

//在pos结点后面插入
void SListInsertAfter(SListNode *pos, SLDataType data)
{
	 assert(pos != NULL);
	 /*SListNode *node = (SListNode*)malloc(sizeof(SListNode));
	 node->data = data;*/
	 SListNode *node = BuySListNode(data);
	 node->next = pos->next;
	 pos->next = node;
}

//删除pos结点后边的结点
void SListEraseAfter(SListNode *pos)
{
	 assert(pos != NULL);
	 SListNode *next = pos->next->next;
	 free(pos->next);
	 pos->next = next;
}

//删除第一个遇到的data结点
void SListRemove(SList *list, SLDataType data)
{
	 assert(list != NULL);
	 assert(list->first != NULL);
	 SListNode *cur = list->first;
	 SListNode *prev = NULL;
	 while (cur != NULL && cur->data != data){
		  prev = cur;
		  cur = cur->next;
	 }
	 if (cur == NULL){
	 	 return;
	 } 
	 //如果prev为空就头删即可
	 if (prev == NULL){
		  SListPopFront(list);
		  return;//删完一定要记得返回,不然就执行到下面去了
	 }
	 prev->next = cur->next;
	 free(cur);
}

//打印
void SListPrint(SList *list)
{
	 for (SListNode *cur = list->first; cur != NULL; cur = cur->next)
	 {
	 	 printf("%d-->", cur->data);
	 }
	 printf("NULL\n");
}

测试部分test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"
#include<stdio.h>
#include<stdlib.h>
void Test1()
{
	 SList list;
	 SListInit(&list);
	
	 SListPushFront(&list, 4);
	 SListPushFront(&list, 3);
	 SListPushFront(&list, 2);
	 SListPushFront(&list, 1);
	 SListPrint(&list);
	
	 SListPopFront(&list);
	 SListPopFront(&list);
	 SListPrint(&list);
	
	 SListPushBack(&list, 5);
	 SListPushBack(&list, 6);
	 SListPushBack(&list, 7);
	 SListPushBack(&list, 8);
	 SListPrint(&list);
	
	 SListPopBack(&list);
	 SListPopBack(&list);
	 SListPrint(&list);
}

void Test2()
{
	 SList list;
	 SListInit(&list);
	
	 SListPushFront(&list, 4);
	 SListPushFront(&list, 3);
	 SListPushFront(&list, 2);
	 SListPushFront(&list, 1);
	 SListPrint(&list);
	 //printf("%p\n",SListFind(&list,8));
	
	 SListNode *n1 = SListFind(&list, 3);
	 //SListInsertAfter(n1, 9);
	 SListEraseAfter(n1);
	 SListPrint(&list);
}

void Test3()
{
	 SList list;
	 SListInit(&list);
	 SListPushFront(&list, 4);
	 SListPushFront(&list, 3);
	 SListPushFront(&list, 2);
	 SListPushFront(&list, 1);
	 SListPrint(&list);
	
	 SListRemove(&list, 3);
	 SListRemove(&list, 1);
	 SListPrint(&list);
}

void main()
{
	 //Test1();
	 //Test2();
	 Test3();
	 system("pause");
}
数据结构(C语言)-- 单链表 文章目录前言一、要学什么、掌握什么二、深入了解1.数据构成2.头指针、头结点、首元结点二、深入了解二、深入了解二、深入了解总结 前言 链表,别名链式存储结构或单链表,用于存储逻辑关系为 “一对一” 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。 一、要学什么、掌握什么 1. 熟练掌握线性表的基本操作在链式存储结构上的实现 2. 掌握单链表的建立、插入、删除等基本操作; 二、深入了解 1.数据构成 数据域:存放数据本身的信息。 指针域: 阅读详情

相关推荐

数据结构——单链表原地逆置(C语言)

单链表原地逆置 #include<stdio.h> #include<stdlib.h> #define MAXSIZE 10010 #define ElemType int typedef struct LNode{ ElemType data; LNode *next; }LNode,*LinkList; //创建 LinkList initLinkList(int num){ LNode* head=(LNode *)malloc(sizeof(LN.

Melody_my的博客 1624

1.从键盘输入10个整数放入链表,要求链表中的元素与输入顺序一致,然后输出该链表2、随机生成100个随机整数并放入一个链表中,要求链表中的元素按从小到大顺序排列,然后输出该链表。

1.从键盘输入10个整数放入链表,要求链表中的元素与输入顺序一致,然后输出该链表 2、随机生成100个随机整数并放入一个链表中,要求链表中的元素按从小到大顺序排列,然后输出该链表。

weixin_57259781的博客 1314

单链表的结点插入C语言c语言数据结构

单链表的结点插入C语言数据结构 基本上每句都有注释 #include<stdio.h> #include<stdlib.h> #define NULL 0 //定义结点结构体类型 typedef struct LNode{ int data; //定义数据域 struct LNode * next; //定义指针域 }LNode,*LinkList; //声明函数 LinkList InitList(LinkList &L); LinkList GreatL

qq_44208167的博客 1526

C语言详写单链表

C语言详细完成单链表,精确到每个函数

m0_66676384的博客 994

单链表的取值 数据结构C语言

单链表的取值 数据结构C语言 基本上每条语句都有注释,若有困惑,欢迎留言!博主会尽快回复 #include<stdio.h> #include<stdlib.h> //定义宏常量 #define NULL 0 //定义链表的存储结构 typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; //声明函数 LinkList InitList(LinkList &L); LinkList

qq_44208167的博客 2187

王道数据结构实践代码----单链表的实现(C语言版)

王道数据结构实践代码----单链表的实现(C语言版) 前言 日期:2021年8月26日 书籍:王道2021年数据结构考研复习指导 代码内容:实现单链表的实现,包括初始化,插入新元素,删除新元素,输出,查询 代码难点 1.C语言的指针和C++的引用转换 … 指针我太阳你个** 简而言之,王道书上的单链表声明和初始化是以C++为模板的,C语言无法直接使用,需要做一定的转换,介于我指针学的也不是很好,就不说这中间的转换过程和原理了,日后有闲暇了再慢慢研究 2.头插法和尾插法的区别,带头指针和不带头指针的区别

繁臻的小窝 4096

【数据结构】【C语言】------ 单链表

前言 大家好,我是Abert。 这篇文章和大家分享用C语言实现数据结构中的单链表。 单链表可以看作是“拆分开”的顺序表。在顺序表的基础上,单链表做了一些优化,但同时也丧失了一些顺序表有的功能。 我们一起来学习单链表吧!!! 文章目录 一、单链表的讲解 二、程序基本框架的搭建与讲解 2.1 文件的创建 2.2 变量的创建 三、各种功能的实现及逻辑关系的讲解 3.1 尾插 3.2 头插 3.3 尾删 ...

m0_63601181的博客 4500

数据结构创建单链表(c语言)

数据结构单链表的创建以及基本操作(c语言)

along_5_13的博客 4804

数据结构之单链表(c语言附完整代码)

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。声明单链表//数据域 struct LNode * next;//指针域,指向后继结点 } LinkNode;//声明单链表结点类型注意:本文章讨论的单链表是带头结点的单链表。

m0_62795460的博客 1万+

数据结构(C语言版)头文件

数据结构(C语言版)头文件....包含链表 顺序表 堆栈 队列 树等等

EndNote全文检索实战:如何快速配置学校图书馆资源并精准查找文献

本文详细介绍了EndNote全文检索功能的实战配置方法,核心在于通过正确设置OpenURL链接解析器,无缝对接学校图书馆资源,实现一键精准获取文献全文。文章提供了从理解机制、四步配置法到进阶技巧的完整指南,帮助科研人员高效管理海量PDF,构建个人知识体系,大幅提升文献调研与写作效率。

weixin_29228781的博客 278

【 数据结构 】单链表的实现 - 详解(C语言版)

前言 简单用C语言来描述数据结构中的单链表,本文实现的只是简单的无头单链表,包括单链表的增加数据,删除数据,查找指定数据,修改指定数据,也就是简单的增删查改等操作。

上上谦. 的博客 1万+

【C++】POCO学习总结(六):线程、线程池、同步

Poco::RunnableAdapter继承自Poco::Runnable,在Poco::RunnableAdapter构造函数中指定了类和方法;Poco::ThreadLocal是线程局部变量,也叫线程局部存储,意思是模版ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。

郭老二 5098

数据结构C语言 单链表(插入、删除、查找)

数据结构C语言 单链表(插入、删除、查找) 1、插入 假设_A_的临时指针为 “p” ,C_的临时指针为 “q“。 步骤1: _ 删除这条连接线; 步骤2: 将p->next给q->next; 步骤3: 将q给p->next; 插入代码 q->next = p->next; p->next = q; 2、删除 假设_A_的临时指针为 “p” ,_B_的临时指针为 “q“。 步骤1: 删除这条连接线; 步骤2: 删除这条连接线; 步骤3: 将p->next给q,接着

更多资料私我 7497

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 346

Amesim基础篇-元件详解-流体库管路

Amesim基础篇-元件详解-流体库管路

2201_75375391的博客 4519

C语言 数据结构之循环单链表

循环单链表的操作及代码 操作有:定义、添加(头插法、尾插法)、删除、遍历链表

haungxinhui的博客 1479

USLE模型(1.2):LS因子的计算

基于USLE的甘南川西北土壤侵蚀研究。准备好30米分辨率的dem。

所有专家都曾始于新手 3481

C语言数据结构学习:单链表

C语言数据结构学习:单链表

L_Z_J_I的博客 977

【WorkBuddy专栏32】从「分文件夹」到「组队打仗」——WorkBuddy v5.0项目模式深度拆解

【WorkBuddy专栏32】从「分文件夹」到「组队打仗」——WorkBuddy v5.0项目模式深度拆解

AI人人懂 296

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构——创建一个带头节点的单链表(C语言)

基础的单链表的构建,以及前插法、后插法在输入数据时的应用。还有一些细小的不同引发的非法访问及其解决方法。

weixin_73849400的博客 7391

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C语言】数据结构——无头单链表实例探究

单链表是一种常见的数据结构,由一系列节点依次连接形成。数据信息和指向下一个节点的指针。单链表的第一个节点称为头节点,最后一个节点没有下一个节点,其指针指向空。类似于火车,火车头连接后一个车厢,再由后面的车厢依次连接。

qq_64818885的博客 1776

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

单链表数据结构代码(C语言)

利用单链表数据结构实现一组数据的存储,通过简单的交互实现单链表的增删改查。 //ADT 线性表(List) 链式存储结构 LinkList #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; //定义单链表 typedef struct Node {

m0_51512094的博客 2693

C语言数据结构(3)——线性表其二(单链表)

欢迎来到博主的专栏——C语言数据结构博主id:代码小豪。

2301_77239666的博客 1243
上一篇: [C语言]数据结构之顺序表
下一篇: [C语言]数据结构之双向链表
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值