数据结构C //线性表(顺序表)ADT结构及相关函数

news2025/4/6 17:25:22

数据结构(C语言版)严蔚敏 吴伟民

线性表(顺序表)ADT结构及相关函数

环境:Linux Ubuntu(云服务器)
工具:vim

 

代码块(头文件,函数文件,主文件)
list.h头文件
/*************************************************************************
	> File Name: list.h
	> Author: 
	> Mail: 
	> Created Time: Thu 05 Sep 2024 02:10:41 PM CST
 ************************************************************************/

#ifndef _LIST_H
#define _LIST_H

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define NOEXIST -3

typedef int Status;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef int ElemType;

typedef struct {
	ElemType *elem;
	int length;
	int listsize;
} List;

#define DATAFMT "%d"

Status InitList(List &L);

Status DestroyList(List &L);

Status ClearList(List &L);

Status ListEmpty(List L);

int ListLength(List L);

Status GetElem(List L, int i, ElemType &e);

int equal(ElemType a, ElemType b);

Status LocateElem(List L, ElemType e, int equal(ElemType, ElemType));

Status PriorElem(List L, ElemType cur_e, ElemType &pre_e);

Status NextElem(List L, ElemType cur_e, ElemType &next_e);

Status ListInsert(List &L, int i, ElemType e);

Status ListDelete(List &L, int i, ElemType &e);

Status visit(ElemType e);

Status ListTraverse(List L, Status visit(ElemType));

void InputList(List &L, int n);

void unionList(List &La, List Lb);

void MergeList(List La, List Lb, List &Lc);

