顺序表(C)

本文详细介绍了顺序表的概念,其特点在于逻辑和物理存储的连续性,并提供了C语言实现顺序表的结构体声明及一系列操作方法,包括初始化、销毁、插入、删除等基本操作。此外,还包含了一个根据值删除元素的优化方法,实现了线性时间复杂度的删除操作。
摘要由CSDN通过智能技术生成

1、顺序表

顺序表特点:在逻辑上是连续的,在物理存储空间上也是连续。--数组
顺序表中存储的元素必须从空间的首位置开始储存,而且必须是连续存放,中间不能有空的空间。
在这里插入图片描述
2、顺序表的实现声明

#include<stdio.h>
//结构体声明
typedef int DataType;

typedef struct SqList
{
        DataType* data;//指向存储空间的指针
        int length;//存储元素的个数
        int size;//当前空间大小,单位是元素个数
}SqList;

//操作方法的声明
bool InitSqList(SqList* sq,int init_size=10);

bool DestroySqList(SqList* sq);

//插入一个元素
//1、按指定位置插入
bool InsertPos(SqList* sq,DataType value,int pos);

//2、头插法
bool InsertFront(SqList* sq,DataType value);

//3、尾插法
bool InsertRear(SqList* sq,DataType value);

int LengthSqList(SqList* sq);

bool DeletePos(SqList* sq,int pos);

bool DeleteFront(SqList* sq);

bool DeleteRear(SqList* sq);

bool IsEmpty(SqList* sq);

//比较方法
typedef bool(*Compare)(DataType,DataType);

bool DeleteValue(SqList* sq,DataType value,Compare cp);

方法实现:

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include"head.h"
//方法的实现
//static如果修饰我们函数,则只有在本文件中看到这个函数
//在其他文件中看不到
static bool IsFull(SqList *sq)
{
       return sq->length==sq->size;
}

static bool AppendSpace(SqList *sq)
{
       //申请新的空间
       int size=sq->size==0?10:sq->size*2;
       DataType *new_space=(DataType*)malloc(sizeof(DataType)*size);
       if(new_space==NULL) return false;
    
       //将原始空间的数据全部导入新的空间中
       for (int i = 0; i < sq->size; ++i)
       {
          new_space[i]=sq->data[i];
       }
    
       //释放sq->data指向的内存空间,否则会发生内存泄露
       free(sq->data);
       sq->data=new_space;
       sq->size=size;
       return true;
}

//给sq中三个成员变量设置初始值
bool InitSqList(SqList *sq,int init_size)
{
     //完成安全检测
    if(sq==NULL&&init_size<=0)
    {
        return false;
    }
    sq->data=(DataType*)malloc(init_size *sizeof(DataType));
    if(sq->data==NULL) false;
    
    sq->length=0;
    sq->size=init_size;
    return true;
}

bool DestroySqList(SqList *sq)
{
     if(sq==NULL) return false;
     free(sq->data);
     sq->data=NULL;//防止出现野指针
     sq->length=sq->size=0;
     return true;
}

bool InsertPos(SqList *sq,DataType value,int pos)
{
     if(sq==NULL) return false;
     if(pos<0||pos>sq->length) return false;
     if(IsFull(sq)&&!AppendSpace(sq)) return false;

     //在pos位置插入value值
    //1、把pos后面的元素往后挪一位
    //2、在pos位置插入value值
    //3、length++
    for(int i=sq->length;i>pos;i--)
    {
        sq->data[i]=sq->data[i-1];
    }
    sq->data[pos]=value;
    sq->length++;
    return true;
}

bool InsertFront(SqList *sq,DataType value)
{
     return InsertPos(sq,value,0);
}

bool InsertRear(SqList *sq,DataType value)
{
     if(sq==NULL) return false;
     return InsertPos(sq,value, sq->length);
}

int LengthSqList(SqList *sq)
{
    if(sq==0) return false;
    return sq->length;
}

bool DeletePos(SqList *sq,int pos)
{
     if(sq==NULL) return false;
     if(pos<0&&pos>sq->length) return false;
     for(int i=pos;i>pos;i--)
     {
         sq->data[i]=sq->data[i+1];
     }
     sq->length--;
     return true;
}

bool DeleteFront(SqList *sq)
{ 
     return DeletePos(sq,0);
}

bool DeleteRear(SqList *sq)
{
     return DeletePos(sq,sq->length-1);
}

bool IsEmpty(SqList *sq)
{
     if(sq==NULL||sq->length==0) return true;
     return false;
}

根据值删除
//bool DeleteValue(SqList *sq,DataType value,Compare cp)
//{
//     if(IsEmpty(sq)) return false;
//     for(int i=0;i<sq->length;i++)
//     {
//         if(cp(sq->data[i],value))
//        {    
//            DeletePos(sq,i);
//        }
//        else
//        { 
//            i++;
//        }
//        
//     }
//    return true;
//}
//O(n)
bool DeleteValue(SqList *sq,DataType value,Compare cp)
{
     if(IsEmpty(sq)) return false;
     int index=0;
     for(int i=0;i<sq->length;i++)
     {
         if(!cp(sq->data[i],value))
        {
            sq->data[index++]=sq->data[i];
        }
     }
    sq->length=index;
    return true;
}

void PrintSqList(SqList *sq)
{
	assert(sq!=NULL);
	for(int i=0;i<sq->length;i++)
	{
		printf("%d ",sq->data[i]);
	}
	printf("\n");
}	
int main()
{
	SqList sql;
	InitSqList(&sql);
	InsertPos(&sql,1,0);
	InsertPos(&sql,2,1);
	InsertFront(&sql,0);
	InsertRear(&sql,3);
	printf("存储元素个数为:%d\n",LengthSqList(&sql));
	DeletePos(&sql,3);
	
	PrintSqList(&sql); 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值