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

news2024/12/23 10:26:21

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

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

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

 

代码块(头文件,函数文件,主文件)
linklist.h头文件
/*************************************************************************
	> File Name: linklist.h
	> Author: 
	> Mail: 
	> Created Time: Thu 12 Sep 2024 10:37:03 AM CST
 ************************************************************************/

#ifndef _LINKLIST_H
#define _LINKLIST_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;
typedef int ElemType;

typedef struct LNode{
	ElemType data;
	int length;
	struct LNode *next;
}LNode, *LinkList;

#define DATAFMT "%d"

void CreateList_L(LinkList &L, int n);

Status DestroyList_L(LinkList &L);

Status ListEmpty_L(LinkList L);

Status GetElem_L(LinkList L, int i, ElemType &e);

int equal(ElemType a, ElemType b);

Status LocateElem_L(LinkList L, ElemType e, int equal(ElemType, ElemType));

Status PriorElem_L(LinkList L, ElemType cur_e, ElemType &pre_e);

Status NextElem_L(LinkList L, ElemType cur_e, ElemType &next_e);

Status ListInsert_L(LinkList &L, int i, ElemType e);

Status ListDelete_L(LinkList &L, int i, ElemType &e);

Status ClearList_L(LinkList &L);

Status visit(ElemType e);

Status ListTraverse_L(LinkList L, Status visit(ElemType));

void unionList_L(LinkList &La, LinkList Lb);

void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc);

#endif
linklist.c函数文件
/*************************************************************************
	> File Name: linklist.c
	> Author: 
	> Mail: 
	> Created Time: Thu 12 Sep 2024 10:40:09 AM CST
 ************************************************************************/

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

void CreateList_L(LinkList &L, int n) {
	printf("Enter ");
	printf(DATAFMT, n);
	printf(" elem list: ");
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	int i;
	LNode *q = L;
	for(i = n; i > 0; --i) {
		LNode *p = (LinkList)malloc(sizeof(LNode));
		scanf(DATAFMT, &p->data);
		p->next = q->next;
		q->next = p;
		q = p;
	}
	L->length = n;
}//CreateList_L

Status DestroyList_L(LinkList &L) {
	free(L);

	return OK;
}//DestroyList_L

Status ListEmpty_L(LinkList L) {
	return L->length == 0 ? TRUE : FALSE;
}//ListEmpty_L

Status GetElem_L(LinkList L, int i, ElemType &e) {
	if(i < 1 || i > L->length) {
		return ERROR;
	}

	LinkList p = L->next;
	int j = 1;
	while(p && j < i) {
		p = p->next;
		++j;
	}
	if(!p || j > i) {
		return ERROR;
	}
	e = p->data;
	return OK;
}//GetElem_L

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

Status LocateElem_L(LinkList L, ElemType e, int equal(ElemType, ElemType)) {
	int i;
	LNode *p = L->next;
	for(i = 1; p != NULL; i++, p = p->next) {
		if(equal(e, p->data)) {
			return i;
		}
	}

	return FALSE;
}//LocateElem_L

Status PriorElem_L(LinkList L, ElemType cur_e, ElemType &pre_e) {
	LNode *p = L->next;
	LNode *q = NULL;
	while(p && p->data != cur_e) {
        q = p;  // Store the previous node
        p = p->next;
    }

	if (!q) {
        return ERROR;  // If q is still NULL, it means the current element is the first one
    }

    if (!p) {
        return NOEXIST;  // If the current element is not found, return NOEXIST
    }

    pre_e = q->data;
    return OK;
}//PriorElem_L

Status NextElem_L(LinkList L, ElemType cur_e, ElemType &next_e) {
	LNode *p = L->next;
    while (p && p->data != cur_e) {
        p = p->next;
    }

	if (!p) {
        return NOEXIST;  // If current element is not found, return NOEXIST
    }

	if (!p->next) {
        return ERROR;  // If there is no next element, return ERROR
    }

    next_e = p->next->data;
    return OK;
}//NextElem_L

Status ListInsert_L(LinkList &L, int i, ElemType e) {
	LinkList p = L;
	int j = 0;
	while(p && j < i - 1) {
		p = p->next;
		++j;
	}
	if(!p || j > i - 1) {
		return ERROR;
	}
	LNode *s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	L->length++;
	return OK;
}//ListInsert_L

