【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)

原创 2016年05月30日 17:17:51
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;


//单链表的实现
#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)
{
    if (head == NULL)
    {
        return;
    }
    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/1747913

【C++】实现动态顺序表的PushBack(),PopBack(),PushFront(),PopFront(),Find(),Insert

建立源文件SeqList.cpp:#define _CRT_SECURE_NO_WARNINGS 1 #include"SeqList.h" int main() {     Test();   ...
  • hanjing_1995
  • hanjing_1995
  • 2016年05月30日 17:17
  • 120

vector类中为什么没有push_front方法和pop_front方法

vector是开辟一块空间来作为数组来存放元素(随机迭代器),如果有了pop_front,pop_back这个功能则很容易造成内存碎片,pop_front会造成头部内存产生碎片,pop_back造成尾...
  • A_Eagle
  • A_Eagle
  • 2012年03月19日 20:49
  • 3454

list(链表)常用成员(顺序容器)----插入push_back,push_front,insert删除pop_back,pop_front,erase,clear遍历begin,end判空empt

list头文件: #include using namespace std;   list和vector的不同在于,vector采用的顺序存储,即vector中的元素像数组一样,一个紧挨着一...
  • kyfvc
  • kyfvc
  • 2013年05月03日 12:55
  • 17912

单链表的基本操作c语言实现

#include #define false 0 #define ok 1//定义节点的结构 typedef struct node{ int data; struct node *n...
  • gongdileidechouzhu
  • gongdileidechouzhu
  • 2017年02月25日 16:14
  • 814

数据结构--单链表的基本操作(C语言实现)

数据结构--单链表的基本操作(C语言实现)     #include #include #define ERROR 0 #define OK   1...
  • qq_33609401
  • qq_33609401
  • 2016年09月27日 17:30
  • 1264

单链表的基本操作大全之C语言实现(一)

单链表的基本操作大全之C语言实现1. 单链表的定义链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单元可以是连续的也可以是不连续的。为了建立起数据元素之间的关系,对于每个数据元素除了存放...
  • men_wen
  • men_wen
  • 2016年10月20日 21:43
  • 8159

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客《C语言实现单链表(不带头结点)的基本操作》中具体实现了不带头结点的单链表的11种操作:如计算链表长度、初始化、创建链表、清空链表等等。但是在实际使用中,带头结点的单链表往往比不带头结...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 13:40
  • 5496

C语言实现双向链表的基本操作

本文转载自:http://gengning938.blog.163.com/blog/static/1282253812009825102516632/如需转载,请注明出处,谢谢。 头文件c2_4.h...
  • xinchow
  • xinchow
  • 2010年04月08日 14:29
  • 1804

C语言单向链表的表示与实现实例详解

C语言单向链表的表示与实现实例详解
  • Rank_d
  • Rank_d
  • 2016年11月02日 19:04
  • 516

Linux-C学习笔记--单链表的“浮云”操作

链表在C语言项目中很常见,学号链表,先从单链表开始,通常在学习阶段的单链表实现是基于某种数据类型或结构量身定做的操作方法,这种方法,没有通用性,在实际项目开发中,段不可取。于是乎,学习一种“浮云”般对...
  • u011833609
  • u011833609
  • 2013年11月10日 12:17
  • 1465
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)
举报原因:
原因补充:

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