数据结构C //线性表ADT结构及相关函数

数据结构(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 -3typedef int Status;#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10typedef 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;
}//InitListStatus DestroyList(List &L) {free(L.elem);return OK;
}//DestroyListStatus ClearList(List &L) {for(int i = 0; i < L.listsize; i++) {L.elem[i] = 0;}L.length = 0;return OK;
}//ClearListStatus ListEmpty(List L) {return L.length == 0 ? TRUE : FALSE;
}//ListEmptyint ListLength(List L) {return L.length;
}//ListLengthStatus GetElem(List L, int i, ElemType &e) {if(i < 1 || i > ListLength(L)) {return ERROR;}e = L.elem[i-1];return OK;
}//GetElemint equal(ElemType a, ElemType b) {return a == b ? TRUE : FALSE;
}//equalStatus 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;
}//LocateElemStatus 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;
}//PriorElemStatus 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;
}//NextElemStatus 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;
}//ListInsertStatus 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;
}//ListDeleteStatus visit(ElemType e) {if(!e) return ERROR;printf(DATAFMT, e);printf(" ");return OK;
}//visitStatus 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;
}//ListTraversevoid 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;
}//InputListvoid 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);}}
}//unionListvoid 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 listInitList(L);//Input the list and traverse itInputList(L, 10);ListTraverse(L, visit);//Determine whether the list is emptyif(ListEmpty(L)) {printf("List is empty!\n\n");}else {printf("List is not empty!\n\n");}//Clear the listprintf("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 emptyif(ListEmpty(L)) {printf("List is empty!\n\n");}else {printf("List is not empty!\n\n");}//Input the list againInputList(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 99ElemType 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 5ElemType 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 9ElemType 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 6int 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 2int 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 listprintf("Prepare destroy the list...\n");if(DestroyList(L)) {printf("List is destroyed!\n");}else {printf("List is not destroyed!\n");}//Use unionList MethodsList 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 MethodsList 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.mzph.cn/pingmian/53504.shtml

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

相关文章

LeetCode 2181.合并零之间的节点

题目描述 给你一个链表的头节点 head &#xff0c;该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 &#xff0c;请你将它们之间的所有节点合并成一个节点&#xff0c;其值是所有已合并节点的值之和。然后将所有 0 …

浏览器百科:网页存储篇-如何在Chrome中打开IndexedDB窗格(十一)

1.引言 在现代Web开发中&#xff0c;网页存储技术扮演着至关重要的角色。IndexedDB作为一种低级API&#xff0c;允许客户端存储大量结构化数据&#xff0c;并提供高性能的搜索能力。在上一篇文章中&#xff0c;我们深入探讨了IndexedDB的基础知识及其应用场景。为了更有效地调…

安全产品概述

防火墙 防火墙的核心功能是过滤掉有害的流量&#xff0c;在专用网络和公共网络之间建立保护屏障。防火墙过滤通常基于一系列规则&#xff0c;如 IP 地址、域名、协议、端口号、关键字等&#xff0c;对入站和出站的流量进行过滤。这些规则也称为访问控制列表&#xff08;ACCESS…

网络编程day04(UDP、Linux IO 模型)

目录 【1】UDP 1》通信流程 2》函数接口 1> recvfrom 2> sendto 3》代码展示 1> 服务器代码 2> 客户端代码 【2】Linux IO 模型 场景假设一 1》阻塞式IO&#xff1a;最常见、效率低、不耗费CPU 2》 非阻塞 IO&#xff1a;轮询、耗费CPU&#xff0c;可以处…

Spring Boot属性注入的多种方式!

Spring Boot的一个问题&#xff0c;证明你是不是真正的 "会用" Spring boot ?Spring Boot的一个问题&#xff0c;直接暴露你是不是真正使用Spring Boothttps://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247484040&idx1&sn64ad15d95e44c874cc890973…

2024年CCPC网络赛A题题解 —— 军训Ⅰ(gym105336A)

个人认为很唐的一道题&#xff0c;考虑到不少人可能懒得写&#xff0c;我这里给大家发个代码叭&#xff0c;还有一点点题解&#xff08;因为真的不是很难&#xff09;。这是题面&#xff1a; 然后我来讲讲怎么做&#xff0c;不觉得会有多少人题目意思都理解不了叭&#xff1f;这…

码上进阶_刷题模块测试_用例设计

