首页 > 编程语言 >C语言数据结构编程练习-用指针创建顺序表,进行创销和增删改查操作

C语言数据结构编程练习-用指针创建顺序表,进行创销和增删改查操作

时间:2025-01-16 21:02:29浏览次数:3  
标签:index 改查 void List C语言 创销 orderList printf dataP

 使用多文件进行编程

main.c文件

#include "02.h"

int main()
{


	fn2();


	return 0;
}

 02.h  头文件

#pragma once

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>


#define MAX_NUMBER 100 

typedef int elememtType;	//elememt:元素

typedef struct orderListPtr
{
	elememtType* dataP;//元素类型指针 用于申请内存后存放数组元素
	int length;//存放数组元素的个数

}orderList;


void fn2();

void print_menu();
void create_list(orderList* List);
void print_list(orderList List);
void append_list(orderList* List, elememtType value);
void insert_list(orderList* List, int index, elememtType value);
void delete_List(orderList* List, int index);
void alter_list(orderList* List, int index, elememtType value);
void destory_list(orderList* List);

02.c  文件

#include "02.h"

//创建顺序表   通过指针来创建顺序表
void fn2()
{
    int order=0;//指令
    int index = 0;//索引
    elememtType value;//元素值
    orderList List = { NULL,0 };//定义结构体变量 

    print_menu();

    while (1)
    {
        printf("请输入操作指令:");
        scanf(" %d", &order);
        switch (order)
        {
        case 1:
            //创建顺序表    create  创建
            create_list(&List);

            break;
        case 2:
            //打印顺序表
            print_list(List); //print  打印
            break;
        case 3:
            //追加一个节点   是在最后面增加数据  append:追加
            printf("请输入要追加的元素:");
            scanf(" %d", &value);
            append_list(&List, value);
            break;
        case 4:
            //插入一个节点   随机插入(从0开始)
            printf("请输入要插入的节点:");
            scanf(" %d", &index);
            printf("请输入要插入的元素:");
            scanf(" %d", &value);
            insert_list(&List,index,value);    //insert  插入
            break;
        case 5:
            //删除一个节点    用户输入删除的索引,从1开始
            printf("请输入要删除的元素位置:");
            scanf(" %d", &index);
            delete_List(&List, index);
            break;
        case 6:
            //修改顺序表元素   用户输入修改的元素的索引,从1开始
     
            printf("请输入要修改的节点位置:");
            scanf(" %d", &index);
            printf("请输入要修改后的元素值:");
            scanf(" %d", &value);

            alter_list(&List, index, value); //alter 修改
            break;
        case 7:
            //销毁顺序表

            destory_list(&List);//destory 销毁
            break;
        case 8:
            //退出
            return;
        default:
            printf("输入指令有误,请重新输入\n");
            break;

        }

    }

}


//菜单
void print_menu()
{
    system("cls");// 系统函数 用于屏幕清空  头文件stdlib.h里面的
    printf("操作指令说明:\n");
    printf("1:创建顺序表\n2:打印顺序表\n");
    printf("3:追加一个节点\n4:插入一个节点\n");
    printf("5:删除一个节点\n6:修改顺序表元素\n");
    printf("7:销毁顺序表\n8:退出\n");
}

//创建新表并进行初始化
void create_list(orderList* List)
{
    List->dataP = (elememtType*)malloc(sizeof(orderList) * MAX_NUMBER);

    if (!List->dataP)
    {
        printf("申请内存失败\n");
        return;
    }

    //动态申请的空间要进行初始化
    memset(List->dataP, 0, sizeof(orderList) * MAX_NUMBER);

    printf("初始化成功\n");
}
//打印顺序表
void print_list(orderList List)
{
    if (!List.dataP)
    {
        printf("请先建表\n");
        return;
    }
    if (List.length == 0)
    {
        printf("空表无法打印\n");
        return;
    }
    for (int i = 0; i < List.length; i++)
    {
        printf(" %d  ", List.dataP[i]);
        //dataP是指针  List.dataP[i]  相当于  *(List.dataP + i)
    }
    printf("\n");

}

