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 ...
随机推荐
- Java IO学习笔记
Java流的分类,一般可按以下方式分: 按方向分,分为输入流,输出流. 按类型分,分为字节流和字符流. 2.1字节流是通过字节来读取数据 2.2字符流是通过字符来读取数据 按操作方式分,分为节点流和过 ...
- Linux下crontab命令详解
crontab -e编辑定时任务 * * * shell.sh 从左到右依次是:分钟.小时.天.周.月
- nyoj 202 红黑树
红黑树 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树... 当然,这 ...
- YII中文件上传
文件上传 1.视图文件代码 <?php $form = $this->beginWidget("CActiveForm",array( "action&quo ...
- 万网免费主机wordpress快速建站教程-wordpress下载及安装
进入wordpress官网(http://cn.wordpress.org)下载最新的wordpress安装程序,下载完成后解压到任意电脑目录. 解压完毕后,使用FTP管理工具上传安装文件至主机htd ...
- Asp.net日期字符串格式化显示
我们经常会遇到对时间进行转换,达到不同的显示效果,默认格式为:2006-6-6 14:33:34 如果要换成成200606,06-2006,2006-6-6或更多的格式该怎么办呢?这里将要用到:Dat ...
- 怎么用js代码改变单选框的选中状态
今天突然有一个需求要用到,使用js代码改变单选框的选中状态.当时想也不想直接 function doGender(gender) { if (gender == "男") { ge ...
- ACM——2的n次方
2的N次方 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:1715 测试通过:838 描述 编程精确计算2 ...
- 转载--SQL Server 2005的XQuery介绍
原文地址: http://bbs.51cto.com/thread-458009-1-1.html 引用: 摘要 本文介绍了SQL Server 2005能够支持的XQuery的各方面特性如FLW ...
- sql查询结果集根据指定条件排序的方法
oracle认为 null 最大. 升序排列,默认情况下,null值排后面. 降序排序,默认情况下,null值排前面. 有几种办法改变这种情况: (1)用 nvl 函数或decode 函数 将null ...