首页 > 其他分享 >构造顺序表并进行基础操作

构造顺序表并进行基础操作

时间:2024-04-22 18:35:17浏览次数:27  
标签:顺序 int SeqList 元素 表并 构造 Manager Data

// 定义顺序表中的元素的数据类型,用户可以根据需要进行修改

typedef int DataType_t;

// 构造记录顺序表SeqList各项参数(顺序表的首地址 + 顺序表的容量 + 顺序表中最后有效元素的下标)的结构体

typedef struct SeqList
{
    DataType_t *Addr;
    unsigned int Size;
    int Last;
} SeqList_t;

// 创建顺序表并对顺序表进行初始化

SeqList_t *SeqList_Create(unsigned int size)
{
    // 1.利用calloc为顺序表的管理结构体申请一块堆内存
    SeqList_t *Manager = (SeqList_t *)calloc(1, sizeof(Manager));

    if (NULL == Manager)
    {
        perror("calloc memory for manager is failed");
        exit(-1); // 程序异常终止
    }

    // 2.利用calloc为所有元素申请堆内存
    Manager->Addr = (DataType_t *)calloc(size, sizeof(DataType_t));

    if (NULL == Manager->Addr)
    {
        perror("calloc memory for element is failed");
        free(Manager);
        exit(-1); // 程序异常终止
    }

    // 3.对管理顺序表的结构体进行初始化(元素容量 + 最后元素下标)
    Manager->Size = size; // 对顺序表中的容量进行初始化
    Manager->Last = -1;   // 由于顺序表为空,则最后元素下标初值为-1

    return Manager;
}

// 判断顺序表是否已满

bool SeqList_IsFull(SeqList_t *Manager)
{
    return (Manager->Last + 1 == Manager->Size) ? true : false;
}

// 已知一个顺序表工,其中的元素递增有序排列,设计一个算法,插入一个元素x(x为int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。

SeqList_t * SeqList_Add(SeqList_t *Manager, int Data)           //传参包含管理顺序表结构体的地址,需要插入的数据
{
    if ( SeqList_IsFull(Manager) )                              //判断顺序表是否已满
	{
		printf("SequenceList is Full!\n");
		return false;
	}

    for (int i = 0; i < Manager->Last; i++)    //遍历元素,递增排列,当数据大于当前下标元素,则插入到该元素前
    {
        if (Data > Manager[i])
        {
            for (int j = Manager->Last; j >= i; j--)  //把下标i到下标Last的所有元素顺序后移一位
            {
                Manager[j+1]=Manager[j];
            }
            Manager[i]=Data;           //将Data赋值给第i项
            Manager->Last++;           //将表示最后一项的下标加一
        }
    }
    return Manager;
}

//对顺序表元素进行删除操作

typedef int SeqList_Data_t

SeqList_t * SeqList_Del(SeqList_t *Manager, int Data)
{
    if(Data>Manager->Last){                                     //判断需要删除的元素的下标是否小于表示最后一个有效元素的下标
        printf("The element does not exist in the sequence table!");
        return false;
    }
    SeqList_Data_t c=Manager[Data]                              //将Data下标的值赋给c
    for(int i=Data;i<=Manager->Last;i++){                       //遍历将下标Data后的值 
        Manager[i]=Manager[i+1];
    }
    Manager[Last]=0;
    Manager->Last--;
    return Manager;
}

在主函数中测试

int main()
{
    //1.创建顺序表
	SeqList_t * Manager = SeqList_Create(10);
    //2.向顺序表中的尾部插入新元素
	SeqList_TailAdd(Manager,5);
	SeqList_TailAdd(Manager,2);
	SeqList_TailAdd(Manager,1);
	SeqList_TailAdd(Manager,4);
	SeqList_TailAdd(Manager,6);  


	//3.遍历顺序表
	SeqList_Print(Manager); // -- 5 2 1 4 6
	printf("\n");
	//4.向顺序表中的头部插入新元素
	SeqList_HeadAdd(Manager,9);
	SeqList_HeadAdd(Manager,7);
	SeqList_HeadAdd(Manager,8);
	SeqList_HeadAdd(Manager,0);
	SeqList_HeadAdd(Manager,10);  

	//5.遍历顺序表
	SeqList_Print(Manager); // --10 0 8 7 9 5 2 1 4 6
	printf("\n");	
	//6.删除顺序表的元素
	SeqList_Del(Manager,20);
	SeqList_Del(Manager,5);
	SeqList_Del(Manager,10);
	SeqList_Del(Manager,0);
	SeqList_Del(Manager,30);

	//7.遍历顺序表
	SeqList_Print(Manager); // --8 7 9 2 1 4 6
	printf("\n");
    return 0;
}

