C/C++实现单链表的基本操作(严书p19的操作函数用于链表)

2023-10-12 18:08

本文主要是介绍C/C++实现单链表的基本操作(严书p19的操作函数用于链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先是常用函数的定义,预定义常量和类型,后面要用
文件comfun.h

#ifndef COMFUN_H
#define COMFUN_H
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define overlow -2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
using namespace std;
//判断是否相等
int equal(int c1,int c2)
{if(c1==c2) return TRUE;else return FALSE;
}
//a<,=,>b返回-1,0,1
int comp(int a,int b)
{if(a==b) return 0;else return (a-b)/abs(a-b); //整数绝对值
}
//十进制整型输出元素的值
void print(int c)
{printf("%d ",c);
}
//十进制整型输出元素的值(引用)
void print1(int c)
{printf("%d ",c);
}
//字符格式输出元素的值
void print2(int c)
{printf("%c ",c);
}
#endif

基本操作函数的代码:
LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H
#include"comfun.h"

创建结构体

typedef struct LNode
{int data;LNode *next;
}LNode,*LinkList; //结构体变量,指针
//typedef LNode* LinkList;

1.创建空表L

//创建空表
void InitList(LinkList &L)//2.3
{L=(LinkList)malloc(sizeof(LNode));if(!L) //分配失败exit(overlow);L->next=NULL; //头结点指针域为空
}

2.线性表L已经存在,将L重置为空表

//线性表L已经存在,将L重置为空表
void ClearList(LinkList L)
{LinkList p=L->next; //p指向第一个结点L->next=NULL; //头节点指针域为空DestroyList(p);
}

3.线性表L已经存在,销毁线性表

//线性表L已经存在,销毁线性表
void DestroyList(LinkList L)
{LinkList q;while(L) //L非空,每次往后移动q,然后释放前面的L{q=L->next; //q指向首元结点free(L); //释放头结点L=q; //L指向原首元结点}
}

4.线性表L已经存在,若L为空表,返回true,否则返回false

//线性表L已经存在,若L为空表,返回true,否则返回false
int ListEmpty(LinkList L)
{if(L->next) return FALSE;else return TRUE;
}

5.线性表L已经存在,返回L中数据元素的个数

//线性表L已经存在,返回L中数据元素的个数
int ListLength(LinkList L)
{int i=0; //计数器初值为0LinkList p=L->next;while(p) //未到表尾{i++;p=p->next;}return i;
}

6.用e返回L中第i个元素的值

//L为带头结点单链表的头指针,第i个元素存在时,其值赋给e并返回ok
int GetElem(LinkList L,int i,int &e) //2.8
{int j=1; //计数器初值为1LinkList p=L->next;while(p&&j<i){p=p->next;++j;}if(!p||j>i) return ERROR; //没找到/超出长度e=p->data;return OK; //return 1
}

7.若cur_e是L的数据元素且不是第一个,用pre_e返回它的前驱

//若cur_e是L的数据元素且不是第一个,用pre_e返回它的前驱,返回ok
int PriorElem(LinkList L,int cur_e,int &pre_e)
{LinkList q,p=L->next; //p指向第一个结点while(p&&p->next) //p所指结点有后继不为空{q=p->next; //q指向p的后继if(q->data==cur_e) //p的后继为cur_e{pre_e=p->data; //cur_e的前驱为pre_ereturn OK;}p=q; //p的后继不为cur_e,后移}return ERROR; //操作失败返回ERROR
}

8.若cur_e是L的数据元素且不是最后一个,用next_e返回它的后继

//若cur_e是L的数据元素且不是最后一个,用next_e返回它的后继,返回ok
int NextElem(LinkList L,int cur_e,int &next_e)
{LinkList p=L->next; //p指向第一个结点while(p&&p->next) //p所指结点有后继不为空{if(p->data==cur_e) //p所指结点值为cur_e{next_e=p->next->data;return OK;}p=p->next; //p所指结点值不为cur_e,p指向下一个结点}return ERROR;
}

9.在L中第i个位置之前插入元素e

//在L中第i个位置之前插入元素e
int ListInsert_L(LinkList L,int i,int e)//2.9
{LinkList p=L;int j=0;LinkList s;while(p&&j<i-1){j++;p=p->next;}if(!p||j>i-1) //i<1或大于表长return ERROR;s=(LinkList)malloc(sizeof(LNode)); //分配新结点,将其插入L中s->data=e; //e赋给新结点s->next=p->next; //s指向p的后继p->next=s; //p的新后继为sreturn OK;
}

10.L中删除第i个元素,并由e返回其值

int ListDelete_L(LinkList L,int i,int &e)
{LinkList q,p=L; //p指向头结点int j=0;while(p->next&&j<i-1){j++;p=p->next;}if(!p->next||j>i-1) return ERROR;q=p->next; //q指向待删除结点p->next=q->next;e=q->data;free(q);return OK; //删除成功
}

11.依次对L的每个元素调用函数visit()

//依次对L的每个元素调用函数visit()
void ListTraverse(LinkList L,void(*visit)(int))
{LinkList p=L->next;while(p) //p所指结点存在{visit(p->data);p=p->next;}cout<<endl;
}
#endif

自己创建一个L.cpp并包含上面的头文件#include"LinkList.h"
在主函数中即可测试这些操作函数

这篇关于C/C++实现单链表的基本操作(严书p19的操作函数用于链表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont