美文网首页
链表(C语言)

链表(C语言)

作者: 修夏之夏i | 来源:发表于2018-09-11 22:14 被阅读0次

LinkList.h

#define _CRT_SECURE_N0_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef int DataType;

typedef struct ListNode {
    DataType data;
    struct ListNode *next;
}ListNode;

void ListInit(ListNode *    *ppFirst)//二级指针 
{
    assert(ppFirst != NULL);
    *ppFirst = NULL;
}

void ListDestory(ListNode **ppFirst)
{
    *ppFirst = NULL;
}

static ListNode * CreateNode(DataType data)
{
    ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
    assert(newNode);
    newNode->data = data;
    newNode->next = NULL;

    return newNode;
}

void ListPushFront(ListNode **ppFirst, DataType data)
{
    assert(ppFirst != NULL);
    // 考虑特殊情况,链表为空 *ppFirst == NULL

    // 正常情况
    // 1. 指针 vs 指向空间;从堆上申请空间
    ListNode *newNode = CreateNode(data);
    newNode->next = *ppFirst;

    *ppFirst = newNode;
}

void ListPushBack(ListNode **ppFirst, DataType data)
{
    ListNode *newNode = CreateNode(data);

    // 特殊情况,找倒数第一个 -> 至少有一个,所以特殊情况是链表为空
    if (*ppFirst == NULL) {
        *ppFirst = newNode;
        return;
    }

    // 通常情况
    ListNode *cur = *ppFirst;
    while (cur->next != NULL) {
        cur = cur->next;
    }

    // cur 就是最后一个结点
    cur->next = newNode;
}

void ListPopFront(ListNode **ppFirst)
{
    assert(ppFirst != NULL);//变量地址不为NULL
    assert(*ppFirst != NULL);//不能为空链表

    ListNode* del = *ppFirst;
    *ppFirst = del->next;

    free(del);
}

void ListPopBack(ListNode **ppFirst)
{
    assert(ppFirst != NULL);//变量地址不为NULL
    assert(*ppFirst != NULL);//不能为空链表
    //只有一个结点
    if ((*ppFirst)->next == NULL)
    {
        free(*ppFirst);
        *ppFirst = NULL;
        return;
    }

    //正常情况
    ListNode* del;
    ListNode* cur = *ppFirst;
    while (cur->next->next != NULL)
    {
        cur = cur->next;
    }
    del = cur->next;
    cur->next = NULL;
    free(del);
}

//查找
ListNode *SearchListNode(ListNode* first,DataType data)
{
    //顺序查找 去遍历
    for (ListNode* cur = first; cur != NULL; cur = cur->next)
    {
        if (data = cur->data)
            return cur;
    }
    return NULL;
}

//在指定结点前插入 链表不为空&&指定结点存在
void ListInsert(ListNode** ppFirst,ListNode *pos, DataType data)//二级指针 可能是第一个结点
{
    if (*ppFirst == pos)
    {
        ListPushFront(ppFirst, data);
        return;
    }

    //中间插入
    ListNode* cur = *ppFirst;
    while (cur->next != pos)
    {
        cur = cur->next;
    }
    ListNode* newNode = CreateNode(data);
    newNode->next = pos;
    cur->next = newNode;
}

//删除指定结点 链表不为空&&指定结点存在
void ListErase(ListNode **ppFirst, ListNode *pos)
{
    if (*ppFirst == pos)
    {
        ListPopFront(ppFirst);
        return;
    }

    //中间删除
    ListNode *cur = *ppFirst;
    while (cur->next != pos)
        cur = cur->next;
    cur->next = pos->next;

    free(pos);
}


void Test()
{
    ListNode *first;
    ListInit(&first);//经过初始化 first==NULL;更改了first的值 函数中应该传地址。

    ListPushBack(&first, 1);
    ListPushBack(&first, 2);
    ListPushBack(&first, 3);
    
    ListNode *result = SearchListNode(first, 1);

    ListInsert(&first, result, 0);
    ListErase(&first,first);
}

LinkList.c

#define _CRT_SECURE_N0_WARNINGS 1
#include "LinkList.h"

int main()
{
    Test();

    return 0;
}

相关文章

  • 链表逆置C语言完整代码

    链表逆置C语言完整代码

  • Java实现简单的链表-面向初学者

    很久之前用C语言实现过链表,现在已经太久没用C语言。就先用JAVA实现一个简单链表好了,还是使用最原始的C语言实现...

  • 链表(C语言)

    LinkList.h LinkList.c

  • C语言链表

    链表 链表用于解决合理利用存储空间的问题 malloc在没有连续内存空间的时候分配会失败 解决方案:不要一次性开辟...

  • C语言链表

    链表 作业 include "stdio.h" typedef struct Home{int fridge;in...

  • C语言- 链表

    C语言面向对象设计链表。可以储存任何类型使用函数指针 遍历,寻找最大值,和排序

  • 链表(c语言)

    链表的概念 创建数组时,我们会直接分配出所有我们需要的内存。但是对于链表,我们每次只分配出一个节点(node) 的...

  • C语言-链表

    线性表 线性表定义:由n个(n>=0)个数据特性相同的元素构成的有限序列称为线性表。 线性表特点:每个节点有一个直...

  • C语言链表

    1 准备 在Fedora 29中,使用下述命令安装内核源代码. 2 例子1 编写一个最简单的链表程序,3个节点依次...

  • C语言 - 链表

网友评论

      本文标题:链表(C语言)

      本文链接:https://www.haomeiwen.com/subject/wcupgftx.html