c语言数据结构--链表

实验内容:

编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。

实验步骤:

1.按照实验要求编写代码,构造链表,初始化链表
2.再插入元素1 2 3
3.分别求链表中元素的个数、求直接前驱、求直接后继
4.删除一个元素
5.查看链表中元素的个数并输出所有链表元素
6.初始化链表并重新输入链表元素
7.输出所输入的链表元素
8.最后销毁链表,退出。
9.输入验收用例,验证其输出结果。

#include <iostream>
#include <cstdlib>
#define False -1
using namespace std;
struct LNode {
    int data;
    LNode* next;
};

void InitList(LNode*& L) {
    L = NULL;
}

void DestroyList(LNode*& L) {
    LNode* p;
    while (L) {
        p = L;
        L = L->next;
        delete p;
    }
}

int ListLength(LNode* L) {
    int len = 0;
    LNode* p = L;
    while (p) {
        len++;
        p = p->next;
    }
    return len;
}

int GetElemValue(LNode* L, int i) {
    LNode* p = L;
    int j = 1;
    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i) {
        cout << "错误: 非法位置!" << endl;
        return False;
    }
    return p->data;
}

int GetPosition(LNode* L, int e) {
    LNode* p = L;
    int pos = 1;
    while (p && p->data != e) {
        p = p->next;
        pos++;
    }
    if (!p) {
        cout << "错误: 非法位置!" << endl;
        return False;
    }
    return pos;
}

LNode* GetPredecessor(LNode* L, int e) {
    LNode* p = L;
    LNode* pred = NULL;
    while (p->next && p->next->data != e) {
        p = p->next;
    }
    if(p->next->data == e){
		pred = p;
	}
    return pred;
}

LNode* GetSuccessor(LNode* L, int e) {
    LNode* p = L;
    while (p && p->data != e) {
        p = p->next;
    }
    if (p && p->next) {
        return p->next;
    }
    return NULL;
}

bool ListInsert(LNode*& L, int i, int e) {
    if (i < 1) {
        cout << "错误: 非法位置!" << endl;
        return false;
    }
    LNode* p = new LNode;
    p->data = e;
    if (i == 1) {
        p->next = L;
        L = p;
    } else {
        LNode* q = L;
        int j = 1;
        while (q && j < i - 1) {
            q = q->next;
            j++;
        }
        if (!q || j > i - 1) {
            cout << "错误: 非法位置!" << endl;
            return false;
        }
        p->next = q->next;
        q->next = p;
    }
    return 0;
}

bool ListDelete(LNode*& L, int i) {
    if (i < 1) {
        cout << "错误: 非法位置!" << endl;
        return false;
    }
    if (i == 1) {
        LNode* p = L;
        L = L->next;
        delete p;
    } else {
        LNode* p = L;
        int j = 1;
        while (p && j < i - 1) {
            p = p->next;
            j++;
        }
        if (!p || !p->next || j > i - 1) {
            cout << "错误: 非法位置!" << endl;
            return false;
        }
        LNode* q = p->next;
        p->next = q->next;
        delete q;
    }
    return 0;
}

