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

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

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;
}

总结:

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

posted @   林大官人995  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示