首页 > 其他分享 >线性表的12 种基本操作

线性表的12 种基本操作

时间:2024-03-21 17:59:48浏览次数:26  
标签:12 return 线性表 int elem length SqList printf 基本操作

#include<stdio.h>
#include <stdlib.h>
#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT  10
#define INFEASIBLE -1
#define OVERFLOW   -2
typedef int ElemType;
typedef struct {
    ElemType *elem; //存储空间基址
    int length;   //当前长度
    int listsize;//当前分配的存储容量
}SqList;
//构造线性表
int InitList(SqList *L) {
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//存储分配失败
    if (!L->elem)
        exit(OVERFLOW);//空表长度初始化为0;
    L->length = 0;//存储的初始容量为初始分配空间
    L->listsize = LIST_INIT_SIZE;
    return OK;
}
//销毁线性表
int Desttroylist(SqList *L) {
    free(L->elem);
    L->elem = NULL;
    L->length = 0;
    L->listsize = 0;
    return OK;
}
//重置线性表
int ClearList(SqList *L) {
    free(L->elem);
    L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L->elem)
        exit(OVERFLOW);
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    return OK;
}
//判断线性表是否为空
int EmptyList(SqList L) {
    return L.length == 0 ? TRUE : FALSE;
}
//返回线性表的长度
int ListLength(SqList L) {
    return L.length;
}
//返回第i个数据元素的值
int GetElem(SqList L, int i) {
    if (i < 1 || i > L.length)
        return ERROR;
    return L.elem[i - 1];
}
//判断元素
int LocateElem(SqList L, ElemType e) {
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i] == e)
            return i + 1;
    }
    return ERROR;
}
//返回前驱
int PreElem(SqList L, int i) {
    if (i <= 1 || i > L.length)
        return ERROR;
    return L.elem[i - 2];
}
//返回后继
int NextElem(SqList L, int i) {
    if (i < 1 || i >= L.length)
        return ERROR;
    return L.elem[i];
}
//在前面插入新数据元素
int ListInsert(SqList *L, int i, ElemType e) {
    if (i < 1 || i > L->length + 1)
        return ERROR;
    for (int j = L->length; j >= i; j--) {
        L->elem[j] = L->elem[j - 1];
    }
    L->elem[i - 1] = e;
    //    线性表长度加一
    L->length++;
    return OK;
}
//删除第i个数据元素
int ListDetele(SqList *L, int i) {
    if (i < 1 || i > L->length)
        return ERROR;
    ElemType e = L->elem[i - 1];
    for (int j = L->length - i; j > 0; j--) {
        L->elem[L->length - j - 1] = L->elem[L->length - j];
    }
    L->length--;
    return e;
}
//调用visit()
int ListTraverse(SqList L, void(*vi)(ElemType *))

    ElemType *p;
    int i;
    p = L.elem;
    for (i = 1; i <= L.length; i++)
        vi(p++);
    printf("\n");
    return OK;
}
 //打印
 int ListPrint(SqList L) {
     for (int i = 1; i <= L.length; i++) {
         printf("%d ", GetElem(L, i));
     }
     return OK;
 }
int main() {
    
    SqList L;
    printf("*********************************\n");
    printf("*******      线 性 表      ******\n");
    printf("*******  1. 创建一个线性表 ******\n");
    printf("*******  2. 重置该表       ******\n");
    printf("*******  3. 判断是否为空表 ******\n");
    printf("*******  4. 返回元素个数   ******\n");
    printf("*******  5. 返回指定数值   ******\n");
    printf("*******  6. 判断元素       ******\n");
    printf("*******  7. 返回前驱       ******\n");
    printf("*******  8. 返回后继       ******\n");
    printf("*******  9. 插入元素       ******\n");
    printf("******* 10. 删除元素       ******\n");
    printf("******* 11. 调用函数       ******\n");
    printf("******* 12. 销毁线性表     ******\n");
    printf("******* 13. 打印当前线性表 ******\n");
    printf("*********************************\n\n");
    printf("---------------------------------\n\n");
    InitList(&L);
    
    while(1){
        int num1, placenum;
        int datanum,numvalue;
        printf("请输入对应指令:\n");
        scanf_s("%d", &num1);
        
        switch(num1)
        {
        
        case 1://创建线性表
            printf("请输入元素个数:\n");
            scanf_s("%d", &datanum);
            printf("请输入线性表元素:\n");
            for (int i = 1,a; i < datanum+1; i++) {
                scanf_s("%d", &a);
                ListInsert(&L,i,a);
            }
            printf("您输入的线性表:\n");
            ListPrint(L);
            printf("\n");
            break; 
        case 2://重置
            ClearList(&L);
            break;
        case 3://判断
            printf("%d\n",EmptyList(L));
            break;
        case 4://返回元素个数
            printf("元素个数:%d\n",ListLength(L));
            break;
        case 5://返回指定数值
            printf("请输入位置:\n");
            scanf_s("%d", &placenum);
            printf("第%d个元素:%d\n",placenum,ListDetele(&L, placenum));
            break;
        case 6://判断元素
            printf("请输入一个值:\n");
            scanf_s("%d", &numvalue);
            printf("第一个与%d值相等的位置:%d\n",numvalue,LocateElem(L, numvalue));
            break;
        case 7://返回前驱
            printf("请输入位置:\n");
            scanf_s("%d", &placenum);
            printf("第%d个元素的前驱:%d\n",placenum,PreElem(L, placenum));
            break;
        case 8://返回后继
            printf("请输入位置:\n");
            scanf_s("%d", &placenum);
            printf("第%d个元素的后继:%d\n",placenum,NextElem(L, placenum));
            break;
        case 9://插入元素
            printf("请输入位置:\n");
            scanf_s("%d", &placenum);
            printf("请输入插入的值:\n");
            scanf_s("%d", &numvalue);
            ListInsert(&L, placenum, numvalue);
            printf("当前线性表为:");
            ListPrint(L);
            printf("\n");
            break;
        case 10://删除元素
            printf("请输入位置:\n");
            scanf_s("%d", &placenum);
            printf("删除的元素:%d\n",ListDetele(&L, placenum));
            break;
        case 11:
            break;
        case 12://销毁
            Desttroylist(&L);
            break;
        case 13://打印
            ListPrint(L);
            printf("\n");
            break;
        default:
            break;
        }
    } 
    
    return 0;
}
 

