单链表(非通用链表)-C语言

本文详细介绍了一种使用C语言实现单链表的方法,包括创建、添加、删除节点,查找元素,获取链表长度,清空及销毁链表等操作。通过具体的代码示例,展示了如何在实际应用中有效管理和操作链表数据结构。

myList.h头文件

#pragma once
//单链表的实现(C语言)
#define SUCCESS -1
#define ERROR     0
#define STATUS int
typedef struct node
{
	int data;
	struct node* next;
}NODE_T;

//创建链表头节点
NODE_T* createHead();

//头部添加节点
STATUS addToHead(NODE_T* head, NODE_T *newNode);

//尾部添加节点
STATUS addToTail(NODE_T* head, NODE_T *newNode);

//指定位置添加节点
STATUS addSpecify(NODE_T* head, NODE_T *newNode, int i);

//删除指定位置的元素
STATUS delSpecify(NODE_T* head, int i);

//删除指定元素
STATUS delElem(NODE_T* head, int data);

//查找指定位置元素
STATUS searchSpecify(NODE_T* head, int i, int *data);

//查找元素在链表中的位置
STATUS searchPosition(NODE_T* head,  int data);

//获取链表长度
STATUS getLength(NODE_T *head);

//清空链表
STATUS clearList(NODE_T *head);

//销毁链表
STATUS destroyList(NODE_T *head);

//遍历链表
void showList(NODE_T *head);

myList.cpp

```c
#include "myList.h"
#include <stdlib.h>
#include <stdio.h>
//创建链表头节点
NODE_T* createHead()
{
	NODE_T* head = (NODE_T*)malloc(sizeof(NODE_T));
	if (!head)
		return ERROR;
	head->data = 0;
	head->next = NULL;
	return head;
}

//头部添加节点
STATUS addToHead(NODE_T* head, NODE_T* newNode)
{
	head->data += 1;
	if (head->next)							/*链表不为空*/
	{
		newNode->next = head->next;
		head->next = newNode;
	}
	else {											/*链表为空*/
		head->next = newNode;
		newNode->next = NULL;
	}
	return SUCCESS;
}

//尾部添加节点
STATUS addToTail(NODE_T* head, NODE_T* newNode)
{
	head->data += 1;
	NODE_T* tmp = head;
	while (tmp->next)						/*单链表里常用的遍历方法*/
	{
		tmp = tmp->next;
	}
	tmp->next = newNode;
	newNode->next = NULL;
	return SUCCESS;
}

//指定位置添加节点
STATUS addSpecify(NODE_T* head, NODE_T* newNode, int i)
{
	if (i<0 || i>head->data)
	{
		printf("插入位置出错\n");
		return ERROR;
	}
	head->data += 1;
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if (count == i)
			break;
	}
	newNode->next = tmp->next;							/*添加新的节点*/
	tmp->next = newNode;
	return SUCCESS;
}

//删除指定位置的元素
STATUS delSpecify(NODE_T* head, int i)
{
	if (i<0 || i>head->data)
		return ERROR;
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if ((count+1) == i)
			break;
	}
	printf("被删除的元素:%d\n", tmp->next->data);
	tmp->next = tmp->next->next;                                  /*删除节点*/
	free(tmp->next);
	return SUCCESS;
}

//删除指定元素
STATUS delElem(NODE_T* head, int data)
{
	head->data -= 1;
	NODE_T* tmp = head;
	while (tmp->next)
	{
		tmp = tmp->next;
		if (tmp->next->data == data)
		{
			printf("被删除的元素:%d\n", tmp->next->data);
			tmp->next = tmp->next->next;
			free(tmp->next);
			break;
		}
	}
	return SUCCESS;
}

//查找指定位置元素
STATUS searchSpecify(NODE_T* head, int i, int* data)
{
	if (i<0 || i>head->data)
		return ERROR;
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if (count == i)
		{
			printf("第%d个元素是:%d\n", i, tmp->data);
			*data = tmp->data;
			break;
		}
	}
	return 0;
}

//查找元素在链表中的位置
STATUS searchPosition(NODE_T* head, int data)
{
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if (tmp->data == data)
		{
			printf("%d在链表里的位置:%d\n", data, count);
			return count;
		}
	}
	return ERROR;
}

//获取链表长度
STATUS getLength(NODE_T* head)
{
	return head->data;
}

//清空链表
STATUS clearList(NODE_T* head)
{
	NODE_T* tmp1 = head, *tmp2;				/*一个指向当前要删除的节点,另一个指向删除节点的下一个节点*/
	while (tmp1->next)
	{
		tmp1 = tmp1->next;
		tmp2 = tmp1->next->next;
		free(tmp1);
		tmp1 = tmp2;
	}
	return SUCCESS;
}

//销毁链表
STATUS destroyList(NODE_T* head)
{
	clearList(head);
	free(head);
	return 0;
}

//遍历链表
void showList(NODE_T* head)
{
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		printf("链表第%d个元素是%d\n", count,tmp->data);
	}
}

测试main.cpp:

//main.cpp
#include "myList.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
	NODE_T* head = createHead();								   /*得到链表头节点*/
	NODE_T* node1 = (NODE_T*)malloc(sizeof(NODE_T));
	if (!node1)
		return -1;
	node1->data = 10;
	addToHead(head,node1);											/*链表头部添加一个节点*/
	NODE_T* node2 = (NODE_T*)malloc(sizeof(NODE_T));
	if (!node2)
		return -1;
	node2->data = 20;
	addSpecify(head, node2,1);											/*链表指定位置添加一个节点*/
	NODE_T* node3 = (NODE_T*)malloc(sizeof(NODE_T));
	if (!node3)
		return -1;
	node3->data = 30;
	addSpecify(head, node3, 2);										/*链表指定位置添加一个节点*/
	showList(head);															/*遍历链表*/
	int data = 0;
	searchSpecify(head, 3, &data);									/*查找链表里第三个元素的值*/
	searchPosition(head, 10);											/*查找数据10在链表里的位置*/
	return 0;
}

结果:
在这里插入图片描述

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值