无头单链表用C语言实现

原创 2018年04月17日 15:19:47
typedef int DataType;

typedef struct Node
{
    struct Node *Next;
    DataType data;
}Node,*PNode;

这是链表的节点,由结构体组成,
第一个成员是结构体指针,能指向下一个节点,第二个成员存放的是数据
List.h

#include<stdio.h>
#pragma once
#include<assert.h>
#include<stdlib.h>


typedef int DataType;

typedef struct Node
{
    struct Node *Next;
    DataType data;
}Node,*PNode;


// 链表的初始化 
void SListInit(PNode* pHead);
// 尾插 
void SListPushBack(PNode* pHead, DataType data);
// 尾删 
void SListPopBack(PNode* pHead);
// 头插 
void SListPushFront(PNode* pHead, DataType data);
// 头删 
void SListPopFront(PNode* pHead);
// 在链表中查找值为data的元素,找到后返回值为data的结点 
PNode SListFind(PNode pHead, DataType data);
// 在pos位置插入值为data的结点 
void SListInsert(PNode* pHead, PNode pos, DataType data);
// 删除pos位置额结点 
void SListErase(PNode* pHead, PNode pos);
// 获取链表中值data的结点 
int SListSize(PNode pHead);
// 判断链表是否为空 
int SListEmpty(PNode pHead);
// 销毁聊表 
void SListDestroy(PNode* pHead);
//创建新的节点
PNode NewNode(DataType data);
//打印链表
void SListPrint(PNode pHead);

List.c

#include"List.h"


void SListInit(PNode* pHead)
{
    assert(pHead);
    *pHead = NULL;
}
PNode NewNode(DataType data)
{
    PNode pnewNode = (PNode)malloc(sizeof(Node));
    if (NULL == pnewNode)
        return NULL;
    pnewNode->data = data;
    pnewNode->Next = NULL;
    return pnewNode;
}
void SListPushBack(PNode* pHead, DataType data)
{
    assert(pHead);
    PNode pnewNode = NULL;
    pnewNode = NewNode(data);
    if (pnewNode == NULL)
        return;
    if (*pHead == NULL)
        *pHead = pnewNode;
    else
    {
        PNode pCur = *pHead;
        while (pCur->Next != NULL)
        {
            pCur = pCur->Next;
        }
        pCur->Next = pnewNode;
    }
}
void SListPopBack(PNode* pHead)
{
    assert(pHead);
    if (NULL == *pHead)
        return;
    else if ((*pHead)->Next == NULL)
    {
        free(*pHead);
        *pHead = NULL;
    }
    else
    {
        PNode pCur = *pHead;
        while (pCur->Next != NULL)
        {
            pCur = pCur->Next;
        }
        free(pCur);
        pCur = NULL;
    }
}
void SListPrint(PNode pHead)
{
    PNode pCur = NULL;
    if (pHead == NULL)
        return;
    pCur = pHead;
    while (pCur->Next)
    {
        printf("%d---->", pCur->data);
        pCur=pCur->Next;
    }
    printf("NULL\n");
}
void SListPushFront(PNode* pHead, DataType data)
{
    assert(pHead);
    PNode newNode = NULL;
    newNode = NewNode(data);
    if (newNode == NULL)
        return;
    newNode->Next = *pHead;
    *pHead = newNode;
}
//头删
void SListPopFront(PNode* pHead)
{
    PNode pCur = NULL;
    assert(pHead);
    if (*pHead == NULL)
    {
        return;
    }
    else
    {
        pCur = (*pHead);
        *pHead = (*pHead)->Next;
        free(pCur);
    }
}
//查找
PNode SListFind(PNode pHead, DataType data)
{
    PNode pCur = NULL;
    if (pHead == NULL)
        return NULL;
    pCur = pHead;
    while (pCur)
    {
        if (pCur->data == data)
            return pCur;
        pCur = pCur->Next;
    }
    return NULL;
}
//任意位置插入
void SListInsert(PNode* pHead, PNode pos, DataType data)
{
    PNode pnewnode = NULL;
    assert(pHead);
    if (*pHead == NULL || pos == NULL)
        return;
    pnewnode=NewNode(data);
    if (NULL == pnewnode)
        return;
    pnewnode->Next = pos->Next;
    pos->Next = pnewnode;
}
//任意位置删除
void SListErase(PNode* pHead, PNode pos)
{
    PNode newnode = NULL;
    assert(pHead);
    if (*pHead == NULL || pos == NULL)
        return;
    else if ((*pHead)==pos)
        SListPopFront(pHead);
    else
    {
        newnode = *pHead;
        while (newnode->Next != pos)
        {
            newnode = newnode->Next;
        }
        newnode->Next = pos->Next;
        free(pos);
    }
}
//求链表节点个数
int SListSize(PNode pHead)
{
    int count = 0;
    if (pHead == NULL)
        return 0;
    while (pHead)
    {
        count++;
        pHead = pHead->Next;
    }
    return count;
}
//判空
int SListEmpty(PNode pHead)
{
    return !pHead;
}
//销毁
void SListDestroy(PNode* pHead)
{
    PNode pnew = NULL;
    assert(pHead);
    if (NULL == (*pHead))
        return;
    while (pnew)
    {
        pnew = *pHead;
        *pHead = pnew->Next;
        free(pnew);
    }
}




