链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来。

单链表的基本实现:

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语言实现的单链表的更多相关文章

  1. Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序

    直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:

  2. C语言 - 栈和单链表的实现

    单链表:linkList.h linkList.c #ifndef LINKLIST_H_INCLUDE #define LINKLIST_H_INCLUDE #include <Windows ...

  3. C语言版本:单链表的实现(优化版本)

    未优化版本:http://www.cnblogs.com/duwenxing/p/7569376.html slist.h #ifndef __SLIST_H__ #define __SLIST_H_ ...

  4. C语言版本:单链表的实现

    slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...

  5. C语言学习016:单链表

    #include <stdio.h> //定义一个链表,链表是一种递归结构,在定义的时候必须要给结构起一个名字 typedef struct folder{ int level; char ...

  6. c语言实现循环单链表

    //初始化 Node*InitList() { Node*head=(Node*)malloc(sizeof(Node)); head->next=NULL; head->data=-1; ...

  7. C语言实现单链表(带头节点)

    C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node ...

  8. c++学习笔记—单链表基本操作的实现

    用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include  ...

  9. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

随机推荐

  1. Hadoop-2.2.0中文文档——MapReduce 下一代 -——集群配置

    目的 这份文档描写叙述了怎样安装.配置和管理从几个节点到有数千个节点的Hadoop集群. 玩的话,你可能想先在单机上安装.(看单节点配置). 准备 从Apache镜像上下载一个Hadoop的稳定版本号 ...

  2. vs调试 本地IIS

    http://www.cnblogs.com/minesky/p/3389955.html 准备篇-配置IIS环境 网站发布到测试环境或者生产后,经常会出现各种让人解不开的疑问,想调试也调试不了.可以 ...

  3. Android图片压缩

    import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java ...

  4. [GIF] GIF Loop Coder - Introduction

    Introducing the program, GIF Loop Coder, which allows you to make looping animated gifs (and other t ...

  5. WEB网站常见受攻击方式及解决办法

    一个网站建立以后,如果不注意安全方面的问题,很容易被人攻击,下面就讨论一下几种漏洞情况和防止攻击的办法. 一.跨站脚本攻击(XSS) 跨站脚本攻击(XSS,Cross-site scripting)是 ...

  6. hdu1002大数相加

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. iOS之XIB拖拽scrollView

    在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和AutoLayout 结合使用,相对来说有点复杂.根据实践,我说一 ...

  8. 如何使用axis2 构建 Android 服务器后端--- 工具准备与环境配置

    最近一个项目要做个android端的实验室器材管理系统.小伙伴英勇地接下android端的锅,我就 负责给他写后端,最近看到axis2 这个webservice挺好用的,折腾了几天给大家分享下: 1. ...

  9. oracle数据库入门sql语句

    数据库: 命名规范问题 依然是 _流.看来也确实应该抽空 来处理一下 今天吧,不行时间不能浪费.要更加专注.累了 就睡,醒来 就 好好 弄东西.白天 哪怕累一些,强度 大一些,晚上也可以抽空出去.溜溜 ...

  10. C#汉字转拼音首字母

    输入汉字,提取其首字母: /// <summary> /// 汉字转拼音缩写 /// Code By /// 2004-11-30 /// </summary> /// < ...