//追加元素
void append_list(orderList * List,elememtType value)
{
    if (!List->dataP)
    {
        printf("请先建表\n");
        return;
    }
    if (List->length >= MAX_NUMBER)
    {
        printf("空已满无法追加\n");
        return;
    }

    List->dataP[List->length] = value;
    //换一种写法  *(List->datap + List->length) = val;
    List->length++;
    printf("追加成功\n");

}

//插入元素
void insert_list(orderList* List, int index, elememtType value)
{
    if (!List->dataP)
    {
        printf("请先建表\n");
        return;
    }
    if (List->length >= MAX_NUMBER)
    {
        printf("空已满无法插入\n");
        return;
    }
    //判断插入的位置是否合法
    if (index < 0 || index >= MAX_NUMBER)
    {
        printf("插入位置不合法\n");
        return;
    }

    //插入后需要遍历数组  index后面的数据全部需要后移一位
    //从后往前遍历比较方便
    for (int i = List->length - 1; i >= index; i--)
    {

        *(List->dataP +( i + 1)) = List->dataP[i];
    }
    *(List->dataP + index) = value;

    List->length++;
    printf("插入成功\n");
}

//删除元素
void delete_List(orderList* List, int index)
{
    if (!List->dataP)
    {
        printf("请先建表\n");
        return;
    }
    if (List->length >= MAX_NUMBER)
    {
        printf("空已满无法删除\n");
        return;
    }

    int index_temp = index - 1;
    if (index_temp<0 || index_temp>List->length - 1)
    {
        printf("删除位置不合法\n");
        return;
    }

    //删除元素后  后面的数据全部需要往前移一位
    //index后面的数据往前移,从前到后遍历比较方便
    for (int i = index_temp; i < List->length; i++)
    {
        List->dataP[i] = List->dataP[i + 1];
    }
    List->length--;

    printf("删除成功\n");
}

//修改
void alter_list(orderList* List, int index, elememtType value)
{
    if (!List->dataP)
    {
        printf("/请先建表\n");
        return;
    }

    if (List->length == 0)
    {
        printf("空表,无法修改\n");
        return;
    }
    //判断要修改的元素位置是否合法
    int ind = index - 1;//要修改元素索引
    if (ind < 0 || ind > List->length - 1)
    {
        printf("您要修改的元素不存在\n");
        return;
    }
    //正常修改
   // List->dataP[ind] = value;
    //换一种写法
    *(List->dataP + ind) = value;
    printf("修改成功\n");
}

void destory_list(orderList* List)
{
    free(List->dataP);
    List->dataP = NULL;

    List->length = 0;//元素个数为0
    printf("销毁成功!!\n");
}

 多文件编程的好处:

  • 提高代码的模块化和可维护性
    • 模块化:将不同功能的代码分别放在不同的文件中,使程序结构更加清晰。每个文件专注于实现一个特定的功能,例如,在一个游戏开发项目中,可将角色移动相关代码放在movement.c文件中,将碰撞检测代码放在collision.c文件中 。
    • 可维护性:当需要修改或扩展某个功能时,只需在对应的文件中进行操作,而不会影响到其他无关的代码。例如,如果要优化角色移动的速度,只需在movement.c文件中修改相关代码,其他如碰撞检测、游戏界面等功能模块不受影响。
  • 增强代码的复用性
    • 多个项目可以共享相同的代码文件。例如,在开发多个不同的图形界面应用程序时,可能都会用到一些通用的界面绘制函数,将这些函数放在一个独立的文件(如gui_draw.c)中,不同的项目都可以包含这个文件,从而复用这些代码,避免了重复开发,提高了开发效率。
  • 便于团队协作开发
    • 在大型项目开发中,往往需要多个程序员协同工作。多文件编程方式使得每个程序员可以负责一个或多个特定的文件,独立进行代码的编写、调试和测试工作。例如,在一个企业级管理系统的开发项目中,程序员 A 可以负责用户登录和权限管理相关文件的开发,程序员 B 可以专注于数据库操作相关文件的实现,他们之间通过文件接口进行交互,这样可以大大提高团队开发的并行性,加快项目的开发进度。
  • 加快编译速度
    • 在大型项目中,修改某一个文件的代码后,只需要重新编译这个文件以及与其有依赖关系的少数文件,而不需要重新编译整个项目的所有文件。这是因为编译器会根据文件的修改时间来判断是否需要重新编译。例如,在一个包含数百个源文件的大型软件开发项目中,如果只是对某个功能模块对应的一个源文件进行了修改,那么重新编译时,编译器只需要花费少量时间重新编译这个修改过的文件以及与之紧密相关的几个文件,而其他大部分未修改的文件无需重新编译,从而大大缩短了整个项目的编译时间,提高了开发效率。

