带头节点的单链表练习(写加注释花了5小时,已废)

2024-04-18 23:36

本文主要是介绍带头节点的单链表练习(写加注释花了5小时,已废),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.test.c

2.LinList.c

3.LinList.h


1.test.c

单链表的操作

#include "LinList.h"
//head->a0(头节点)->a1->...->ai->...->an
int main()
{SLNode* head;int i;DataType x, y;ListInitiate(&head);//初始化链表for (i = 1; i < 11; i++){ListInsert(head, i, (DataType)i);//在第i个节点前插入i,i>=1}ListDelete(head, 4, &x);//删除第4个节点for (i = 1; i <= ListLength(head); i++)//ListLength(head)当前元素个数{ListGet(head, i, &y);//取元素printf("%d ", y);}Destroy(&head);//撤销单链表return 0;
}

2.LinList.c

单链表函数具体实现

#include "LinList.h"void ListInitiate(SLNode** head)//初始化链表,head的值改变了,所以要传head地址
{*head = (SLNode*)malloc(sizeof(SLNode));assert(*head);(*head)->next = NULL;
}bool ListInsert(SLNode* head, int i, DataType x)//在第i个节点前插入x,i>=1
{SLNode* L = head;int j = 0;//当前L指向的第j个节点while (L->next != NULL&&j<i-1)//循环结束时L指向第i-1个节点{//当L->next = NULL时,L已是最后一个节点,//若j = i-1,在NULL前插入节点,若j != i-1,第i个节点不存在L = L->next;j++;}if (j != i - 1){printf("插入元素的位置参数出错!\n");return false;}SLNode* s = (SLNode*)malloc(sizeof(SLNode));assert(s);s->data = x;s->next = L->next;L->next = s;return true;
}DataType ListDelete(SLNode* head, int i, DataType* x)//删除第i个节点
{SLNode* L = head;int j = 0;//当前L指向的第j个节点while (L->next != NULL&&L->next->next != NULL && j < i-1)//循环结束时L指向第i-1个节点{//L->next->next = NULL时,//若j = i-1,删除最后一个节点,若j != i-1,要删除的节点不存在L = L->next;j++;}if ((j != i - 1)||(L->next == NULL))//当空列表时,return false;{printf("要删除的第%d个节点不存在\n",i);return false;}*x = L->next->data;SLNode* s = L->next;L->next = L->next->next;free(s);s = NULL;return *x;
}int ListLength(SLNode* head)//ListLength(head)当前元素个数
{if (head == NULL){return 0;}SLNode* p = head;//习惯,防止后面找不到头节点int count = 0;while (p->next != NULL){p = p->next;count++;}return count;
}bool ListGet(SLNode* head, int i, DataType* x)//取元素
{SLNode* p = head;//习惯,防止后面找不到头节点if (i<1 || i>ListLength(head)){printf("取元素的位置参数错误!\n");return false;}while (i--){p = p->next;}*x = p->data;return true;
}bool Destroy(SLNode** head)//撤销单链表,head的值改变了,所以要传head地址
{int i = ListLength(*head) + 1;//头节点也要撤销SLNode* p = *head;SLNode* p1 = NULL;while (i--){p1 = p->next;free(p);p = p1;}*head = NULL;return true;
}

3.LinList.h

引入头文件,#deifne定义,typedef定义,函数声明

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int DataType;
typedef struct Node
{DataType data;struct Node* next;
}SLNode;void ListInitiate(SLNode** head);//初始化链表
bool ListInsert(SLNode* head, int i, DataType x);//在第i个节点前插入x,i>=1
DataType ListDelete(SLNode* head, int i, DataType* x);//删除第i个节点
int ListLength(SLNode* head);//ListLength(head)当前元素个数
bool ListGet(SLNode* head, int i, DataType* x);//取元素
bool Destroy(SLNode** head);//撤销单链表

这篇关于带头节点的单链表练习(写加注释花了5小时,已废)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916079

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div