码上进阶_刷题模块测试_用例设计 系统概述&#xff1a; 码上进阶是为程序员专门打造的交流平台&#xff0c;采用主流的微服务框架和C端技术栈作为技术基础。在这个平台上&#xff0c;程序员 可以通过刷题、练习和模拟面试来提升自己的面试能力。 功能测试&#xff1a; 登录…

Linux 常用命令 - tail 【显示文件最后几行内容】

简介 tail 这个命令源自英文单词 “尾巴”&#xff0c;它的主要功能是显示文件的最后几行内容。通过使用 tail&#xff0c;用户可以查看文件的最新添加内容&#xff0c;特别是对于监控日志文件来说非常有用。tail 命令默认显示文件的最后 10 行&#xff0c;但这可以通过参数调…

数学建模_数据预处理流程(全)

数据预处理整体流程图 一般数据预处理流程 处理缺失值&#xff1a;填补或删除缺失值。处理异常值&#xff1a;检测并处理异常值。数据编码&#xff1a;将分类变量进行标签编码或独热编码。数据标准化/归一化&#xff1a;对数据进行标准化或归一化处理。连续变量离散化&#xff…

基于JAVA+SpringBoot+Vue的企业级工位管理系统

基于JAVASpringBootVue的企业级工位管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; …

WinCC 中对 VBS 进行单步执行调试

以前应该写过文章给各位展示如何在WinCC 中通过自身控件对脚本&#xff08;C、VBS&#xff09;进行脚本诊断和排错。但是也有用户反馈说在编写了一些相对复杂的脚本后&#xff0c;WinCC自身控件无法做到单步调试&#xff0c;也会影响脚本的诊断调试效率。如果能够对WinCC 中的脚…

论文解读:《LAMM: Label Alignment for Multi-Modal Prompt Learning》

系列文章目录 文章目录 系列文章目录LAMM: Label Alignment for Multi-Modal Prompt Learning学习1、论文细节理解1、研究背景2、论文贡献3、方法框架4、研究思路5、实验6、限制 LAMM: Label Alignment for Multi-Modal Prompt Learning学习 1、论文细节理解 VL模型和下游任务…

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统 在产品将要上线之前&#xff0c;需要制作不同类型格式的根文件系统 在产品研发阶段&#xff0c;我们还是需要使用nfs的方式挂载根文件系统 优点&#xff1a;可以直接在上位机中修改文件系统内容&#xff0c;延长EMMC的寿命 【1】重启上位机nfs服…

Docker初识(Docker技术集群与应用)

一、基础设施即服务 IaaS&#xff08;Infrastructure as a Service&#xff09; eg&#xff1a;购买的云服务器&#xff0c;就是IaaS 提供给客户的服务是对所有设施的利用&#xff0c;包括处理、存储、网络和其他基本的计算资源。客户能够部署和运行任意软件&#xff0c;包括…

人工智能安全治理框架导图

资源链接&#xff1a;《人工智能安全治理框架》1.0版发布_中央网络安全和信息化委员会办公室

MAT:一款针对MSSQL服务器的安全检测与审计工具

关于MAT MAT是一款针对MSSQL服务器的安全检测与审计工具&#xff0c;该工具使用C#开发&#xff0c;可以帮助广大研究人员快速识别和发现MSSQL 服务器中的安全问题&#xff0c;并实现安全检测与审计目的。 功能介绍 1、执行自动检查并识别安全问题&#xff1b; 2、允许通过 Win…

java黑马微项目

1 飞机票 代码实现&#xff1a; import java.util.Scanner; public class F1 {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.print("请输入票价&#xff1a; ");double jia input.nextDouble();System.out.print(&…

Threejs之纹理Texture

本文目录 前言一、Texture的基本概念1.1 定义及作用1.2 常用属性 二、代码及效果2.1 代码2.2 效果 前言 在Three.js中&#xff0c;Texture&#xff08;纹理&#xff09;是一项核心功能&#xff0c;创建一个纹理贴图&#xff0c;将其应用到一个表面&#xff0c;或者作为反射/折射…

web基础之信息泄露

1、目录遍历漏洞 &#xff08;1&#xff09;原理&#xff1a;本质是没有过滤用户输入的 ../ 相关的目录跳转符&#xff0c;使得攻击者通过目录跳转符来遍历服务器中的任意文件。 &#xff08;2&#xff09;题解&#xff1a; eg:根据提示遍历网页目录信息&#xff0c;会在某一个…

无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了

智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…