#endif
list.c函数文件
/*************************************************************************
	> File Name: list.c
	> Author: 
	> Mail: 
	> Created Time: Thu 05 Sep 2024 02:16:38 PM CST
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "list.h"

Status InitList(List &L) {
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if(!L.elem) exit(OVERFLOW);
	
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	
	return OK;
}//InitList

Status DestroyList(List &L) {
	free(L.elem);
	
	return OK;
}//DestroyList

Status ClearList(List &L) {
	for(int i = 0; i < L.listsize; i++) {
		L.elem[i] = 0;
	}
	
	L.length = 0;
	
	return OK;
}//ClearList

Status ListEmpty(List L) {
	return L.length == 0 ? TRUE : FALSE;
}//ListEmpty

int ListLength(List L) {
	return L.length;
}//ListLength

Status GetElem(List L, int i, ElemType &e) {
	if(i < 1 || i > ListLength(L)) {
		return ERROR;
	}

	e = L.elem[i-1];
	
	return OK;
}//GetElem

int equal(ElemType a, ElemType b) {
	return a == b ? TRUE : FALSE;
}//equal

Status LocateElem(List L, ElemType e, int equal(ElemType, ElemType)) {
	for(int i = 0; i < ListLength(L); i++) {
		if(equal(e, L.elem[i])) {
			return i + 1;
		}
	}

	return FALSE;
}//LocateElem

Status PriorElem(List L, ElemType cur_e, ElemType &pre_e) {
	if(L.elem[0] == cur_e) {
		return ERROR;
	}

	int i;
	for(i = 0; i < ListLength(L); i++) {
		if(L.elem[i] == cur_e) {
			break;
		}
	}
	if(i == ListLength(L)) {
		return NOEXIST;
	}

	pre_e = L.elem[i-1];
	
	return OK;
}//PriorElem

Status NextElem(List L, ElemType cur_e, ElemType &next_e) {
	if(L.elem[L.length-1] == cur_e) {
		return ERROR;
	}

	int i;
	for(i = 0; i < ListLength(L); i++) {
		if(L.elem[i] == cur_e) {
			break;
		}
	}
	if(i == ListLength(L)) {
		return NOEXIST;
	}

	next_e = L.elem[i+1];

	return OK;
}//NextElem

Status ListInsert(List &L, int i, ElemType e) {
	if(i < 1 || i > L.length + 1) {
		return ERROR;
	}
	if(L.length >= L.listsize) {
		ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	ElemType *q = &(L.elem[i-1]);
	for(ElemType *p = &(L.elem[L.length-1]); p >= q; --p) {
		*(p + 1) = *p;
	}
	*q = e;
	++L.length;
	return OK;
}//ListInsert

Status ListDelete(List &L, int i, ElemType &e) {
	if(i < 1 || i > L.length) {
		return ERROR;
	}
	ElemType *p = &(L.elem[i-1]);
	e = *p;
	ElemType *q = &(L.elem[L.length - 1]);
	for(++p; p <= q; ++p) {
		*(p - 1) = *p;
	}
	--L.length;
	return OK;
}//ListDelete

Status visit(ElemType e) {
	if(!e) return ERROR;
	printf(DATAFMT, e);
	printf(" ");
	return OK;
}//visit

Status ListTraverse(List L, Status visit(ElemType)) {
	printf("List traverse: ");
	for(int i = 0; i < L.length; i++) {
		if(!visit(L.elem[i])) {
			return FALSE;
		}
	}
	printf("\n");
	return OK;
}//ListTraverse

void InputList(List &L, int n) {
	if(n >= L.listsize) {
		ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	printf("Enter %d List Elem: ", n);
	for(int i = 0; i < n; i++) {
		scanf(DATAFMT, &L.elem[i]);
	}
	L.length = n;
}//InputList

void unionList(List &La, List Lb) {
	int La_len = ListLength(La);
	int Lb_len = ListLength(Lb);
	int i;
	ElemType e;
	for(i = 1; i <= Lb_len; i++) {
		GetElem(Lb, i, e);
		if(!LocateElem(La, e, equal)) {
			ListInsert(La, ++La_len, e);
		}
	}
}//unionList

void MergeList(List La, List Lb, List &Lc) {
	InitList(Lc);

	int i = 1, j = 1, k = 0;
	int La_len = ListLength(La);
	int Lb_len = ListLength(Lb);

	ElemType ai, bj;
	while((i <= La_len) && (j <= Lb_len)) {
		GetElem(La, i, ai);
		GetElem(Lb, j, bj);
		if(ai <= bj) {
			ListInsert(Lc, ++k, ai);
			++i;
		}
		else {
			ListInsert(Lc, ++k, bj);
			++j;
		}
	}
	while(i <= La_len) {
		GetElem(La, i++, ai);
		ListInsert(Lc, ++k, ai);
	}
	while(j <= Lb_len) {
		GetElem(Lb, j++, bj);
		ListInsert(Lc, ++k, bj);
	}
}//MergeList
main.c主文件
/*************************************************************************
	> File Name: main.c
	> Author: 
	> Mail: 
	> Created Time: Thu 05 Sep 2024 02:18:11 PM CST
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#include "list.c"

int main() {
	List L;
	//Initialize the list
	InitList(L);

	//Input the list and traverse it
	InputList(L, 10);
	ListTraverse(L, visit);

	//Determine whether the list is empty
	if(ListEmpty(L)) {
		printf("List is empty!\n\n");
	}
	else {
		printf("List is not empty!\n\n");
	}

	//Clear the list
	printf("Prepare clear the list...\n");
	if(ClearList(L)) {
		printf("List is clear!\n");
	}
	else {
		printf("List is not clear!\n");
	}
	//After clearing the list, check whether the list is empty
	if(ListEmpty(L)) {
		printf("List is empty!\n\n");
	}
	else {
		printf("List is not empty!\n\n");
	}

	//Input the list again
	InputList(L, 10);
	printf("\n");

	//Input the number of the element you want to get
	//Here is 3.
	int num1;
	printf("Enter the number of the element you want to get: ");
	scanf("%d", &num1);
	ElemType e1;
	GetElem(L, num1, e1);
	printf("No.%d Elem is ", num1);
	printf(DATAFMT, e1);
	printf(".\n\n");

	//Input the location of the element you want to get
	//Here is 99
	ElemType elem;
	printf("Enter the element you want to locate: ");
	scanf(DATAFMT, &elem);
	if(LocateElem(L, elem, equal)) {
		printf("The position of the element ");
		printf(DATAFMT, elem);
		printf(" is %d\n\n", LocateElem(L, elem, equal));
	}
	else {
		printf("The list doesn't have the elem\n\n");
	}

	//Input the element for which you want to get the priority element
	//Here is 5
	ElemType num2, e2;
	printf("Enter the element for which you want to get the priority element: ");
	scanf(DATAFMT, &num2);
	if(PriorElem(L, num2, e2)) {
		printf("The prior elem of ");
		printf(DATAFMT, num2);
		printf(" is ");
		printf(DATAFMT, e2);
		printf(".\n\n");
	}
	else if(PriorElem(L, num2, e2) == -3) {
		printf("The elem ");
		printf(DATAFMT, num2);
		printf(" dosen't exist!\n\n");
	}
	else {
		printf("The elem %d doesn't have prior elem.\n\n", num2);
	}

	//Input the element for which you want to get the next element
	//Here is 9
	ElemType num3, e3;
	printf("Enter the element for which you want to get the next element: ");
	scanf(DATAFMT, &num3);
	if(NextElem(L, num3, e3)) {
		printf("The next elem of ");
		printf(DATAFMT, num3);
		printf(" is ");
		printf(DATAFMT,  e3);
		printf(".\n\n");
	}
	else if(NextElem(L, num3, e3) == -3) {
		printf("The elem ");
		printf(DATAFMT, num3);
		printf(" dosen't exist!\n\n");
	}
	else {
		printf("The elem %d doesn't have next elem.\n\n", num3);
	}

	//Input the element and the location you want to insert
	//Here is 18 and 6
	int num4;
	ElemType e4;
	printf("Enter the element you want to insert: ");
	scanf(DATAFMT, &e4);
	printf("Enter the location you want to insert: ");
	scanf("%d", &num4);
	printf("Insert elem %d to postion %d...\n", e4, num4);
	ListInsert(L, num4, e4);
	ListTraverse(L, visit);
	printf("\n");

	//Input the number of the element you want to delete
	//Here is 2
	int num5;
	printf("Enter the number of the element you want to delete: ");
	scanf("%d", &num5);
	ElemType e5;
	printf("Prepare delete the No.%d elem...\n", num5);
	ListDelete(L, num5, e5);
	printf("The delete elem is ");
	printf(DATAFMT, e5);
	printf(".\n");
	ListTraverse(L, visit);
	printf("\n");

	//Destroy the list
	printf("Prepare destroy the list...\n");
	if(DestroyList(L)) {
		printf("List is destroyed!\n");
	}
	else {
		printf("List is not destroyed!\n");
	}

    //Use unionList Methods
	List La1, Lb1;
	InitList(La1);
	InitList(Lb1);

	InputList(La1, 5);
	ListTraverse(La1, visit);
	InputList(Lb1, 5);
	ListTraverse(Lb1, visit);

	printf("\nUnion List La1 and Lb1...\n");
	unionList(La1, Lb1);
	ListTraverse(La1, visit);
	printf("\n");

	//Use MergeList Methods
	List La2, Lb2, Lc;
	InitList(La2);
	InitList(Lb2);

	InputList(La2, 5);
	ListTraverse(La2, visit);
	InputList(Lb2, 5);
	ListTraverse(Lb2, visit);

	printf("\nMerge List La2 and Lb2...\n");
	MergeList(La2, Lb2, Lc);
	ListTraverse(Lc, visit);

	return 0;
}
实现结果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM字节码与局部变量表

文章目录 局部变量表javap字节码指令分类 指令指令数据类型前缀加载和存储指令加载常量算术指令其他指令 字节码示例说明 局部变量表 每个线程的帧栈是独立的&#xff0c;每个线程中的方法调用会产生栈帧&#xff0c;栈帧中保存着方法执行的信息&#xff0c;例如局部变量表。 …

Alinx MPSoC驱动开发第11章异步IO实验按下按键报IO Possibile后结束进程

实验现象 使用Alinux官方提供的驱动和应用程序代码&#xff0c;petalinux工程基于自身需要进行了一定的修改&#xff08;主要是SD卡根文件系统&#xff09;。在把petalinux工程编译后打包的boot.scr、BOOT.BIN、image.ub放入FAT分区&#xff0c;把驱动程序与应用程序放在NFS共享…

万界星空科技电池MES具体功能及解决方案

电池的生产工艺具有高度的复杂性和精细度。从原材料的准备、电池的组装到最终的测试与包装&#xff0c;每一道工序都需要严格控制&#xff0c;以确保产品的质量和性能。 万界星空科技在电池MES&#xff08;制造执行系统&#xff09;领域提供了全面的解决方案&#xff0c;这些解…

JavaWeb项目打包、部署至Tomcat并启动的全程指南(图文详解)

前言 我们想要部署一个javaWeb项目到tomcat上&#xff0c;需要了解一些概念 什么是tomcat&#xff1f; Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;下的一个开源项目&#xff0c;主要用于实现 Java Servlet、JavaServer Pages&#xff08;…

在 PyCharm 中配置 Anaconda 环境

1. 安装 Anaconda 如果尚未安装 Anaconda&#xff0c;你可以从 Anaconda 官方网站 下载或者从清华镜像网站下载并安装适合你操作系统的版本。 2. 创建 Anaconda 虚拟环境 打开 Anaconda Prompt&#xff08;Windows&#xff09;或终端&#xff08;macOS/Linux&#xff09;。 …

EmguCV学习笔记 VB.Net 11.6 图像分割

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

如何升级用 Helm 安装的极狐GitLab Runner?

本分分享如何对 Helm 安装的 Runner 进行升级。整个过程分为三步&#xff1a;1、确定 Runner 最新版本或者想要升级的版本是否存在&#xff1b;2、用 Helm upgrade 命令进行升级&#xff1b;3、升级确认。 极狐GitLab 为 GitLab 的中国发行版&#xff0c;中文版本对中国用户更…

【西电电装实习】6. 手装无人机的蓝牙断连debug

文章目录 前言零、闪灯状态零零、翻滚角&#xff0c;俯仰角&#xff0c;偏航角一、问题描述二、现象解释三、解决方案参考文献 前言 在 西电无人机电装实习 时遇到的问题使用蓝牙芯片 CH582F。沁恒的蓝牙芯片CH582F是一款集成了BLE&#xff08;Bluetooth Low Energy&#xff0…

华为初级认证HCIA怎么样?

想在网络技术领域实现职业突破吗&#xff1f;华为HCIA初级认证是专为网络领域的新手与初学者设计的一项入门级认证。它旨在评估并确认个人对网络基本原理和技术知识的扎实掌握&#xff0c;是步入华为认证体系大门的基石。 一、华为HCIA 初级认证概述 华为初级认证网络工程师&am…

分类预测|基于黑翅鸢优化核极限学习机的数据分类预测Matlab程序BKA-KELM 多特征输入多类别输出 含基础KELM

分类预测|基于黑翅鸢优化核极限学习机的数据分类预测Matlab程序BKA-KELM 多特征输入多类别输出 含基础KELM 文章目录 一、基本原理BKA-HKELM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 BKA-HKELM 分类预测原理和流程 1. 黑翅鸢优化…

最好用的翻译器:什么是DeepL?如何订阅支付DeepL,订阅DeepL Pro以及申请DeepL API?

DeepL目前最好用的翻译软件&#xff0c;如果是学习翻译的同学或者海外客户翻译&#xff0c;一定不能错过&#xff0c;用它来处理文件&#xff0c;论文等翻译是最好不过了的&#xff01;&#xff01;&#xff01; AI翻译技术的飞速发展正在颠覆我们的沟通方式&#xff0c;打破语…

6年前倒闭的机器人独角兽,再次杀入AGV市场

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 在科技创新的浪潮中&#xff0c;一个曾经辉煌又迅速陨落的企业正悄然重生&#xff0c;引发业界广泛关注。 曾经的协作机器人鼻祖Rethink Robotic…

机器学习周报(9.9-9.15)-Pytorch学习(三)

文章目录 摘要Abstract1 损失函数与反向传播1.1 L1Loss损失函数1.2 MSELoss损失函数1.3 交叉熵损失函数&#xff08;CrossEntropyLoss&#xff09;1.4 反向传播 2 优化器3 现有网络模型的使用及修改4 网络模型的保存与读取4.1 保存模型4.2 读取 总结 摘要 本次学习对Pytorch中…

8.3Sobel算子边缘检测

实验原理 Sobel算子是一种广泛使用的一阶导数边缘检测算子&#xff0c;它通过计算图像在水平和垂直方向上的梯度来检测边缘。Sobel算子使用一对3x3的掩模来实现这一功能。相比于其他边缘检测算子&#xff0c;Sobel算子在检测边缘的同时还能提供一定的抗噪能力。 在OpenCV中&a…

【射频通信电子线路基础第四讲】LC匹配网络、史密斯圆图、噪声与噪声系数

一、LC匹配网络 1、L-I型&#xff08;负载与电抗并联&#xff09; 2、L-II型&#xff08;负载与电抗串联&#xff09; 3、T型网络和π型网络例子 二、Smith圆图 这里先附上知乎大神的讲解链接&#xff0c;推荐直接去看非常适合入门理解&#xff0c;看完之后茅塞顿开 https://…

MySQL 安全机制全面解析

‍ 在如今的数字化时代&#xff0c;数据库安全 变得越来越重要。为了防止对数据库进行非法操作&#xff0c;MySQL 定义了一套完整的安全机制&#xff0c;包括用户管理、权限管理 和 角色管理。本文将为你深入浅出地介绍这三大安全机制&#xff0c;帮助你轻松掌握MySQL的安全管…

MPP数据库之SelectDB

SelectDB 是一个高性能、云原生的 MPP&#xff08;大规模并行处理&#xff09;数据库&#xff0c;旨在为分析型数据处理场景提供快速、弹性和高效的解决方案。它专为处理大规模结构化和半结构化数据设计&#xff0c;常用于企业级业务分析、实时分析和决策支持。 SelectDB 是在…

Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)

目录 1介绍背景 2实现原理 3组件介绍 4代码 5其他说明 1介绍背景 项目背景是 一天的时间轴 10分钟为一间隔 一天被划分成144个节点 一页面12个节点 代码介绍的很详细 可参考或者借鉴 2实现原理 对Element-plus滑块组件的二次封装 基于Vue2&#xff08;2.6.14&#x…

数字孪生引领智慧医院革新:未来医疗的智能化之路

数字孪生&#xff08;Digital Twin&#xff09; 是指将物理实体或系统的数字化模型与其实时运行数据相结合&#xff0c;以反映实体的状态、行为和性能&#xff0c;并通过数据分析和仿真来优化决策和管理。在智慧医院建设中&#xff0c;数字孪生技术扮演着关键角色。 1. 数字孪生…

基于SpringBoot+Vue的瑜伽体验课预约管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…