Status ListDelete_L(LinkList &L, int i, ElemType &e) {
	LinkList p = L;
	int j = 0;
	while(p->next && j < i - 1) {
		p = p->next;
		++j;
	}
	if(!(p->next) || j > i - 1) {
		return ERROR;
	}
	LNode *q = p->next;
	p->next = q->next;
	e = q->data;
	free(q);
	L->length--;
	return OK;
}//ListDelete_L

Status ClearList_L(LinkList &L) {
	ElemType e;
	while(L->length != 0) {
		ListDelete_L(L, 1, e);
	}

	return OK;
}//ClearList_L

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

Status ListTraverse_L(LinkList L, Status visit(ElemType)) {
	printf("List traverse: ");
	LinkList p;
	for(p = L->next; p != NULL; p = p->next) {
		if(!visit(p->data)) {
			return FALSE;
		}
	}
	printf("\n");
	return OK;
}//ListTraverse_L

void unionList_L(LinkList &La, LinkList Lb) {
	int La_len = La->length;
	int Lb_len = Lb->length;
	int i;
	ElemType e;
	for(i = 1; i <= Lb_len; i++) {
		GetElem_L(Lb, i, e);
		if(!LocateElem_L(La, e, equal)) {
			ListInsert_L(La, ++La_len, e);
		}
	}
}//unionList_L

