数据结构链表1的基本常用接口

本文介绍了一个简单的单链表实现,包括节点的创建、插入、删除等基本操作,并提供了完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdlib.h>
#include<stdio.h>
typedef int LDataType;
//定义结点:数据+指针
typedef struct ListNode
{
LDataType _data;
struct ListNode* _next;
}ListNode;

//定义链表的结构体
typedef struct List
{
//保存第一个节点的地址
struct ListNode* _head;
}List;

struct ListNode* creatListNode(LDataType val)
{
struct ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->_data = val;
node->_next = NULL;
return node;
}

void ListInitial()
{
head->NULL;
if (lst == NULL)
{
return;
}
lst->head = NULL;
}

void ListPushBack(List* lst, LDataType val)
{
//插入的时候是两种情况,一种是空的,一种是非空
//空的就是需要去创建,修改指针的指向
//非空的就是遍历到最后一个位置,进行插入,遍历的标准就是哪一个下一个是空的
if (lst == NULL)
return;
if (lst->_head == NULL)
{
//插入第一个节点
//创建节点
lst->_head=creatListNode(val);
}
else
{
//从第一个节点开始遍历找到最后一个节点
struct ListNode* tail = lst->_head;
while (tail->_next != NULL)
{
tail = tail->_next;
}
tail->_next=creatListNode(val);
}
}

//尾删
void ListPopBack(List* lst)
{
if (lst == NULL || lst->_head == NULL)
return;
//遍历,找到最后一个节点
struct ListNode* prev = NULL;
struct ListNode* tail = lst->_head;
while(tail->_next!=NULL)
{
prev = tail;
tail = tail->_next;
}
//释放最后一个节点
free(tail);
//更新next
if (lst->_head->_next==NULL)//只有一个节点
{
lst->_head == NULL;
}
else
prev->_next = NULL;
}

//头插
// 单链表的头插
void ListPushFront(List* lst, LDataType val)
{
if (lst == NULL)
return;
//创建节点
struct ListNode* node = creatListNode(val);
//node head
node->_next = lst->_head;
lst->_head = node;
}

//头删
void ListPopFront(List* lst)
{
//首先进行的是判空的操作
if (lst == NULL || lst->_head == NULL)
return;
struct ListNode* next = lst->_head->next;
free(lst->_head);
lst->_head = next;

}

//给某一个节点插入新的数据
void ListInsertAfter(ListNode* node, LDataType val)
{
if (node == NULL)
return;
//创建新的节点
ListNode* newNode = creatListNode(val);
ListNode* next = node->_next;
node->_next = newNode;
newNode->_next = next;
}

//删除某一个数据 遍历 给一个位置。删除该位置的下一个位置
void ListEraseAfter(ListNode* node)
{
if (node == NULL || node->_next == NULL)
return;
struct ListNode* next = node->_next;
struct ListNode* nextnext = next->_next;
//释放节点
free(next);
node->_next = nextnext;
}

//查找
struct ListNode* ListFind(List* lst, LDataType val)
{
//遍历
if (node == NULL || node->_next == NULL)
return NULL;
//从头结点开始遍历
struct ListNode* cur = lst->head;
while (cur)
{
if (cur->_data == val)
return cur;
cur = cur->_next;
}
return NULL;
}

//销毁 注意位置的记录
void ListDestory(List* lst)
{
if (lst == NULL )
return ;
//确定指针的位置
ListNode* cur = lst->_next;
while (cur)
{
//保存下一个结点的位置。
ListNode* next = cur->_next;
//释放当前姐弟啊
free(cur);
//更新到下一个节点的位置。
cur = next;
}
lst->_head=NULL;
}

//删除某一个节点
void ListErase(ListNode* node)
{
//需要记录位置
if (node == NULL || node->_next == NULL)
return NULL;
//记录该节点的前一个位置和后一个位置 prev node next
struct ListNode* prev = head->_next;
struct ListNode* next = node->_next;
while (next)
{
prev->_next = next;
free(node);
}
return NULL;
}
void test()
{
List lst;
ListInit(&lst);
/*ListPushBack(&lst, 1);
ListPushBack(&lst, 2);
ListPushBack(&lst, 3);
ListPushBack(&lst, 4);
ListPushBack(&lst, 5);

ListPopBack(&lst);
ListPopBack(&lst);
ListPopBack(&lst);
ListPopBack(&lst);
ListPopBack(&lst);

*/
//头插
//ListPushFront(&lst, 1);
//ListPushFront(&lst, 2);
//ListPushFront(&lst, 3);
//ListPushFront(&lst, 4);
//ListPushFront(&lst, 5);

头删
//ListPopFront(&lst);
//ListPopFront(&lst);
//ListPopFront(&lst);
//ListPopFront(&lst);
//ListPopFront(&lst);

ListNode* cur = ListFind(&lst,3);
ListEraseAfter(cur);
ListInsertAfter(cur, 4);

}

int main()
{
test();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值