顺序表的学习

顺序表的学习

顺序表:顺序存储的线性表。

顺序表的优缺点

  • 优点
  1. 不需要多余的信息来记录数据间的关系,存储密度高
  2. 所有数据顺序存储在一片连续的内存中,支持立即访问任意一个随机数据,访问第𝑖i个节点是 s->data[i]
  • 缺点
  1. 插入、删除时需要保持数据的物理位置反映其逻辑关系,一般需要成片移动数据
  2. 当数据节点数量较多时,需要一整片较大的连续内存空间
  3. 当数据节点数量变化剧烈时,内存的释放和分配不灵活

习题练习

笔试题:完成顺序表删除元素的函数 (顺序表中元素不存在相同的情况)

//删除顺序表的元素
bool SeqList_Del(SeqList_t *Manager,DataType_t DestVal)
{
	//1.判断顺序表是否为空
	if ( SeqList_IsEmpty(Manager) )
	{
		printf("SequenceList is Empty!\n"); 
		return false;
	}

    //2.查找目标值是否在顺序表中
	int temp = -1;
	for (int i = 0;i <= Manager->Last;i++)
	{
		if (Manager->Addr[i] == DestVal)
        {
            temp = i;
			break;
        }
	}

	//3.没有目标值终止函数
	if ( temp == -1)
	{
		printf("Dest element is not Found!\n");
		return false;
	}
       
	//4.目标元素的后继元素向前移动一个单位
   
	for (int i = temp;i < Manager->Last;i++)
    {
        Manager->Addr[i] = Manager->Addr[i+1];
    }
        Manager->Last--;
        return true;
	
}

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

void SeqList_Insert(SeqList *L,int x)
{
    int temp = -1; //记录待插入元素的下标
    
    //遍历顺序表,找到插入位置,比较元素
    for (int i = 0;i <= last; ++i)
    {
        if(x<L[i])
        {
            temp = i;
            break;
        }
    }
    
    if(-1 == temp)
    {
        L[last+1] = x;
        return;
    }
    
    //把待插入位置的后继元素向后移动
    for(int i=last; i>=temp; i--)
    {
        L[i+1] = L[i];
    }
    
    L[temp] = x;
}

笔试题: 删除顺序表L中下标为p(0 <= p <= length-1)的元素,成功返回1,否则返回0,并将被删除元素的值赋给e。

int SeqList_Remove(*L,int p)
{
    //判断顺序表的地址是否有效
    if(NULL == L)
    {
        return 0;
    }
    
    int e = 0; //变量e,记录待删除元素的值
    
    //把待删除元素的值备份到变量e中
    e = L[p];
    
    //把待删除元素的后继元素向前移动一个单位
    for(int i = p; i < length; ++i)
    {
        L[i] = L[i+1];
    }
    
    return 1;
}

顺序表的增删改查实现

/********************************************************************************************************
* file name   : sq_list.c
* brief       : 顺序表的增删改查实现
* author      :sanjiudemiao@163.com
* date        :2024/04/19
* version     :v1.0 
* property    :C
* note        : None
* Copyright (c)  2023-2024   sanjiudemiao@163.com   All right Reserved
* ******************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//指的是顺序表中的元素的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造记录顺序表SequenceList各项参数(顺序表的首地址 + 顺序表的容量 + 顺序表中最后有效元素的下标)的结构体
typedef struct SequenceList
{
	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;
}


//向顺序表的尾部加入元素
bool SeqList_TailAdd(SeqList_t *Manager, DataType_t Data)
{
	//1.判断顺序表是否已满
	if ( SeqList_IsFull(Manager) )
	{
		printf("SequenceList is Full!\n");
		return false;
	}

	//2.如果顺序表有空闲空间,则把新元素添加到顺序表尾部
	Manager->Addr[++Manager->Last] = Data;

	return true;
}

//向顺序表的头部加入元素
bool SeqList_HeadAdd(SeqList_t *Manager, DataType_t Data)
{
	//1.判断顺序表是否已满
	if ( SeqList_IsFull(Manager) )
	{
		printf("SequenceList is Full!\n");
		return false;
	}

	//2.如果顺序表有空闲空间,则需要把顺序表所有元素向后移动1个单位
	for (int i = Manager->Last;i >= 0;i--)
	{
		Manager->Addr[i+1] = Manager->Addr[i];
	}

	//3把新元素添加到顺序表的头部,并且更新管理结构体中的元素下标+1
	Manager->Addr[0] = Data;
	Manager->Last++;

	return true;
}


//判断顺序表是否已满
bool SeqList_IsEmpty(SeqList_t *Manager)
{
	return (-1 == Manager->Last) ? true : false;
}


//删除顺序表的元素
bool SeqList_Del(SeqList_t *Manager,DataType_t DestVal)
{
	//1.判断顺序表是否为空
	if ( SeqList_IsEmpty(Manager) )
	{
		printf("SequenceList is Empty!\n"); 
		return false;
	}

    //2.查找目标值是否在顺序表中
	int temp = -1;
	for (int i = 0;i <= Manager->Last;i++)
	{
		if (Manager->Addr[i] == DestVal)
        {
            temp = i;
			break;
        }
	}

	//3.没有目标值终止函数
	if ( temp == -1)
	{
		printf("Dest element is not Found!\n");
		return false;
	}
       
	//4.目标元素的后继元素向前移动一个单位
   
	for (int i = temp;i < Manager->Last;i++)
    {
        Manager->Addr[i] = Manager->Addr[i+1];
    }
        Manager->Last--;
        return true;
	
}


//遍历查找顺序表的元素
void SeqList_Print(SeqList_t *Manager)
{
	for (int i = 0;i <= Manager->Last;i++)
	{
		printf("Element[%d]=%d\n",i,Manager->Addr[i]);
	}
}



int main(int argc, char const *argv[])
{

	//1.创建顺序表
	SeqList_t * Manager = SeqList_Create(10);
    
	//2.向顺序表的头部加入元素
    SeqList_HeadAdd(Manager,10);
	SeqList_HeadAdd(Manager,20);
	SeqList_HeadAdd(Manager,30);
	SeqList_HeadAdd(Manager,40);
	SeqList_HeadAdd(Manager,50);
	SeqList_HeadAdd(Manager,60);
	SeqList_HeadAdd(Manager,70);
	SeqList_HeadAdd(Manager,80);
	SeqList_HeadAdd(Manager,90);
	SeqList_HeadAdd(Manager,100);

	//3.向顺序表的尾部加入元素


	//4.遍历顺序表的元素
    SeqList_Print(Manager);
    
      
	//5.删除顺序表的元素

	SeqList_Del(Manager,40);

    SeqList_Print(Manager);

	return 0;
}



posted @   sanjiudemiao  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示