#ifndef _CONST_H_
#define _CONST_H_

#include <stdio.h>
#include <stdlib.h>

typedef enum
{
  False = 0,
  True,
}Bool;

typedef int ElemType;

#define QUEUE_MAX_SIZE 10

#define STACK_INIT_SIZE 10
#define STACK_INCREMENT_SIZE 2

#define Null ((void *)0)

typedef enum
{
  NORMAL = 0,
  ERROR,
  UNDERFLOW,
  OVERFLOW,
  STATUSCOUNT,
}Status;

#endif

#ifndef _LINKED_TABLE_H_
#define _LINKED_TABLE_H_

#include "Const.h"

typedef struct linkednode
{
  ElemType data;
  struct linkednode *pNext;
  struct linkednode *pPrev;
}LinkedNode, *pLinkedNode;

pLinkedNode InitLinkedTable();

Bool IsLinkedTableEmpty(pLinkedNode pLN);

Status AddNodeInHead(pLinkedNode pLN, ElemType elem);

Status AddNodeInTail(pLinkedNode pLN, ElemType elem);

void TraverseLinkedTable(pLinkedNode pLN);

void DestoryLinkedTable(pLinkedNode pLN);

int GetLinkedTableLength(pLinkedNode pLN);

void RemoveElemInLinkedTable(pLinkedNode pLN, ElemType elem);

#endif

#include "LinkedTable.h"

pLinkedNode InitLinkedTable()
{
  pLinkedNode pLN = (pLinkedNode)malloc(sizeof(LinkedNode));
  if (pLN == Null)
  {
    printf("No accessable free memeory.\n");
    return Null;
  }
  //data in head node is used to store linked table data count
  pLN->data = 0;
  pLN->pNext = Null;
  return pLN;
}

Bool IsLinkedTableEmpty(pLinkedNode pLN)
{
pLinkedNode pHead = pLN;
if (pHead->pNext == Null)
{
return True;
}
else
{
return False;
}
}

Status AddNodeInHead(pLinkedNode pLN, ElemType elem)
{
//printf("In Function AddNodeInHead.\n");
pLinkedNode pHead = pLN;
pLinkedNode pTempNode = (pLinkedNode)malloc(sizeof(LinkedNode));
if (pTempNode == Null)
{
printf("Can not add the node for no accessable free memory.\n");
return ERROR;
}
pTempNode->data = elem;
pTempNode->pNext = pHead->pNext;

pHead->data += 1;
pHead->pNext = pTempNode;

return NORMAL;
}

Status AddNodeInTail(pLinkedNode pLN, ElemType elem)
{
//printf("In Function AddNodeInTail.\n");
pLinkedNode pHead = pLN;
pLinkedNode pTempNode = (pLinkedNode)malloc(sizeof(LinkedNode));
if (pTempNode == Null)
{
printf("Can not add the node for no accessable free memory.\n");
return ERROR;
}
pHead->data += 1;
if (IsLinkedTableEmpty(pHead))
{
pHead->pNext = pTempNode;
}
else
{
pLinkedNode pTemp = pHead;
while (pTemp->pNext != Null)
{
pTemp = pTemp->pNext;
}
pTemp->pNext = pTempNode;
}
pTempNode->data = elem;
pTempNode->pNext = Null;

return NORMAL;
}

void TraverseLinkedTable(pLinkedNode pLN)
{
if(IsLinkedTableEmpty(pLN))
{
printf("The Linked Table Is Empty.\n");
}
else
{
pLinkedNode pHead = pLN;
pLinkedNode pTemp = pHead->pNext;
while(pTemp != Null)
{
printf("Value: %d\n", pTemp->data);
pTemp = pTemp->pNext;
}
}
}

void DestoryLinkedTable(pLinkedNode pLN)
{
if(IsLinkedTableEmpty(pLN))
{
printf("The Linked Table Is Empty.\n");
free(pLN);
}
else
{
pLinkedNode pHead = pLN;
pLinkedNode q;
pLinkedNode pTemp = pHead;
while(pTemp != Null)
{
q = pTemp->pNext;
free(pTemp);
pTemp = q;
}
}
}

int GetLinkedTableLength(pLinkedNode pLN)
{
return pLN->data;
}

void SortLinkedTable(pLinkedNode pLN)
{

}