void showList(LNode* L) {
    LNode* p = L;
    while (p) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

int main() {
    LNode* L1;
    InitList(L1);
	int a=0;
    int commander;
    while (true) {
        cout << "1. 初始化链表" << endl;
        cout << "2. 销毁链表" << endl;
        cout << "3. 求链表长度" << endl;
        cout << "4. 求指定位序的元素值" << endl;
        cout << "5. 求链表输入元素的位序" << endl;
        cout << "6. 求输入元素直接前驱" << endl;
        cout << "7. 求输入元素直接后继" << endl;
        cout << "8. 在第i个位置插入元素" << endl;
        cout << "9. 删除第i个元素" << endl;
        cout << "10. 输出所输入的链表元素" << endl;
        cout << "11. 初始化并输入链表元素" << endl;
        cout << "负数退出" << endl;
        cout << "请输入你的选择: ";
        cin >> commander;
		if(commander==1||commander==11){
			a++;
		}
		if(commander<1){
			break;
		}
		else{
			if(a==0){
				cout << "请先进行初始化操作!" << endl ;
				continue;
			}
		}
        switch (commander) {
            case 1:
                InitList(L1);
                break;
            case 2:
                DestroyList(L1);
                break;
            case 3:
                cout << "链表中数据元素个数为: " << ListLength(L1) << endl;
                break;
            case 4: {
                int i;
                cout << "请输入指定位序i: ";
                cin >> i;
                if(GetElemValue(L1, i)){
                cout << "指定位序的元素值为: " << GetElemValue(L1, i) << endl;
                }
                break;
            }
            case 5: {
                int e;
                cout << "请输入元素e: ";
                cin >> e;
                if(GetPosition(L1, e)){
                cout << "元素e的位序为: " << GetPosition(L1, e) << endl;
                }
                break;
            }
            case 6: {
                int e_pred;
                cout << "请输入元素e: ";
                cin >> e_pred;
                LNode* pred = GetPredecessor(L1, e_pred);
                if (pred) {
                    cout << "元素e的直接前驱为: " << pred->data << endl;
                } else {
                    cout << "未找到元素e的直接前驱!" << endl;
                }
                break;
            }
            case 7: {
                int e_succ;
                cout << "请输入元素e: ";
                cin >> e_succ;
                LNode* succ = GetSuccessor(L1, e_succ);
                if (succ) {
                    cout << "元素e的直接后继为: " << succ->data << endl;
                } else {
                    cout << "未找到元素e的直接后继!" << endl;
                }
                break;
            }
            case 8: {
                int i_insert, e_insert;
                cout << "请输入插入位置i: ";
                cin >> i_insert;
                cout << "请输入插入元素e: ";
                cin >> e_insert;
                ListInsert(L1, i_insert, e_insert);
                break;
            }
            case 9: {
                int i_delete;
                cout << "请输入删除位置i: ";
                cin >> i_delete;
                ListDelete(L1, i_delete);
                break;
            }
            case 10:
                cout << "链表元素为: ";
                showList(L1);
                break;
            case 11: {
                int n;
                cout << "请输入链表元素个数n: ";
                cin >> n;
                cout << "请输入链表元素: ";
                for (int j = 0; j < n; j++) {
                    int element;
                    cin >> element;
                    ListInsert(L1, j + 1, element);
                }
                break;
            }
            case 12:
                DestroyList(L1);
                exit(0);
            default:
                cout << "无效的输入,请重新输入!" << endl;
                break;
        }
        system("pause");
        system("cls");
    }

    return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

书生大模型实战营(暑假场)-入门岛-第一关

书生大模型实战营暑假场重磅开启&#xff01;&#xff0c;这场学习路线看起来很好玩呀&#xff0c;闯关学习既能学到知识又有免费算力可得&#xff0c;太良心啦。感兴趣的小伙伴赶快一起报名学习吧&#xff01;&#xff01;&#xff01; 关卡任务 好的&#xff0c;我们废话不多…

如何在忘记密码的情况下重置Realme手机?

欢迎阅读我们关于如何在有或没有密码的情况下重置Realme手机的综合指南。无论您是忘记了密码&#xff0c;还是只是需要将设备恢复到出厂设置&#xff0c;我们都会为您提供所需的专业提示和技术专长。 发现分步说明、专家提示和行之有效的方法&#xff0c;轻松重新控制您的 Rea…

python库(9):prettytable库快速实现ASCII表格

下面介绍一个快速制作ASCII表格库——prettytable&#xff0c;可以方便地制作简单表格。 1 安装prettytable pip install -i https://pypi.tuna.tsinghua.edu.cn/simple prettytable 结果如下&#xff1a; 2 代码实例 from prettytable import PrettyTable table PrettyTa…

How do I format markdown chatgpt response in tkinter frame python?

题意&#xff1a;怎样在Tkinter框架中使用Python来格式化Markdown格式的ChatGPT响应&#xff1f; 问题背景&#xff1a; Chatgpt sometimes responds in markdown language. Sometimes the respond contains ** ** which means the text in between should be bold and ### te…

CentOS 6.5配置国内在线yum源和制作openssh 9.8p1 rpm包 —— 筑梦之路

CentOS 6.5比较古老的版本了&#xff0c;而还是有一些古老的项目仍然在使用。 环境说明 1. 更换国内在线yum源 CentOS 6 在线可用yum源配置——筑梦之路_centos6可用yum源-CSDN博客 cat > CentOS-163.repo << EOF [base] nameCentOS-$releasever - Base - 163.com …

ChatGLM-6B入门

ChatGLM-6B ChatGLM-6B 一、介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最…

数据结构(初阶1.复杂度)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

智能车载防窒息系统设计

摘要 随着汽车行业的快速发展&#xff0c;车辆安全问题越来越受到人们的关注。其中&#xff0c;车载防窒息系统是一项重要的安全设备。本论文基于STM32单片机&#xff0c;设计了一种智能车载防窒息系统。该系统主要包括氧气浓度检测模块、温湿度检测模块、声音检测模块、光线检…

URPF简介

定义 URPF&#xff08;Unicast Reverse Path Forwarding&#xff09;是单播逆向路径转发的简称&#xff0c;其主要功能是防止基于源IP地址欺骗的网络攻击行为。 目的 拒绝服务DoS&#xff08;Denial of Service&#xff09;攻击是一种阻止连接服务的网络攻击。DoS的攻击方式…

QT开发积累——qt中的注释和多行注释的几种方式,函数方法注释生成

目录 引出qt中的注释和多行注释方法的注释生成 总结日积月累&#xff0c;开发集锦方法参数加const和不加const的区别方法加static和不加static的区别Qt遍历list提高效率显示函数的调用使用&与不使用&qt方法的参数中使用&与不使用&除法的一个坑 项目创建相关新建…

交通气象站:保障道路安全的智慧之眼

随着社会的快速发展&#xff0c;交通运输日益繁忙&#xff0c;道路安全成为公众关注的焦点。在这个背景下&#xff0c;交通气象站作为保障道路安全的重要设施&#xff0c;正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息&#xff0c;也为广大驾驶员…

Conformal low power-2.电源感知等效性检查

电源感知等效性检查 ■ 第24页&#xff1a;电源感知等效性检查概述 ■ 第24页&#xff1a;启动低功耗&#xff08;等效性检查&#xff09;软件 ■ 第25页&#xff1a;电源感知等效性检查流程 ■ 第28页&#xff1a;电源感知等效性检查示例Do文件 电源感知等效性检查概述…

【网络安全科普】网络安全指南请查收

随着社会信息化深入发展&#xff0c;互联网对人类文明进步奖发挥更大的促进作用。但与此同时&#xff0c;互联网领域的问题也日益凸显。网络犯罪、网络监听、网络攻击等是又发生&#xff0c;网络安全与每个人都息息相关&#xff0c;下面&#xff0c;一起来了解网络安全知识吧。…

从零到一:打造你的专属AI聊天机器人之旅

在这个智能技术日新月异的时代&#xff0c;AI聊天机器人已成为我们日常生活中不可或缺的伙伴&#xff0c;从客服咨询到情感交流&#xff0c;它们以独特的魅力融入了我们的每一个角落。你是否也曾梦想过亲手创造一个能够理解你、陪伴你的AI聊天机器人呢&#xff1f;今天&#xf…

After Detailer让图像自动修复

After Detailer&#xff08;简称adetailer&#xff09;是一个Stable Diffusion的自动Web-UI扩展&#xff0c;它能够自动化修复图像中的不完整部分&#xff0c;例如模糊的人脸等常见问题。在这篇文章中&#xff0c;你将了解它的工作原理、如何使用它&#xff0c;以及一些常见的使…

CSDN回顾与前行:我的创作之旅——2048天的技术成长与感悟

CSDN回顾与前行&#xff1a;我的创作之旅——2048天的技术成长与感悟 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 前言 时光荏苒&#xff0c;岁月如梭。转眼间&#xff0c;从我在CSDN上写下第一篇技术博客《2-6 带头结点的链式表操作集…

无线网的ip地址固定吗

在数字化日益普及的今天&#xff0c;无线网络已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;对于许多非专业用户来说&#xff0c;无线网络背后的技术细节仍然充满了神秘感。其中&#xff0c;一个常见的问题是&#xff1a;无线网的IP地址是固定的吗&#xff1f;本文…

WebKit简介及其神秘的工作流程

在信息时代的巨浪中&#xff0c;互联网已经深深地渗透到了我们生活的每一个角落。作为连接我们与这个庞大网络世界的桥梁&#xff0c;网页浏览器无疑成为了我们生活中不可或缺的一部分。而在这些浏览器的背后&#xff0c;往往隐藏着一些强大而神秘的引擎&#xff0c;它们为浏览…

【源码+文档+调试讲解】沙县小吃点餐系统

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 沙县小吃点餐系统&#xff0c;主要的模块包括实现管理员&#xff1b;个人中心、用户管理、小吃信息管理、门店信息管理、预约信息管理、系统管…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解&#xff1a; netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…