单链表(C语言)

简介: 单链表(C语言)

SList.h文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLTDateType;
typedef struct SListNode
{
  SLTDateType data;
  struct SListNode* next;
}SLTNode;
void Print(SLTNode* phead);
void Push_Back(SLTNode** phead, SLTDateType x);
void Push_Front(SLTNode** phead, SLTDateType x);
void Pop_Back(SLTNode** phead);
void Pop_Front(SLTNode** phead);
void Pop_Pos(SLTNode** phead, SLTNode* pos);
void Push_Pos(SLTNode** phead, SLTNode* pos, SLTDateType x);
SLTNode* Buy_Node(SLTDateType x);
SLTNode* Find(SLTNode* phead, SLTDateType x);

SList.c

#include"SList.h"
void Print(SLTNode* phead)
{
  SLTNode* cur=phead;
  while (cur != NULL)
  {
    printf("%d->", cur->data);
    cur = cur->next;
  }
  printf("NULL\n");
}
SLTNode* Buy_Node(SLTDateType x)
{
  SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
  if (newnode == NULL)
  {
    perror("malloc fail");
    return NULL;
  }
  newnode->data = x;
  newnode->next = NULL;
  return newnode;
}
void Push_Back(SLTNode** phead, SLTDateType x)
{
  SLTNode* newnode= Buy_Node(x);
  if (*phead == NULL)
  {
    *phead = newnode;
  }
  else
  {
    SLTNode* cur = *phead;
    while (cur->next != NULL)
    {
      cur = cur->next;
    }
    cur->next = newnode;
  }
}
void Push_Front(SLTNode** phead, SLTDateType x)
{
  assert(phead);
  SLTNode* newnode = Buy_Node(x);
  newnode->next = *phead;
  *phead = newnode; 
}
void Pop_Back(SLTNode** phead)
{
  //如果没有节点
  if ((*phead) == NULL)
  {
    return;
  }
  //assert(*phead!=NULL);
  //如果只有一个节点
  if ((*phead)->next == NULL)
  {
    free(*phead);
    *phead = NULL;
  }
  else
  {
    SLTNode* tail = *phead;
    while (tail->next->next != NULL)
    {
      tail = tail->next;
    }
    free(tail->next);
    tail->next = NULL;
  }
}
void Pop_Front(SLTNode** phead)
{
  if (*phead == NULL)
  {
    return;
  }
  SLTNode* head = *phead;
  *phead = (*phead)->next;
  free(head);
  head = NULL;
}
//给定位置
//void Push_Pos(SLTNode** phead, SLTDateType x, SLTDateType pos)
//{
//  assert(phead);
//  if (pos == 0)
//  {
//    Push_Front(*phead,x);
//    return;
//  }
//  SLTNode* first = *phead;
//  SLTNode* second = *phead;
//  SLTDateType cnt = 0;//计数
//  while (cnt != pos-1)
//  {
//    first = second;
//    second = second->next;
//    cnt++;
//  }
//  SLTNode* newnode = Buy_Node(x);
//  first->next = newnode;
//  newnode->next = second;
//
//}
SLTNode* Find(SLTNode* phead, SLTDateType x)
{
  SLTNode* cur = phead;
  while (cur != NULL)
  {
    if (cur->data == x)
    {
      return cur;
    }
    cur = cur->next;
  }
  return NULL;
}
在pos位置之前插入
//void Push_Pos(SLTNode** phead, SLTNode* pos, SLTDateType x)
//{
//  assert(phead);
//  assert(pos);
//  if (pos == *phead)
//  {
//    Push_Front(phead, x);
//  }
//  else
//  {
//    SLTNode* prev = *phead;
//    while (prev->next != pos)
//    {
//      prev = prev->next;
//    }
//    SLTNode* newnode = Buy_Node(x);
//    prev->next = newnode;
//    newnode->next = pos;
//  }
//}
//在pos位置之后插入
void Push_Pos(SLTNode** phead, SLTNode* pos, SLTDateType x)
{
  assert(phead);
  assert(pos);
  if (pos == *phead)
  {
    Push_Front(phead, x);
  }
  else
  {
    SLTNode* tail = pos->next;
    SLTNode* newnode = Buy_Node(x);
    pos->next = newnode;
    newnode->next = tail;
  }
}
void Pop_Pos(SLTNode** phead, SLTNode* pos)
{
  assert(phead);
  assert(pos);
  if (pos == *phead)
  {
    Pop_Front(phead);
  }
  else
  {
    SLTNode* prev = *phead;
    while (prev->next != pos)
    {
      prev = prev->next;
    }
    prev->next = pos->next;
    free(pos);
    //pos = NULL;//为什么不需要让pos=NULL
  }
}

test.c

#include"SList.h"
void TestSList1()
{
  SLTNode* plist=NULL;
  Push_Back(&plist, 1);
  Push_Back(&plist, 2);
  Push_Back(&plist, 3);
  Print(plist);
  SLTNode* ret = Find(plist, 1);
  SLTNode* ret1 = Find(plist, 2);
  Push_Pos(&plist, ret, 100);
  Print(plist);
  Pop_Pos(&plist, ret1);
  Print(plist);
}
int main(void)
{
  TestSList1();
  return 0;
}

目录
相关文章
|
存储 编译器 C语言
【数据结构】C语言实现单链表万字详解(附完整运行代码)
【数据结构】C语言实现单链表万字详解(附完整运行代码)
254 0
|
存储 C语言
数据结构——单链表(C语言)
数据结构——单链表(C语言)
|
存储 C语言
C语言单链表实现
一个用C语言编写的简单学生信息管理系统,该系统具备信息输入、成绩计算、排序、删除、查找、修改、保存和读取文件等功能。
133 0
C语言单链表实现
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
2210 6
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
343 2
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。
183 2
|
存储 人机交互 C语言
【C语言项目实战】使用单链表实现通讯录
【C语言项目实战】使用单链表实现通讯录
|
算法 C语言
【算法与数据结构】 C语言实现单链表队列详解2
【算法与数据结构】 C语言实现单链表队列详解
|
存储 C语言
数据结构之单链表详解(C语言手撕)
数据结构之单链表详解(C语言手撕)
241 1
|
C语言
C语言用头插法建立单链表
C语言用头插法建立单链表
93 0