C语言实现的单链表
链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来。
单链表的基本实现:
typedef int DataType;
//定义单链表
typedef struct ListNode
{
DataType _data; //数据
struct ListNode * _next; //指向下一个节点的指针
}ListNode;
//初始化
void InitList(ListNode * &pHead)
{
pHead = NULL;
}
//创建节点
ListNode * BuyNode(DataType x)
{
ListNode * tmp = (ListNode *)malloc(sizeof(ListNode));
assert(tmp);
tmp->_data = x;
tmp->_next = NULL;
return tmp;
}
//尾插
void PushBack(ListNode * &pHead, DataType x)
{
if (NULL == pHead) //为空时,表示没有节点,创建新节点
{
pHead = BuyNode(x);
}
else
{
ListNode * tail = pHead;
while (tail->_next != NULL)
{
tail = tail->_next; //令tail指向最后一个节点
}
tail->_next = BuyNode(x);
}
}
//头插
void PushFront(ListNode * &pHead, DataType x)
{
if (NULL == pHead)
{
pHead = BuyNode(x);
}
else
{
ListNode * tmp = BuyNode(x);
tmp->_next = pHead;
pHead = tmp;
}
}
//尾删
void PopBack(ListNode * &pHead) //1.为空 2.一个节点 3,多个节点
{
if (NULL == pHead)
{
printf("List is empty!\n");
return;
}
else if (NULL == pHead->_next)
{
free(pHead);
pHead = NULL;
}
else
{
ListNode * prevtail = NULL, *tail = pHead;
while (tail->_next != NULL)
{
prevtail = tail; //令tail指向尾部,prevtail指向倒数第二个
tail = tail->_next;
}
prevtail->_next = NULL;
free(tail);
}
}
//头删
void PopFront(ListNode * &pHead)
{
if (NULL == pHead) //为空
{
printf("List is empty!\n");
return;
}
else //不为空
{
ListNode* cur = pHead;
pHead = pHead->_next;
free(cur);
}
}
//查找
ListNode * Find(ListNode * pHead, DataType x)
{
ListNode * cur = pHead;
while (cur)
{
if (cur->_data == x)
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
//插入
void Insert(ListNode * &pos, DataType x) //在pos节点后插入
{
assert(pos);
ListNode * tmp = BuyNode(x);
tmp->_next = pos->_next;
pos->_next = tmp;
}
//删除某节点
void Erase(ListNode * &pHead, ListNode * pos)
{
assert(pos);
if (pos == pHead) //当要删除的节点就是第一个时,直接删
{
pHead = pHead->_next;
free(pos);
}
else
{
ListNode * cur = pHead;
while (cur)
{
if (cur->_next == pos)
{
cur->_next = pos->_next;
free(pos);
break;
}
cur = cur->_next;
}
}
}
//删除数据为x的节点
void Remove(ListNode * &pHead, DataType x)
{
if (NULL == pHead)
{
printf("List is empty!\n");
return;
}
else
{
ListNode * ret = Find(pHead, x); //用ret变量指向x所在节点
if (ret)
{
Erase(pHead, ret); //删除此节点
}
}
}
//释放
void DestroyList(ListNode* & pHead)
{
ListNode* cur = pHead;
while (cur)
{
ListNode* tmp = cur;
cur = cur->_next;
free(tmp);
}
pHead = NULL;
}
//打印输出
void PrintList(ListNode * pHead)
{
ListNode * cur = pHead;
while (cur != NULL)
{
printf("%d -> ", cur->_data);
cur = cur->_next;
}
printf("NULL\n");
}
C语言实现的单链表的更多相关文章
- Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序
直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:
- C语言 - 栈和单链表的实现
单链表:linkList.h linkList.c #ifndef LINKLIST_H_INCLUDE #define LINKLIST_H_INCLUDE #include <Windows ...
- C语言版本:单链表的实现(优化版本)
未优化版本:http://www.cnblogs.com/duwenxing/p/7569376.html slist.h #ifndef __SLIST_H__ #define __SLIST_H_ ...
- C语言版本:单链表的实现
slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...
- C语言学习016:单链表
#include <stdio.h> //定义一个链表,链表是一种递归结构,在定义的时候必须要给结构起一个名字 typedef struct folder{ int level; char ...
- c语言实现循环单链表
//初始化 Node*InitList() { Node*head=(Node*)malloc(sizeof(Node)); head->next=NULL; head->data=-1; ...
- C语言实现单链表(带头节点)
C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node ...
- c++学习笔记—单链表基本操作的实现
用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
随机推荐
- HDU 3259 Wormholes
题意:就是给你一个n,m,t n代表有多少个点.m代表有多少个双向的边 t代表的是虫洞.如今要你判读是否还能够穿越到过去的点 虫洞的意思是给你的边是单向的,而且是负权值(输入的时候是正数) 思路 ...
- ajax技术的基本概述
大家都知道ajax并非一种新的技术,而是几种原有技术的结合体.它由下列技术组合而成. 1.使用CSS和XHTML来表示. 2. 使用DOM模型来交互和动态显示. 3.使用XMLHttpRequest来 ...
- 提升资源利用率的MapReduce框架
Hadoop系统提供了MapReduce计算框架的开源实现,像Yahoo!.Facebook.淘宝.中移动.百度.腾讯等公司都在借助 Hadoop进行海量数据处理.Hadoop系统性能不仅取决于任务调 ...
- find命令基本使用一览
find命令相对于locate这种非实时查找的搜索命令,大大增加了我们搜索的便捷度以及准确性:并且能够方便的帮助我们对大文件.特定类型的文件查找与删除,特别是有超多小碎文件的时候,更是方便至极.... ...
- HTML5十五大新特性
HTML5想必大家都很熟悉了.然而,你能准确地说出HTML5带来了哪些新特性吗?本文总结了HTML5带来的15项你必须知道的新特性. 一起来看下: 1.新的文档类型 (New Doctype) 目前 ...
- String类概述
(1)多个字符组成的一串数据. 其实它可以和字符数组进行相互转换. (2)构造方法: A:public String() B:public String ...
- Eclipes中使用BASE64Encoder及BASE64Decoder报错
也没有提示让导包,这是因为Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder/BASE64Deco ...
- DotNet Core 之旅(一)
1.下载安装 DotNetCore.1.0.0-SDK.Preview2-x64.exe 下载链接:https://www.microsoft.com/net/download ps:如果有vs201 ...
- MVC小系列(十六)【在控制器级别或具体Action级别上动态设定模板页(Layout)】
方法就是使用:ActionFilterAttribute它的几个方法:OnActionExecuted,OnActionExecuting,OnResultExecuted和OnResultExecu ...
- WPF:保存窗口当前状态截图方法
在制作软件使用手册或者操作示范市,比较常用方式有截图和视频制作.如果软件内置当前状态的截图和操作视频的导出功能,则将极大简化这方面的工作.使用wpf编写的UI界面,截图的导出功能逻辑相对简单,通用的实 ...