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

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

单链表的实现

首先创建头文件

#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;
  }
}
目录
相关文章
|
23小时前
数据结构 链表(第7、8天)
数据结构 链表(第7、8天)
|
1天前
|
存储
数据结构——带头双向循环链表
数据结构——带头双向循环链表
|
2天前
|
存储 机器学习/深度学习 缓存
【数据结构】布隆过滤器原理详解及其代码实现
【数据结构】布隆过滤器原理详解及其代码实现
|
4天前
|
存储
初阶数据结构 带头双链表
初阶数据结构 带头双链表
7 0
|
4天前
数据结构初阶 链表的补充
数据结构初阶 链表的补充
6 0
|
4天前
|
存储
数据结构初阶 链表详解
数据结构初阶 链表详解
5 0
|
9天前
|
算法 C语言
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
8 0
|
9天前
|
算法 C语言
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
9 0
|
9天前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
8 0
|
9天前
|
算法 Shell C语言
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
10 0