数据结构之单链表的实现(含全部代码)

简介: 数据结构之单链表的实现(含全部代码)

单链表的实现

首先创建头文件

#pragma
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
//定义数据类型
typedef int SLDataType;
//创建单链表
typedef struct SLinkListNode
{
  SLDataType data;
  struct SLinkListNode* next;
}SLNode;

以下是所需要实现的函数接口

//不会改变头指针,传一级指针
//可能改变头指针,传二级指针
// //创建结点
SLNode* BuySLNode(SLDataType x);
//打印
void SListPrint(SLNode* phead);
//尾插
void SListPushBack(SLNode** pphead, SLDataType x);
//头插
void SListPushFront(SLNode** pphead, SLDataType x);
//尾删
void SListPopBack(SLNode** pphead);
//头删
void SListPopFront(SLNode** pphead);
//在pos前插入x
void SListInsert(SLNode** pphead, SLNode* pos, SLDataType x);
//找到x的位置并返回
SLNode* SListFind(SLNode* phead, SLDataType x);
//删除pos位置的值
void SListErase(SLNode** pphead, SLNode* pos);

接下来是函数的实现

#include"SLinkList.h"
//创建新结点
SLNode* BuySLNode(SLDataType x)
{
  SLNode* newnode = (SLDataType*)malloc(sizeof(SLDataType));
  if (newnode == NULL)
  {
    printf("malloc fail\n");
    exit(-1);
  }
  newnode->data = x;
  newnode->next = NULL;
  return newnode;
}
//打印
void SListPrint(SLNode* phead)
{
  SLNode* cur = phead;
  while (cur != NULL)
  {
    printf("%d->", cur->data);
    cur = cur->next;
  }
  printf("NULL\n");
}
//尾插
void SListPushBack(SLNode** pphead, SLDataType x)
{
  SLNode* newnode = BuySLNode(x);
  if (*pphead == NULL)
  {
    *pphead = newnode;
  }
  else
  {
    // 找尾节点的指针
    SLNode* tail = *pphead;
    while (tail->next)
    {
      tail = tail->next;
    }
    // 尾节点,链接新节点
    tail->next = newnode;
  }
}
//头插
void SListPushFront(SLNode** pphead, SLDataType x)
{
  SLNode* newnode = BuySLNode(x);
  newnode->next = *pphead;
  *pphead = newnode;
}
//尾删
void SListPopBack(SLNode** pphead)
{
  if (*pphead == NULL)
  {
    return;
  }
  else if ((*pphead)->next == NULL)
  {
    free(*pphead);
    *pphead = NULL;
  }
  else
  {
    SLNode* prev = NULL;
    SLNode* tail = *pphead;
    while (tail->next != NULL)
    {
      prev = tail;
      tail = tail->next;
    }
    free(tail);
    tail = NULL;
    prev->next = NULL;
  }
}
//头删
void SListPopFront(SLNode** pphead)
{
  SLNode* next = (*pphead)->next;
  free(*pphead);
  *pphead = next;
}
//在pos前插入x
void SListInsert(SLNode** pphead, SLNode* pos, SLDataType x)
{
  if (pos == *pphead)
  {
    SListPushFront(pphead, x);
  }
  else
  {
    SLNode* newnode = BuySLNode(x);
    SLNode* prev = *pphead;
    while (prev->next != pos)
    {
      prev = prev->next;
    }
    prev->next = newnode;
    newnode->next = pos;
  }
}
//找到x的位置并返回
SLNode* SListFind(SLNode* phead, SLDataType x)
{
  SLNode* cur = phead;
  while (cur != NULL)
  {
    if (cur->data == x)
    {
      return cur;
    }
    cur = cur->next;
  }
  return NULL;
}
//删除pos位置的值
void SListErase(SLNode** pphead, SLNode* pos)
{
  if (pos == *pphead)
  {
    SListPopFront(pphead);
  }
  else
  {
    SLNode* prev = *pphead;
    while (prev->next != pos)
    {
      prev = prev->next;
    }
    prev->next = pos->next;
    free(pos);
    pos = NULL;
  }
}
目录
相关文章
|
24天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
50 4
|
26天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
26天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
29 1
|
1月前
|
存储
[数据结构] -- 单链表
[数据结构] -- 单链表
26 1
|
24天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
40 0
|
1月前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
24 0
|
1月前
|
存储
数据结构(单链表)
数据结构(单链表)
17 0
|
1月前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
29 0
|
1月前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表