总结:

构造顺序表时通常需要定义结构体对顺序要进行管理,通过管理结构体得到顺序表基本信息;
管理结构体中包含顺序表的地址,用户可以通过地址[下标]的方式访问或修改;
向顺序表中插入元素时需要考虑其他元素是否受影响,需将插入位置后的所有元素向后移动;

标签:顺序,int,SeqList,元素,表并,构造,Manager,Data
From: https://www.cnblogs.com/lzlwyh/p/18151195

相关文章

  • 不合理的执行顺序引发的死锁
    问题现象程序上线后运行反馈总会提示死锁,日志大量出现java.sql.BatchUpdateException:批处理中出现错误:ORA-00060:等待资源时检测到死锁根据具体的异常堆栈信息找到对应的代码行,发现某个Service层有类似如下代码片段:【方法上有切面事务】publicvoidbatchUpdate(Lis......
  • 在vue2中按顺序调用多个接口,接收返回数据
    最近有一个点一个按钮调用多个接口,并且按顺序串行调用,根据后端返回的逻辑,区分接口之间的串行关系,前面的接口失败是否继续执行下面接口,有两种方式,都是循环调用接口,实现方式有点差别第一种reduce+promisevarresolves=[];callAPI(obj){returnnewPromise((resolve,reject......
  • 顺序表
    数据结构顺序表练习题1.已知一个顺序表L,其中的元素递增有序排列,设计一个算法,插入一个元素x(x为int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。/*****************************************************************************************filename......
  • 默认构造函数学习
    转自:https://blog.csdn.net/sevenjoin/article/details/88314531,讲的很好。1.介绍若针对一个类没有显式地定义构造函数,那么编译器会隐式的为这个类生成一个默认构造成员函数。 默认构造函数就是在调用时不需要显示地传入实参的构造函数。假如用户定义了其他构造函数(比如有参数......
  • 【根据前序和中序遍历构造二叉树】栈+迭代 || 递归
    105.从前序与中序遍历序列构造二叉树栈+迭代规律前序遍历中相邻节点u和v,v节点一定是u节点的左节点或者是其自身某个祖先的右节点一个没有右节点的链,中序遍历是从叶子到根,前序遍历是从根到叶子解题思路用一个栈维护前序遍历的节点用一个指针p指向中序遍历的第一个叶子节......
  • 每月做账先后顺序
    每月做账先后顺序。·1、收付款分录:根据银行回单做。·2、销售分录:根据销售发票和出库单做(当月开具的发票)。·3、采购分录:根据采购发票和入库单做(采购提供的发票)。·4、费用分录:根据费用发票做(办公费、差旅费、推广费、咨询费等)。·5、计提工资、社保、公积金:根据工资表、社......
  • python多继承构造方法参数报错
    各路大神,今天下午在学习Python3.12多继承的时候,有个构造方法一直报错,希望大家能帮忙瞅瞅,求求了~~~~~~~代码如下:点击查看代码classRectangle:def__init__(self,width,height):self.width=widthself.height=heightdefarea(self):......
  • JMeter组件的执行顺序和作用域
    组件介绍测试计划:jmeter的起点和容器线程组:代表一定的虚拟用户取样器:发送请求的最小单元逻辑控制器:控制组件的执行顺序前置处理器:在请求之前的操作后置处理器:在请求之后的操作断言:判断请求是否符合预期定时器:是否延迟或间隔发送请求配置元件:请求期的配置信息监听器:负责......
  • 基元线程同步构造
    一、基元(一)概述基元指的是在代码中可以使用的最简单的构造。基元是指编程中最基本、最简单的构造或元素,可以直接在代码中使用。基元通常是编程语言中的原始数据类型或基本操作符,用于构建更复杂的数据结构和算法。举例来说,对于C#编程语言,基元可以包括整型(int)、浮点型(float)......
  • 栈1: 栈的顺序存储
    栈:顺序存储栈是一种先进后出(FirstInLastOut,FILO)的数据结构如果你将两个元素压入栈,先加入的元素将在后加入的元素之后出栈栈顶元素值为null(未满时)定义栈的数据结构#defineMAX_SIZE1024//利用数组模拟栈的顺序存储typedefstructsqStack{void*data[MA......