标签:index,改查,void,List,C语言,创销,orderList,printf,dataP
From: https://blog.csdn.net/jhbuy/article/details/145167613

相关文章

  • C语言流程控制
    程序的三种流程:顺序、选择(分支)、循环。程序 :一定是这些循环的组合 选择:选择(有排他性)一、关系运算符和关系表达式(一)运算规则运算结果---反映关系是否成立---真假   //在c语言中10表示运算优先级(二)关系表达式二、逻辑运算反映多个表达式之间的......
  • MyBatis-增删改查操作&一些细节
    目录删除新增 修改查询 小结:删除功能需求:根据ID删除用户信息SQL:deletefromuserwhereid=5;Mapper接口方法(注意这里不是实现类):/***根据id删除*/@Delete("deletefromuserwhereid=#{id}")publicvoiddeleteById(Integerid);编写单元测试......
  • C语言学习笔记:if语句讲解和月份的天数判断以及闰年判断示例
    if语句的格式是:if(关系运算或逻辑运算表达式){语句 }if后如果不加花括号{}则判定只和第一句语句相关:if(n==0)printf(“1”);printf(“2”);//这种写法,if判定与语句2无关 (n==0)是否为真语句2都会打印 为避免if的(关系语句)少打一个= 可以把常量放在左侧如:if(7==n){}当......
  • C语言二级刷题---程序设计01
     请编写一个函数fun,它的功能是:根据以下公式求π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):程序运行后,如果输入精度0.0005,则程序输出为3.140578。#include<stdio.h>#include<math.h>doublefun(doubleeps){}main(){doublex;voidNONO();......
  • C语言格式输出方式
    C语言格式输出1.转换字符说明C语言格式输出方式2.常用的打印格式在C语言中,格式输出主要依靠printf函数来实现。以下是一些C语言格式输出的代码举例及相关说明:printf("%2d",123),因为输出的部分有三位数,但是要求的有两位,所以原样输出为:123;printf(“%5d”,123),由于输出的......
  • 基于C语言实现UDP服务器
    UDP(UserDatagramProtocol,用户数据报协议)是一种无连接的传输层协议,适用于对实时性有较高要求的应用场景,如视频流传输、语音通信、在线游戏等。与TCP不同,UDP不保证数据的可靠性和顺序性,但其传输速度较快。本文将介绍如何使用C语言编写一个简单的UDP服务器程序,以及如何接收和处理......
  • C语言中数字后缀含义
    1.不带后缀时数字类型数字默认类型整型int浮点型double2.带后缀时数字类型后缀类型带上后缀后的类型整型uunsignedint整型llong整型ulunsignedlong整型lllonglong整型ullunsignedlonglong浮点型ffloat浮点型l......
  • c语言随机数rand与srand用法详解
    源文件test.c:#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){//生成并打印5个随机数for(inti=0;i<5;i++){//生成随机数并打印printf("第%d个随机数:%d\n",i+1,rand());}return0;}注意点:1)当不用srand()函数设置种子时,系统......
  • C语言中操作符的分类和优先级(万字)
    C语言中操作符的分类和优先级1.操作符的分类总结算术操作符单目操作符赋值操作符位操作符逻辑操作符关系操作符三目操作符逗号表达式索引访问操作符函数调用成员访问操作符2.操作符的优先级1.操作符的分类总结算术操作符:+、-、*、/、%单目操作符:++、--、!......
  • 在C语言中如何去掉gets的警告
    在C语言中使用gets会出现下面的警告,意思是:“警告:‘gets’函数是危险的,不应该使用。” warning:the`gets'functionisdangerousandshouldnotbeused.这是因为gets没有限制输入字符串的长短,如果输入字符过长,就会发生越界。产生潜在的危险。为了避免这种警告,在菜鸟......