【c语言】单链表的基本操作

List.h文件代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DataType;

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

ListNode* BuyNode(DataType x)//创建一个结点
{
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    node->data = x;
    node->next = NULL;
    return node;
}

void PushBack(ListNode** pplist, DataType x)//尾插-----传的是结点的指针的地址
{
    //情况一:链表为空
    //情况二:链表非空
    if(*pplist == NULL)
    {
        *pplist = BuyNode(x);
    }
    else
    {
        ListNode* tail = *pplist;
        while (tail->next)
        {
            tail = tail->next;
        }
        tail->next = BuyNode(x);
    }
}

void PopBack(ListNode** pplist)//尾删
{

    //情况一:链表空
    //情况二:有一个结点
    //情况三:有多个结点
    if (*pplist == NULL)
    {
        return;
    }
    else if((*pplist)->next == NULL)
    {
        free(*pplist);
        *pplist = NULL;
    }
    else
    {
        ListNode *tail = *pplist;
        ListNode* prev = NULL;
        while (tail->next)
        {
            prev = tail;
            tail = tail->next;
        }
        free(tail);
        prev->next = NULL;
    }
}
void PushFront(ListNode** pplist, DataType x)//头插
{
    //情况一:链表是空--(创建一个结点)
    //情况二:链表非空
    if (*pplist == NULL)
    {
        *pplist = BuyNode(x);
        return;
    }
    else
    {
        ListNode* tmp = BuyNode(x);//先创建一个结点
        tmp->next = *pplist;//链接
        *pplist = tmp;
    }
}
void PopFront(ListNode** pplist)//头删
{
    //情况一:链表为空
    //情况二:只有一个结点
    //情况三:有多个结点
    if (*pplist == NULL)
    {
        return;
    }
    else if ((*pplist)->next == NULL)
    {
        free(*pplist);
        *pplist = NULL;
    }
    else
    {
        ListNode* del = *pplist;
        *pplist = del->next;
        free(del);
    }
}

ListNode* Find(ListNode* plist,DataType x)//查找一个结点
{
    //if (plist == NULL)----自己先写的
    //{
    //  return;
    //}
    //else
    //{
    //  ListNode* cur = plist;
    //  while (cur)
    //  {
    //      if (cur->data == x)
    //      {
    //          printf("找到了\n");
    //          return;
    //      }
    //      cur = cur->next;
    //  }
    //  printf("没找到\n");
    //}
    ListNode* cur = plist;
    while (cur)
    {
        if (cur->data == x)
        {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

void Insert(ListNode** pplist, ListNode* pos, DataType x)//在指定结点前面插入
{
    assert(pos);
    assert(*pplist);
    //情况一:在头结点前插入--(头插)
    //情况二:在中间结点插入
    if (pos == *pplist)
    {
        PushFront(pplist,x);
    }
    else
    {
        ListNode* prev = *pplist;
        while (prev->next != pos)
        {
            prev = prev->next;
        }
        ListNode* tmp = BuyNode(x);
        prev->next = tmp;
        tmp->next = pos;
    }
}

void Erase(ListNode** pplist, ListNode* pos)//删除结点
{
    assert(pos);
    assert(*pplist);
    //若链表只有一个结点-----(头删或者尾删)
    //情况一:要删除的是头结点(头删)
    //情况二:要删除的是中间结点
    //情况三:要删除的是尾结点(尾删)
    if (pos == *pplist)
    {
        PopFront(pplist);
    }
    else if (pos->next == NULL)
    {
        PopBack(pplist);
    }
    else
    {
        ListNode* prev = *pplist;
        while (prev->next !=pos)
        {
            prev = prev->next;
        }
        prev->next = pos->next;
        free(pos);
    }
}

void PrintList(ListNode* list)//打印链表
{
    ListNode* cur = list;
    while (cur)//遍历一边,cur为空时链表遍历完
    {
        printf("%d->", cur->data);
        cur = cur->next;
    }
    printf("NULL\n");
}

//以下测试
void TestList()
{
    ListNode* list = NULL;//定义一个链表
    PushBack(&list, 1);
    PushBack(&list, 2);
    PushBack(&list, 3);
    PushBack(&list, 4);
    PrintList(list);
    PopBack(&list);
    PopBack(&list);
    PopBack(&list);
    PopBack(&list);
    PrintList(list);
    PushFront(&list, 4);
    PushFront(&list, 3);
    PushFront(&list, 2);
    PushFront(&list, 1);
    PrintList(list);
    //PopFront(&list);
    //PopFront(&list);
    //PopFront(&list);
    PrintList(list);
    Find(list, 2);
    Find(list, 8);
}
void TestInsert()
{
    ListNode* list = NULL;
    PushBack(&list, 1);
    PushBack(&list, 2);
    PushBack(&list, 4);
    PrintList(list);
    ListNode* pos = Find(list, 4);
    Insert(&list, pos, 3);
    PrintList(list);

    pos = Find(list, 1);
    Insert(&list, pos, 0);
    PrintList(list);
}
void TestErase()
{
    ListNode* list = NULL;

    PushBack(&list, 1);
    PushBack(&list, 2);
    PushBack(&list, 3);
    PushBack(&list, 4);
    PrintList(list);
    ListNode* pos = Find(list, 1);
    Erase(&list, pos);
    PrintList(list);
    pos = Find(list, 3);
    Erase(&list, pos);
    PrintList(list);
    pos = Find(list, 4);
    Erase(&list, pos);
    PrintList(list);
}

主函数

#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"

int main()
{
    //TestList();
    //TestInsert();
    TestErase();
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值