C语言:单链表的实现(包括:尾插、尾删、头插、头删、指定位置插入、长度、打印)

原创 2016年05月30日 17:16:05
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#include<assert.h>

typedef int DataType;

typedef struct SListNode
{
    DataType _data;
    struct SListNode* _next;
}SListNode;


SListNode* _CreateNode(DataType x)
{
    SListNode* head = (SListNode*)malloc(sizeof(SListNode));
    head->_data = x;
    head->_next = NULL;
    return head;
}


void PushBack(SListNode*& head, DataType x)
{
    if (head == NULL)
    {
        head = _CreateNode(x);
        head->_next = NULL;
    }
    else
    {
        SListNode* cur = head;
        while (cur->_next != NULL)
        {
            cur = cur->_next;
        }
        cur->_next = _CreateNode(x);
    }
    
}


void PopBack(SListNode*& head)
{
    if (head == NULL)
    {
        return;
    } 
    else if (head->_next == NULL)
    {
        free(head);
        head = NULL;
    }
    else
    {
        SListNode* cur = head;
        SListNode* next = head;

        while (cur)
        {
            next = cur->_next;
            if (next != NULL && next->_next == NULL)
            {
                free(next);
                cur->_next = NULL;
                return;
            }

            cur = cur->_next;
        }
    }
    
}


void PushFront(SListNode*& head,DataType x)
{
    if (head == NULL)
    {
        head = _CreateNode(x);
    }
    else
    {
        SListNode* pcur = _CreateNode(x);
        pcur->_next = head;
        head = pcur;
    }
}


void PopFront(SListNode*& head)
{
    if (head == NULL)
    {
        return;
    }
    else if (head->_next == NULL)
    {
        free(head);
        head = NULL;
    }
    else
    {
        SListNode* del = head;
        SListNode* next = head->_next;
        free(del);
        del = NULL;
        head = next;
    }
}


void Insert(SListNode* head,int pos,DataType x)
{
    assert(pos >= 0);
    SListNode* cur = head;
    while (--pos && cur)
    {            
        cur = cur->_next;        
    }
    if (pos > 0)
    {
        printf("pos位置大于链表长度!\n");
        return;
    }
    SListNode* newcur = _CreateNode(x);
    if (cur->_next)
    {
        SListNode* next = cur->_next;
    
        cur->_next = newcur;
        newcur->_next = next;
    }
    else if (cur->_next == NULL)
    {
        cur->_next = newcur;
    }
}


size_t Length(SListNode*& head)
{
    size_t count = 0;
    SListNode* cur = head;
    while (cur)
    {
        count++;
        cur = cur->_next;
    }
    return count;
}


void PrintSList(SListNode*& head)
{
    SListNode* cur = head;
    while (cur)
    {
        printf("%d->", cur->_data);
        cur = cur->_next;
    }
    printf("\n");
}


void Test()
{
    SListNode* sList =NULL;
    PushBack(sList, 1);
    PushBack(sList, 2);
    PushBack(sList, 3);
    PushBack(sList, 4);
    PushBack(sList, 5);
    PrintSList(sList);

    PopBack(sList);
    PrintSList(sList);

    PushFront(sList, 0);
    PrintSList(sList);

    PopFront(sList);
    PrintSList(sList);

    Insert(sList, 3, 10);
    PrintSList(sList);

    int ret = Length(sList);
    printf("单链表长度为:%d\n", ret);
}


int main()
{
    Test();
    system("pause");
    return 0;
}


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1734401

单链表的创建(头插法尾插法),插入,删除

#include #include #include using namespace std; typedef int ElemType; typedef struct Node { E...
  • yinyu19950811
  • yinyu19950811
  • 2016年03月09日 20:28
  • 1393

关于链表头插尾插的个人图解

关于链表头插尾插的个人图解
  • yikchang911
  • yikchang911
  • 2016年09月22日 15:37
  • 370

C++语言实现单链表的尾插,尾删,头插,头删等

#include #include #pragma once typedef int DataType;//因为PushBack要返回的类型如果需要换,在这里直接替换int就可以了,不用每个...
  • Liudengdeng_
  • Liudengdeng_
  • 2017年09月25日 21:35
  • 109

单链表的头尾插-删-随意插入删除-查找节点

单链表的头尾插-删-随意插入删除-查找节点
  • triorwy
  • triorwy
  • 2018年01月05日 20:11
  • 93

C++类中单链表的实现(头插、尾插、头删、尾删、指定位置插入、指定位置删除、链表长度、清空链表、链表排序)

#include using namespace std; class Node { public: Node():next(NULL){} Node(int n,Node...
  • LYhani82475
  • LYhani82475
  • 2017年07月31日 19:39
  • 327

单向循环链表的头插,尾插,中间插以及删除节点

#include struct node {     int num;     struct node *next; }; typedef struct node Nod...
  • marric
  • marric
  • 2016年12月21日 22:50
  • 209

单链表 尾插法

LinkList CreatListR1(void) {//用尾插法建立带头结点的单链表 char ch; LinkList head=(ListN...
  • chunxiaqiudong5
  • chunxiaqiudong5
  • 2016年02月01日 17:17
  • 637

【C语言】静态顺序表的实现(包括头插、头删、尾插、尾删、查找、删除指定位置)

#define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; #include #define MAXSIZE 100 typed...
  • hanjing_1995
  • hanjing_1995
  • 2016年05月30日 17:19
  • 138

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)...
  • xiaofeige567
  • xiaofeige567
  • 2014年05月29日 08:54
  • 14253

C语言实现链表之单向链表(七)尾结点后插入结点

C语言实现链表之单向链表(七)尾结点后插入结点     上一篇文章给出了删除头结点的函数,本篇文章将给出在尾结点后插入结点的函数。 /*============================...
  • dan15188387481
  • dan15188387481
  • 2015年11月08日 21:09
  • 1754
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言:单链表的实现(包括:尾插、尾删、头插、头删、指定位置插入、长度、打印)
举报原因:
原因补充:

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