关闭

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

69人阅读 评论(0) 收藏 举报
分类:
#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

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:48869次
    • 积分:600
    • 等级:
    • 排名:千里之外
    • 原创:174篇
    • 转载:9篇
    • 译文:0篇
    • 评论:2条
    关于博主
    github:https://github.com/hanxiaojing Email: hanjing_1995@163.com 原51.cto: http://10740184.blog.51cto.com 欢迎来访~
    文章分类
    最新评论