/*===============================================
* 文件名称:linklist.c
* 创 建 者:
* 创建日期:2022年12月02日
* 描 述:
================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include "linklist.h"
//为头节点申请空间
NODE *create_linklist(void){
NODE *head = (NODE *)malloc(sizeof(NODE));
//判断是否申请成功
if(NULL == head)
return NULL;
//为元素赋值
head->data = -1;
head->next = NULL;
return head;
}
//判断链表是否是空
int linklist_is_mepty(NODE *head){
//判断链表是否存在
if(NULL == head)
return -1;
//判断头节点的next是否为NULL 如果是那链表就为空
return((head->next == NULL) ? 1:0);
}
//计算节点个数
int get_linklist_length(NODE *head){
int len = 0;
NODE *p = head;
//判断链表是否是空
if(NULL == head)
return -1;
//遍历链表
while(p->next != NULL){
p = p->next;
len++;
}
return len;
}
//插入节点 按下标
int insert_linklist(NODE *head, int pos, data_t data){
//判断头节点是否存在
if(NULL == head)
return -1;
NODE *p = head;
//判断pos位置的合法性
int len = get_linklist_length(head);
if(pos < 0 || pos > len)
return -1;
//找到插入前面的那个元素
for(int i = 0; i < pos; i++)
p = p->next;
//保存原本该节点指向后一个节点的地址
NODE *p1 = p->next;
//为新节点申请空间
p->next = create_linklist();
//判断是否申请成功
if(NULL == p->next)
return -1;
//把新节点插入
p = p->next;
p->data = data;
p->next = p1;
return 0;
}
//删除节点 按下标
int delete_linklist(NODE *head, int pos){
//检测头节点是否存在
if(linklist_is_mepty(head))
return -1;
//检测pos位置的合法性
int len = get_linklist_length(head);
if(pos < 0 || pos >= len)
return -1;
//找到pos位置的上一个节点
NODE *p = head;
for(int i = 0; i < pos; i++){
p = p->next;
}
//创建p1 p1进入pos位置
NODE *p1 = p->next;
//让pos位置的上一个节点的next 指向pos位置的下一个节点
p->next = p1->next;
//销毁pos位置的节点
free(p1);
p1 = NULL;
return 0;
}
//按元素查询下标 返回该节点的上一个地址
NODE *select_linklist_bydata(NODE *head, data_t data){
//判断头节点是否存在
if(linklist_is_mepty(head))
return NULL;
NODE *p = head->next;
NODE *p1 = p;
//遍历整个链表
while(p1->next != NULL){
if(p1->data != data){//如果不相同向后移动
p = p->next;
p1 = p->next;
}
else{
return p;
}
}
return NULL;
}
//删除节点 按元素
int delete_linklist_bydata(NODE *head, data_t data){
//获取删除节点的上一个节点地址
NODE *p = select_linklist_bydata(head, data);
//错误处理
if(NULL == p)
return -1;
//删除data元素节点
NODE *p1 = p->next;
p->next = p1->next;
free(p1);
p1 = NULL;
return 0;
}
//打印所有节点
int print_linklist(NODE *head){
//判断链表是否是空
if(linklist_is_mepty(head))
return -1;
//打印
NODE *p = head->next;
int i = 0;
while(p != NULL){
printf("list[%d]:%d\n", i, p->data);
p = p->next;
i++;
}
return 0;
}
//清空链表
int empty_linklist(NODE **head){
//检测头节点是否存在
if(NULL == *head)
return -1;
int len = get_linklist_length(*head);
NODE *p = (*head)->next;
NODE *p1 = p;
for(int i = 0; i < len; i++){
p = p->next;
free(p1);
p1 = p;
}
(*head)->next = NULL;
return 0;
}
//修改链表节点元素 按值
int update_linklist_bydata(NODE *head, data_t old_data, data_t new_data){
//查询上一个节点的下标
NODE *p = select_linklist_bydata(head, old_data);
//判断是否查询到
if(NULL == p)
return -1;
//进入修改值的节点位置
p = p->next;
p->data = new_data;
return 0;
}
//销毁全部节点
int destroy_linklist(NODE **head){
//销毁除了头节点的所有节点
if(empty_linklist(head))
return -1;
//销毁头节点
free(*head);
*head = NULL;
return 0;
}
//链表逆序
int reverse_linklist(NODE *head){
if(linklist_is_mepty(head))
return -1;
//获取链表长度
int len = get_linklist_length(head);
//进行头插
for(int i = 0; i < len - 1; i++){
NODE *p = head;
//循环到最后一个节点的前一个节点
while(p->next->next != NULL){
p = p->next;
}
//将最后一个节点重新排列排到第5排到第0 第2个第5排到第1
insert_linklist(head, i, p->next->data);
delete_linklist(head, len);
}
return 0;
}
xsqjgkl
- 粉丝: 1
- 资源: 10
最新资源
- 千峰办公助手,让办公随心应手,批量任务,OCR图片文字识别,文字处理与PDF工具
- 微信小程序云笔记.zip
- 本笔记本基于预训练模型 YOLOv3 实现了对象检测 该模型架构称为“DarkNet”,最初大致基于 VGG-16 模型 .zip
- 本视频教程系列逐步向您展示如何推断和训练您自己的自定义 YOLOv4 模型.zip
- redis.conf 配置文件
- 本页适用于 SlimYOLOv3更窄、更快、更适合无人机实时应用.zip
- 本项目目的是将voc注释xml文件转换为yolo-darknet训练文件格式.zip
- YOLOv8标记乳房X光检查数据集
- 构建一个Android App,用于直接在手机上部署YOLO V3源代码 .zip
- unity - 动画模块之卡片堆叠切换预制体,可以加图片,可以调距离,可以调堆叠方向
- 在WPF中使用ObservableCollection<T>的示例
- 根据人们与他人的距离将他们分为高风险和低风险 .zip
- 基于UE4实现的桌面宠物代码
- 检测可供汽车使用的免费停车场.zip
- C#.net钉钉消息发送样例
- 模型压缩-YOLOv3 搭配多个轻量级主干(ShuffleNetV2 HuaWei GhostNet)、注意力、剪枝和量化.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