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 ...
随机推荐
- 1.关于UltraEdit中的FTP和Tenent配置,UE远程连接Linux进行文件操作
1 安装UltraEdit 2 配置FTP相关的配置 文件àFTP/Tenet(T)à watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3 ...
- java24 手写服务器最终版本
手写服务器最终版本; <?xml version="1.0" encoding="UTF-8"?> <web-app> <serv ...
- 从cmd中进入MySQL的命令界面
两种方式进入mysql命令界面 第一.直接开始界面→搜索mysql客户端登陆界面 第二.从cmd中进入MySQL的命令界面 2010-05-17 10:02:05| 分类: mysql|字号 订阅 ...
- Mac通过以太网共享网络
在日常工作和学习中,需要WiFi热点而没有路由器,这个时候我们可以用我们工作的Mac来共享网络. 系统偏好设置->共享->互联网共享:设置共享来源和共享端口->WiFi选项:设置网络 ...
- [置顶] 读取pdf并且在web页面中显示
读取pdf并且在web页面中显示 if (System.IO.File.Exists(f)) { Response.ContentType = "applicationpdf"; ...
- webform 转 MVC 飞一般的感觉
前言: 浅谈webform与mvc,让开发变得更加简单,这里主要通过比较webform与mvc的开发方式,以下全属个人看法,不完善的地方可以留言补充. 正文: 废话不多说,直接说工作中经常用到的地方 ...
- javaweb常用工具类及配置文件备份
Javaweb常用工具类及配置文件备份 做一个代码备份,以后常用到的. hibernate工具类备份 package com.dly.service; /* * hibernate获取sessi ...
- HeaderViewListAdapter cannot be cast to listAdapter问题原因及解决办法
[o] 在listView中添加leaderView 和footerView的时候要注意在setAdapter之前调用,不然会报如下异常: listAdapter cannot be cast to ...
- hdoj1325 Is It A Tree?
Is It A Tree?题目链接 题意: 多组测试数据, 每组数据有多个数对, 表示一条有向边(即第一个数是第二个数的父节点), 以 0,0 为一组测试数据结束标志.当输入-1,-1时测试结束. 从 ...
- Android开发之ViewPager
什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v ...