void Test()
{
    PNode list;
    SListInit(&list);
    SListPushBack(&list, 1);
    SListPushBack(&list, 2);
    SListPushBack(&list, 3);
    SListPushBack(&list, 4);
    SListPushBack(&list, 5);
    SListPushBack(&list, 6);
    SListPopFront(&list);
    SListPushFront(&list, 1);
    SListFind(list, 1);
    //SListErase(&list, SListFind(list, 1));
    SListPrint(list);
    SListDestroy(&list);
}

test.c

#include"List.h"



int main()
{
    Test();
}

单链表实现(C语言版,无头结点)

前言:单链表:它是一种链式储存的线性表,用一组地址任意的储存单元存放线性表的数据元素;称储存单元为一个结点;结点:值域+指针域 链表:二、代码实现(1)结点定义:typedef int DataTy...
  • gogogo_sky
  • gogogo_sky
  • 2017-05-02 02:42:04
  • 1137

单链表(无头节点)的实现

链表:链表是一种顺序表,但并不是顺序存储,每个节点都存储着一个指向下一个节点的指针,把存储的数据元素连接起来//SlistNode #pragma once #define _CRT_SECURE_N...
  • xs_520
  • xs_520
  • 2016-12-12 20:14:16
  • 1640

C语言实现无头节点单链表

测试代码 singlelinkedlist.h头文件 #ifndef __SINGLELINKEDLIST_H__ #include #include #include typedef int...
  • akiqiu
  • akiqiu
  • 2017-06-14 22:34:33
  • 305

无头单链表的操作(基于前面的修改版)

slist.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include&amp;lt;stdio.h&amp;gt; #include&...
  • lc578626
  • lc578626
  • 2018-03-27 23:36:08
  • 14

C语言实现无头节点的单链表

测试代码 singlelinkedlist.h头文件 #ifndef __SINGLELINKEDLIST_H__ #include #include #include typedef int...
  • ZoctopusD
  • ZoctopusD
  • 2017-06-13 21:26:20
  • 248

实现无头结点单链表的基本操作函数

基于单链表经常见的面试题——基础篇 基于单链表的面试题——进阶篇什么是无头结点链表??? singlelinkedlist.h头文件#ifndef __SINGLELINKEDLIST_H__ ...
  • Quinn0918
  • Quinn0918
  • 2017-06-09 17:29:41
  • 1338

无头结点链表实现

  • 2012年12月01日 14:39
  • 2KB
  • 下载

数据结构之循环单链表(C语言实现)

数据结构之循环单链表(C语言实现)
  • kang___xi
  • kang___xi
  • 2016-11-25 22:42:19
  • 861

单链表的创建(有头结点和无头结点)

1、有头结点的单链表的创建#include using namespace std;struct ListNode{ int val; ListNode *next; };//有头...
  • qq_36748278
  • qq_36748278
  • 2017-01-14 13:37:26
  • 3301

<笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点

1、从尾到头打印链表2、删除一个无头链表的非尾结点单链表结构以及Find函数参见 2016-1-2 13:56 发表博客void Print_T_to_H(SListNode*&pHead)//从尾到...
  • Footmart_C
  • Footmart_C
  • 2016-06-05 10:57:38
  • 435
收藏助手
不良信息举报
您举报文章:无头单链表用C语言实现
举报原因:
原因补充:

(最多只允许输入30个字)