void RemoveElemInLinkedTable(pLinkedNode pLN, ElemType elem)
{
if (IsLinkedTableEmpty(pLN))
{
printf("The Linked Table Is Empty.\n");
}
else
{
Bool hasTargetNode = False;
pLinkedNode pHead = pLN;
pLinkedNode pTemp = pHead;
while(pTemp->pNext != Null)
{
if (pTemp->pNext->data == elem)
{
hasTargetNode = True;
pTemp->pNext = pTemp->pNext->pNext;
}
else
{
pTemp = pTemp->pNext;
}
}
if (hasTargetNode == False)
{
printf("The data is not in current Linked Table.\n");
}
else
{
printf("Elem %d has been removed successfully.\n", elem);
}
}
}

链表的C语言实现的更多相关文章

  1. 基于链表的C语言堆内存检测

    说明 本文基于链表实现C语言堆内存的检测机制,可检测内存泄露.越界和重复释放等操作问题. 本文仅提供即视代码层面的检测机制,不考虑编译链接级的注入或钩子.此外,该机制暂未考虑并发保护. 相关性文章参见 ...

  2. 【数据结构】之链表(Java语言描述)

    以前写过一篇帖子,记录了链表在C语言中的描述代码.C语言中没有链表的直接实现,因此,我们需要自己编写代码实现.请参考[我的这篇文章]. Java中默认为我们提供了链表的API—— LinkedList ...

  3. 指针与数据结构算法_链表(C语言)

    一.变量: 声明一个变量系统是没有给这个变量分配内存空间的: 例: int j;//编译的时候是没有分配内存空间的 ;//计算机在编译的时候就会给这个i分配4个字节的内存空间 二.malloc动态分配 ...

  4. 数据结构入门之链表(C语言实现)

    这篇文章主要是根据<数据结构与算法分析--C语言描述>一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现.在学习的过程中将练习的代码记录在文章中,并添 ...

  5. 无头结点的单链表(C语言)

    1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ...

  6. 单链表(C语言实现)

    链表结构: SList.h //-------------------------------------------------------------------------- /* **功能:应 ...

  7. 【数据结构】之链表(C语言描述)

    链表是线性表的一种,是一种物理存储单元上非连续的存储结构,链表中的数据元素之间是通过指针链接实现的. 链表由一系列节点组成,节点可以在运行时动态的生成. 链表中国的每个节点分为两部分:一部分是存储数据 ...

  8. 郑州尚学堂:链表的C语言如何实现动态内存分配

    一.为什么用动态内存分配 但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组.比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数 ...

  9. 单链表(c语言实现)贼详细

    直接上代码吧 #include<stdio.h> #include<malloc.h> /* 单链表特点: 它是一种动态的储存结构,链表中每个节点占用的储存空间不是预先分配的, ...

  10. 数据结构6: 静态链表及C语言实现

    本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...

随机推荐

  1. 记在virtualbox下挂载共享文件夹的方法

    sudo mount -t vboxsf share /usr/share sudo mount -t vboxsf 共享文件夹名称(在设置页面设置的) 挂载的目录

  2. Docker应用程序容器技术_转

    转自:百度百科 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相 ...

  3. 使用git版本控制器C#工程,git托管到GitHub和visual studio on line

    类比TFS, 托管到了VS online,为私有.GitHub上托管的代码为开源. 新建工程选择版本控制器"Git" VS online: 本地: GitHub,下载github ...

  4. MVC中自带的异步((Ajax.BeginForm)无效

    1.确定unobtrusive-ajax已经引用,VS2012带,2013不带 2.注意jq和unobtrusive-ajax引用顺序问题,确保jq在前 3.注意JQ和unobtrusive-ajax ...

  5. .NET中Redis安装部署及使用方法简介附->开源Redis操作辅助类

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. Re ...

  6. size_t 类型

    1 关于size_t定义 size_t是一种数据相关的无符号类型,它被设计得足够大以便能够内存中任意对象的大小.在cstddef头文件中定义了size_t类型,这个文件是C标准库stddef.h头文件 ...

  7. Js动态获取iframe子页面的高度////////////////////////zzzz

    Js动态获取iframe子页面的高度   Js动态获取iframe子页面的高度总结 问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 ...

  8. PHP+ExtJS 文件上传示例

    xtJS 4 有一个非常方便的文件上传组件,可以用来将文件上传到服务器.本文PHP教程UncleToo将介绍使用PHP和ExtJS实现文件上传功能. 首先,创建文件上传组件Ext.form.Panel ...

  9. jffs2和yaffs2文件系统制作工具的编译与使用

    一 . 先准备文件 mtd-utils-1.4.5.tar.bz2 ftp://ftp.infradead.org/pub/mtd-utils/ zlib-1.2.5.tar.bz2 http://z ...

  10. windows 下编辑shell,到linux报错,也是windows换行等造成

    sed -i 's/\r$//' shell.sh 然后linux 下就不会报语法错误了.