void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc) {
	LNode *pa = La->next;
	LNode *pb = Lb->next;
	LNode *pc;
	Lc = pc = La;
	while(pa && pb) {
		if(pa->data <= pb->data) {
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else {
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;
	free(Lb);
}//MergeList_L
main.c主文件
/*************************************************************************
	> File Name: main.c
	> Author: 
	> Mail: 
	> Created Time: Thu 12 Sep 2024 10:41:49 AM CST
 ************************************************************************/

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

int main() {
	LinkList L;
	
	//Input the list and traverse it
	CreateList_L(L, 10);
	ListTraverse_L(L, visit);

	//Determine whether the list is empty
	if(ListEmpty_L(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(L)) {
		printf("List is clear!\n");
	}
	else {
		printf("List is not clear!\n");
	}
	ListTraverse_L(L, visit);
	//After clearing the list, check whether the list is empty
	if(ListEmpty_L(L)) {
		printf("List is empty!\n\n");
	}
	else {
		printf("List is not empty!\n\n");
	}

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

	//Input the number of the element you want to get
	int num1;
	printf("Enter the number of the element you want to get: ");
	scanf("%d", &num1);
	ElemType e1;
	if(GetElem_L(L, num1, e1)) {
		printf("No.%d Elem is ", num1);
		printf(DATAFMT, e1);
		printf(".\n\n");
	}
	else {
		printf("The number is error!\n\n");
	}

	//Input the element you want to locate
	ElemType elem;
	printf("Eneter the element you want to locate: ");
	scanf(DATAFMT, &elem);
	if(LocateElem_L(L, elem, equal)) {
		printf("The position of the element ");
		printf(DATAFMT, elem);
		printf(" is %d.\n\n", LocateElem_L(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
	ElemType num2, e2;
	printf("Enter the element for which you want to get the priority element: ");
	scanf(DATAFMT, &num2);
	if(PriorElem_L(L, num2, e2) == -3) {
		printf("The elem ");
		printf(DATAFMT, num2);
		printf(" doesn't exist!\n\n");
	}
	else if(PriorElem_L(L, num2, e2) == 0) {
		printf("The elem ");
		printf(DATAFMT, num2);
		printf(" doesn't have prior elem.\n\n");
	}
	else {
		printf("The prior elem of ");
		printf(DATAFMT, num2);
		printf(" is ");
		printf(DATAFMT, e2);
		printf(".\n\n");
	}

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

	//Input the element and the location you want to insert
	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);
	while(num4 < 1 || num4 > L->length) {
		printf("Error Location! Retry!\n");
		printf("Enter the location you want to insert: ");
		scanf("%d", &num4);
	}
	printf("Insert elem ");
	printf(DATAFMT, e4);
	printf(" to position %d...\n", num4);
	ListInsert_L(L, num4, e4);
	ListTraverse_L(L, visit);
	printf("\n");

	//Input the number of the element you want to delete
	int num5;
	printf("Enter the number of the element you want to delete: ");
	scanf("%d", &num5);
	while(num5 < 1 || num5 > L->length) {
		printf("Error Number! Retry!\n");
		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(L, num5, e5);
	printf("The delete elem is ");
	printf(DATAFMT, e5);
	printf(".\n");
	ListTraverse_L(L, visit);
	printf("\n");

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

	//Use unionList_L methods
	LinkList La1, Lb1;
	CreateList_L(La1, 5);
	ListTraverse_L(La1, visit);
	CreateList_L(Lb1, 5);
	ListTraverse_L(Lb1, visit);

	printf("\nUnion List La1 and Lb1...\n");
	unionList_L(La1, Lb1);
	ListTraverse_L(La1, visit);
	printf("\n");

	//Use MergeList_L methods
	LinkList La2, Lb2, Lc;
	CreateList_L(La2, 5);
	ListTraverse_L(La2, visit);
	CreateList_L(Lb2, 5);
	ListTraverse_L(Lb2, visit);

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

	return 0;
}
运行结果显示如下:

在这里插入图片描述

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

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

相关文章

全球公认最厉害思想家颜廷利谈野鸡扮凤、犬饰猛虎和地蛇慕龙

在现代社会&#xff0c;我们依然能够看到许多“野鸡扮凤”、“犬饰猛虎”和“地蛇慕龙”这样的故事上演。这些故事背后&#xff0c;往往隐藏着对名誉、地位和权力的渴望&#xff0c;以及为了达到目的而不择手段的行为。 最近&#xff0c;宁夏银川的杨韶山就成为了这样一个故事…

GaussDB关键技术原理:高弹性(四)

书接上文GaussDB关键技术原理&#xff1a;高弹性&#xff08;三&#xff09;从段页式技术方面对GaussDB高弹性能力进行了解读&#xff0c;本篇将从hashbucket扩容方面继续介绍GaussDB高弹性技术。 4 hashbucket扩容 基于hashbucket表的扩容整体流程主要包含三个步骤&#xff…

【网络安全】-文件下载漏洞-pikachu

文件操作漏洞包括文件上传漏洞&#xff0c;文件包含漏洞&#xff0c;文件下载漏洞。 文章目录  前言 什么是文件下载漏洞&#xff1f; 1.常见形式&#xff1a; 常见链接形式&#xff1a; 常见参数&#xff1a; 2.利用方式&#xff1a; 3.举例&#xff1a;pikachu不安全的文件…

大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例

Flink SQL Flink SQL 是 Apache Flink 提供的一种高层次的查询语言接口&#xff0c;它基于 SQL 标准&#xff0c;为开发者提供了处理流式数据和批处理数据的能力。Flink SQL 允许用户使用标准 SQL 查询语言在数据流和数据表上执行复杂的操作&#xff0c;适用于多种应用场景&am…

如何模拟一个小程序项目打包的流程

一、Uni-app 执行 yarn run dev:mp-weixin后会发生什么 &#xff08;一&#xff09;准备工作 克隆项目&#xff1a;创建以 typescript 开发的工程&#xff08;如命令行创建失败&#xff0c;请直接访问 https://gitee.com/dcloud/uni-preset-vue/repository/archive/vite-ts.z…

htop、free -h对于可用内存显示不同的区别

htop中Mem包含了缓存和缓存区&#xff0c; free -h查看 used free buff/cache 上面htop显示的mem&#xff0c; 1、我看我还能用多少内存&#xff0c;看哪里 看free -h 中的free 2、buff/cache 是啥 缓存缓存区占用&#xff0c;htop显示的效果是把这个也算在一块了&#…

C# WinForm:禁用Panel容器滚动条自动移动位置的功能

1.在WinForm项目中新建一个类&#xff1a; 2.类里面的内容&#xff0c;重写Panel的这个方法 3.编译后这个控件就出现在工具箱了 4.然后用这个新Panel控件就好了 5.完事大吉。

【Python机器学习系列】建立super learner模型预测心脏疾病(案例+源码)

这是我的第353篇原创文章。 一、引言 Super learner 是 Vander Laan et al.&#xff08;2007&#xff09;提出的一种基于损失函数的组合预测的学习算法。Super learner算法基于交叉验证理论&#xff0c;通过加权的方式组合多种候选算法&#xff0c;从而构造一种最小交叉验证风…

Hadoop集群开启后使用jps命令查看发现没有NameNode、SecondaryNameNode、DataNode、NodeManager进程,缺少进程。

今天安装Hadoop集群,安装完成使用jps命令查看发现没有NameNode进程,别人jps后都有6个在跑,我就两个。看到别人的 我的👉。都看懵了。。。 处理NameNode不启动的问题 检查ip地址是否是namenode所在节点的ip。 要检查 IP 地址是否是 NameNode 所在节点的 IP 地址,你可以通…

大数据之Spark(二)

9.4.3、RDD持久化 RDD之间进行相互迭代计算&#xff08;Transformation的转换&#xff09;&#xff0c;当执行开启&#xff0c;新RDD的生成代表旧RDD消失。如果有的rdd需要重复使用就需要将rdd缓存&#xff0c;rdd.cache()或rdd.persist()。清理缓存rdd.unpersist() 缓存特点&…

Python项目虚拟环境(超详细讲解)

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

android 生SHH,并配置

1. ssh-keygen -t rsa -b 4096 -C "XXXXxx.com" 2. vim ~/.ssh/config 新建一个文件&#xff1a;~/.ssh/config&#xff1a;并将下列的内容放入&#xff1a; Host * HostKeyAlgorithms ssh-rsa PubkeyAcceptedKeyTypes ssh-rsa 4.得到XXX.pub去添加ssh 5.克隆

【Java】方法1_定义方法,完整格式,原理

文章目录 前言 一、方法是什么&#xff1f; 方法的完整格式 1、有返回值的函数 2、无返回值的函数 二、方法使用常见的问题三、方法在计算机中执行的原理总结 前言 学习记录方法 一、方法是什么&#xff1f; 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能…

python绘制3d建筑

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection# 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size100, height_range(5, 50), base_size_range(10, 30)):buildings []for _ in range(…

<<编码>>第 11 章 逻辑门电路--开关电路 示例

网络电路 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch11-01-network-circuit.txt 继电器开关电路 info::操作说明 鼠标单击开关切…

python-游戏自动化(二)(OpenCV图像运用基础)

OpenCV OpenCV简介 首先我们来了解一下&#xff0c;OpenCV是什么&#xff1f; OpenCV 是计算机视觉中经典的专用库&#xff0c;其支持多语言、跨平台&#xff0c;功能强大。 OpenCV现在支持与计算 机视觉和机器学习有关的多种算法&#xff0c;并且正在日益扩展…

基于vue框架的宠爱有佳宠物医疗管理系统4x10z(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物信息,医生,用户挂号,病历记录,科室信息,药物信息 开题报告内容 基于Vue框架的宠爱有佳宠物医疗管理系统开题报告 一、引言 随着现代社会生活节奏的加快&#xff0c;宠物已成为许多家庭不可或缺的一员。宠物不仅带来了欢乐与…

海康威视相机在QTcreate上的使用教程

文章目录 前言&#xff1a;基础夯实&#xff1a;效果展示&#xff1a;图片展示&#xff1a;视频展示&#xff1a; 参考的资料&#xff1a;遇到问题&#xff1a;问题1&#xff1a;int64 does not问题2&#xff1a;LNK2019配置思路(这个很重要)配置关键图片&#xff1a;配置具体过…

HyperWorks二维网格划分与单元连续性

自动网格划分 HyperWorks中为零件定义几何曲面是创建零件壳单元网格的最佳方式。HyperMesh 创建二维网格最有效的方法是使用 Automesh 面板直接在零件的表面创建网格。 Automesh 面板是 HyperMesh 重要的网格划分工具&#xff0c;通过 automesh 可实现单元尺寸、单元密度、单…

TopN问题

100亿个integer数据&#xff0c;如何找到前k个最小值。 也就是问的如何排序最快 堆排序最快 完全二叉树 堆结构其实就是一颗完全二叉树 大根堆和小根堆 大根堆&#xff1a;每一个根节点都大于它的叶子结点 小根堆&#xff1a;每一个根节点都小于它的叶子结点 通过建立大根…