链表的C语言实现

#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);
}
}
}

时间: 2024-12-26 08:45:28

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

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

单链表反转C语言实现

单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: # include <iostream> # include <cstdlib> using namespace std; struct linkNode { int val; linkNode *next; linkNode(int x):val(x),next(NULL){} }; linkNod

复习(数据结构):链表:c语言:练习

库函数 #include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define

带头节点控制单链表之C语言实现

//  1.头.尾节点位置 //  2.链表 //  元素数量 #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <string.h> //链表节点信息: // //   1.数据域 //   2.指针域 #define TRUE     (1) #define FALSE    (0) #define ZERO     (0) #define ONLY_ONE (1)

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

一.变量: 声明一个变量系统是没有给这个变量分配内存空间的: 例: int j;//编译的时候是没有分配内存空间的 int i=3;//计算机在编译的时候就会给这个i分配4个字节的内存空间 二.malloc动态分配内存地址: 回想一下:我们在程序中存储一个整数10:除了使用int a;在内存中申请一块区域来存储,还有一种方法: malloc(4);                    //从内存中申请4个字节大小的内存存放整数10 在C中经常看到这样的写法: (int *)malloc(siz

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

这篇文章主要是根据<数据结构与算法分析--C语言描述>一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现.在学习的过程中将练习的代码记录在文章中,并添加了一些在测试中需要的函数,因此可能看起来会有点乱... 首先,链表作为一种简单的线性数据结构,主要特征就是"节点",每个节点包含两个信息,一个是数据域,另外一个是指针域.数据是我们在程序中需要用到的数据,数据类型可以变化,根据需要设定即可,但是指针域就是一个指针,主要作用是指向下一个节点

图的十字链表存储(C语言)

时间一晃已经大二下了,学校也开了数据结构的课,想起了自己大一刚会C语言,自学数据结构的时候,那时候很无助啊,不懂就只有拼命看,改bug改很久. 老师一节课讲完了邻接表,十字链表,邻接多重表.然而感觉他好像在自己讲自己的,一点也不认真. 但是依托老师是不行的,只懂理论也不行,或许学生认为邻接矩阵,邻接表不就那种东西吗?很简单啊. 大一的时候我也觉得C语言很简单啊,然后一写不都是错? 不写代码的数据结构不叫数据结构. 不多说,开始吧. 邻接表固然优秀,但也有不足,例如对有向图的处理上,有时候需要再建

复习(数据结构):链表:c语言

#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FAL

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

1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存的任何位置上.因此,链表中结点的逻辑顺序与物理顺序不一定相同.为了正确表示节点间的逻辑关系,必须在存储线性表的每个数据元素的同时,存储指示其后继结点的地址信息,这两部分信息共同构成了单链表结点的结构,如下图: 结点包括两个域,数据域用来存放结点的值,指针域用来存

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

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<