【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语言实现增删改查操作

  • 2012年09月21日 18:16
  • 1.97MB
  • 下载

C语言实现单链表的简单操作【完整版】

#ifndef __LIST__H_ #define __LIST__H_ typedef int DataType; typedef unsigned int size_t; typedef...

c语言 单链表的相关操作

  • 2012年02月19日 16:35
  • 3KB
  • 下载

C语言 单链表的简单操作

  • 2012年09月11日 18:42
  • 875B
  • 下载

单链表的基本操作(C语言实现)

//////////////////////////////////////////// //单链表的初始化,建立,插入,查找,删除。// //////////////////////////...
  • tham_
  • tham_
  • 2016年04月07日 17:46
  • 2060

单链表操作函数(C语言)

  • 2015年10月07日 15:52
  • 8KB
  • 下载

数据结构 单链表操作(c语言)

  • 2009年11月21日 12:24
  • 179KB
  • 下载

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

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

C语言 循环单链表的简单操作

  • 2012年09月11日 18:45
  • 931B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)
举报原因:
原因补充:

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