数据结构单链表的实现(C语言)

简介: 数据结构单链表的实现(C语言)

1.实现的接口和功能

//打印链表
void SLTPrint(SLTNode** phead);
//头插
void PushFont(SLTNode** phead, SLTDataType x);
//尾插
void PushBack(SLTNode** phead, SLTDataType x);
//头删
void PopFont(SLTNode** phead);
//尾删
void PopBack(SLTNode** phead);
//删除链表
void Destory(SLTNode** phead);
//创建一个结点
SLTNode* Create(SLTDataType x);
//查找x的结点
SLTNode* Find(SLTNode** phead,SLTDataType x);
//查找指定结点并删除
void FindDele(SLTNode** phead, SLTDataType x);
//删除指定结点的下一个结点
void Delenext(SLTNode** phead, SLTDataType* pos);
//删除指定结点的上一个结点
void DeleAfter(SLTNode** phead, SLTDataType* pos);

2.代码块

声明代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLTDataType;
typedef struct SListNode
{
  SLTDataType data;
  struct SListNode* next;
}SLTNode;
//打印链表
void SLTPrint(SLTNode** phead);
//头插
void PushFont(SLTNode** phead, SLTDataType x);
//尾插
void PushBack(SLTNode** phead, SLTDataType x);
//头删
void PopFont(SLTNode** phead);
//尾删
void PopBack(SLTNode** phead);
//删除链表
void Destory(SLTNode** phead);
//创建一个结点
SLTNode* Create(SLTDataType x);
//查找x的结点
SLTNode* Find(SLTNode** phead,SLTDataType x);
//查找指定结点并删除
void FindDele(SLTNode** phead, SLTDataType x);
//删除指定结点的下一个结点
void Delenext(SLTNode** phead, SLTDataType* pos);
//删除指定结点的上一个结点
void DeleAfter(SLTNode** phead, SLTDataType* pos);

实现代码:

#include"SList.h"
SLTNode* Create(SLTDataType x)
{
  SLTNode* list = (SLTNode*)malloc(sizeof(SLTNode));
  if (list == NULL)
  {
    perror("malloc fail\n");
  }
  list->next = NULL;
  list->data = x;
  return list;
}
void SLTPrint(SLTNode** phead)
{
  assert(*phead);
  SLTNode* list = *phead;
  while (list)
  {
    printf("%d ", list->data);
    list = list->next;
  }
  printf("\n");
}
void PushFont(SLTNode** phead, SLTDataType x)
{
  SLTNode* p = Create(x);
  if (*phead == NULL)
  {
    *phead = p;
  }
  else
  {
    p->next = *phead;
    *phead = p;
  }
}
void PushBack(SLTNode** phead, SLTDataType x)
{
  SLTNode* p = Create(x);
  if (*phead == NULL)
  {
    *phead = p;
    }
  SLTNode* prev = NULL;
  SLTNode* ps = *phead;
  while (ps)
  {
    prev = ps;
    ps = ps->next;
  }
  prev->next = p;
}
void PopFont(SLTNode** phead)
{
  assert(*phead);
  SLTNode* p = (*phead)->next;
  free(*phead);
  *phead = p;
}
void PopBack(SLTNode** phead)
{
  assert(*phead);
  if ((*phead)->next == NULL)
  {
    free(*phead);
    *phead = NULL;
  }
  SLTNode* p = *phead;
  SLTNode* prev = NULL;
  while (p->next)
  {
    prev = p;
    p = p->next;
  }
  free(p);
  prev->next = NULL;
}
SLTNode* Find(SLTNode** phead, SLTDataType x)
{
  assert(*phead);
  SLTNode* p = *phead;
  while (p->data!=x)
  {
    p = p->next;
  }
  if (p->data == x)
    return p;
  else
    return NULL;
}
void FindDele(SLTNode** phead, SLTDataType x)
{
  assert(*phead);
  SLTNode* p = *phead; 
  SLTNode* prev = NULL;
  while (p!=NULL&&p->data!=x)
  {  
    prev = p;
    p = p->next;
  }
  if (p->data == x)
  {
    prev->next = p->next;
    free(p);
  }
}
void Destory(SLTNode** phead)
{
  assert(*phead);
  SLTNode* later = NULL;
  SLTNode *p= *phead;
  while (p)
  {
    later = p->next;
    free(p);
    p = later;
  }
}
void Delenext(SLTNode** phead, SLTDataType* pos)
{
  assert(phead);
  SLTNode* p = *phead;
  while (p != pos)
  {
    p = p->next;
  }
  if (p->next == NULL)
  {
    return;
  }
  SLTNode* ps = p->next;
  p->next = p->next->next;
  free(ps);
}
void DeleAfter(SLTNode** phead, SLTDataType* pos)
{
  assert(phead);
  assert(&phead);
  if ((*phead)->next == NULL)
  {
    return;
  }
  SLTNode* p = *phead;
  SLTNode* prev = NULL;
  while (p->next!= pos)
  {
    prev = p;
    p = p->next;
  }
  if (prev == NULL)
  {
    *phead = p->next;
    return;
  }
  prev->next = p->next;
  free(p);
}

测试用例代码:

#include"SList.h"
int main()
{
  SLTNode* list = NULL;
  PushFont(&list,1);
  PushFont(&list, 2);
  PushFont(&list, 3);
  PushBack(&list,4);
  PushBack(&list, 5);
  PushBack(&list, 6);
  SLTPrint(&list);
    PopFont(&list);
  PopBack(&list);
  SLTPrint(&list);
  FindDele(&list, 5);
  SLTNode*p= Find(&list,4);
  SLTNode* ps = Find(&list, 1);
  Delenext(&list,p);
  SLTPrint(&list);
     DeleAfter(&list, ps);
  SLTPrint(&list);
  Destory(&list);
  return 0;
}

结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

目录
相关文章
|
29天前
【数据结构】单链表(长期维护)(1)
【数据结构】单链表(长期维护)(1)
|
6天前
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
28 10
【数据结构】链表从实现到应用,保姆级攻略
|
2天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
2天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
2天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
2天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
2天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
2天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
28天前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
24天前
|
算法 索引
【初阶数据结构篇】单链表算法题进阶
深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。