标签:12,return,线性表,int,elem,length,SqList,printf,基本操作
From: https://blog.csdn.net/2301_80077673/article/details/136910203

相关文章

  • 龙迅#LT8712SX适用于Type-C/DP1.4转两路Type-C/DP1.4/HDMI2.0应用方案,支持MST和SST功
    1.描述LT8712SX是一款高性能Type-C/DP1.4转Type-C/DP1.4/HD-DVI2.0/DP++转换器,具有两个可配置的DP1.4/HD-DVI2.0输出接口和音频输出接口。LT8712SX支持DisplayPort™单流传输(SST)模式和多流传输(MST)模式。当接收通过单个DP链路打包和传输的多个视频/音频流时,LT8712SX......
  • opengl日记12-opengl坐标系统
    文章目录环境代码CMakeLists.txtvertexShaderSource.vsmain.cpp总结环境系统:ubuntu20.04opengl版本:4.6glfw版本:3.3glad版本:4.6cmake版本:3.16.3gcc版本:10.3.0在<opengl学习日记11-opengl的transformtions变换示例>的基础上,进行修改,实现坐标系统变换效果。代码CM......
  • 12 vi编辑器
    介绍vi\vim是visualinterface的简称,是Linux中最经典的文本编辑器命令行下对文本文件进行编辑的绝佳选择vim是vi的加强版本,兼容vi的所有指令,不仅能编辑文本,而且还具有shell程序编辑的功能,可以不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性。vi\vim......
  • H12-811题库(带解析,亲测高分可以通过)
    大家可以直接点赞+关注后,加作者微信(备注“CSDN”)就可以获取,微信在文章最后!808、[单选题]某公司网管要进行网络规划的时候,能够要让PC1访问PC2的数据包从G0/0/0口走(图上G0/0/2)。PC2访问PC1的数据包从G0/0/4口走(图上G0/0/0)。()A10.0.12.5255.255.255.25511.0.12.610.0......
  • 解决 [FATAL] plugin/loop: Loop (127.0.0.1:49443 -> :53) detected for zone "." 报
    问题背景:这个是安装k8s时报的错,安装使用的是ubuntu系统,当安装到coredns时报如下错 解决方法:查找了一番资料,得出结论这个算是ubuntu和k8scoredns安装的一个兼容性问题,不过很好解决,参照coredns官方文档就可以~首先贴出官网:https://coredns.io/plugins/loop/#troubleshooting......
  • 【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二
     目录 ​编辑1.二叉树的顺序结构及实现1.1二叉树的顺序结构2堆的概念及结构3堆的实现3.1堆的代码定义3.2堆插入数据3.3打印堆数据3.4堆的数据的删除3.5获取根部数据3.6判断堆是否为空3.7堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序4.2升......
  • 中考英语首字母快速突破012-2021上海青浦英语二模-Earth Hour: A Global Call for Env
    PDF格式公众号回复关键字:ZKSZM012原文​WhatisEarthHour?​EarthHourisorganizedbytheWorldWideFundforNature(WWF)andit’sabigeventusuallyattheendofMarcheveryyear.Onthisevening,people‘godark’-thatis,switcho......
  • 【漏洞复现】Progress Kemp LoadMaster 命令注入漏洞(CVE-2024-1212)
    0x01产品简介ProgressKempLoadMaster是一款高性能的应用交付控制器,具有可扩展性,支持实体硬件和虚拟机的负载均衡。它提供了当今应用服务所需的各种功能,包括深度用户验证、资安防护(如WAF/IPS/DDoS防护)以及零信任架构服务。这款控制器旨在为各种规模的企业和单位提供出色的负......
  • mysql 1248错误 多级查询之别名
    【mysql解决方案】ERROR1248(42000):Everyderivedtablemusthaveitsownalias-CSDN博客 多级查询的过程中,会需要给表一个别名。代码错误的查询方式:select*from(selects.snofromstudentswheres.ssex='女');正确的查询方式:select*from(selects.sno......
  • ElasticSearch - 基本操作
    前言本文记录ES的一些基本操作,就是对官方文档的一些整理,按自己的习惯重新排版,凑合着看。官方的更详细,建议看官方的。下文以books为索引名举例。新增添加单个文档(没有索引会自动创建)POSTbooks/_doc{"name":"SnowCrash","author":"NealStephenson","release_dat......