线性表的顺序表

#include<stdio.h>
#include<stdlib.h> 
#include<assert.h>

//动态顺序表 
typedef int SLDataType;


typedef struct SeqList{
	SLDataType* arry ;
	int size;//一个容量里数据的几个 
	int capacity;//开辟的新的容量 
	
}SL,SeqList;


//初始化
//开辟一个容量是4的一个数组。这个数组中的每个类型是SLDataType.ps->arry应该指向开辟的空间的首地址 
void SeqListInit(SL* ps){
	ps->arry = (SLDataType*)malloc(sizeof(SLDataType)*4) ;
	if (ps->arry == NULL){
		printf("fail to malloc");
	}
	ps->size  = 0;
	ps->capacity = 4;
	
} 
//销毁malloc开辟的空间 
void SeqListDestory(SL* ps) {
	free(ps->arry) ;
	ps->arry = NULL;
	ps->capacity = ps->size = 0;
	
} 

//如果满了需要增容.增二倍 
void SeqListCheckCapacity(SL *ps){
/*
如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
*/

	if(ps->size >= ps->capacity){
		ps->capacity *=2;
		ps->arry = (SLDataType*)realloc(ps->arry,sizeof(SLDataType)*ps->capacity) ;
		if(ps->arry == NULL){
			printf("fail to realloc");	
		}
	}
}


//尾插尾删
void SeqListPushBack(SL* ps, SLDataType x){
	assert(ps);
	SeqListCheckCapacity(ps);
	ps->arry[ps->size] = x;
	ps->size++; 
}

void SeqListPopBack(SL *ps){
	assert(ps);
	ps->size--;

}


//头插从(后往前每一个数据向后移一),头删 ps的指针只需要指向下一个地址 
void SeqListPushFront(SL* ps ,SLDataType x) {
	assert(ps);
	SeqListCheckCapacity(ps);
	int end = ps->size-1;
	while(end>=0){
		ps->arry[end+1] = ps->arry[end];
		--end;
		
	}
	ps->arry[0] = x;
	ps->size ++;
	
}
void SeqListPopFront(SL* ps) {
	assert(ps);
	int start = 0 ;
	while(start<ps->size-1){
		ps->arry[start]  = ps->arry[start+1];
		++start;
	}
	//ps->arry = ps->arry+1;
	ps->size--; 
}


//任意位置插入删除
void SeqListInsert(SL* ps,int pos ,SLDataType x) {
	assert(ps);
	assert(pos<ps->size&&pos >=0);
	SeqListCheckCapacity(ps);
	int end = ps->size-1;
	while(end>= pos){
		ps->arry[end+1] = ps->arry[end];
		--end;
		
	}
	ps->arry[pos] = x;
	ps->size++;
	
}
void SeqListErase(SL* ps,int pos){
	assert(ps);
	assert(pos);
	int start = pos;
	while(start<ps->size-1){
		ps->arry[start] = ps->arry[start+1];
		++start;
	}
	ps->size--;
}


//Find
int SeqListFind(SL* ps,SLDataType x){
	assert(ps);
	int i = 0;
	while(i<ps->size){
		if(ps->arry[i] == x){
			return i;
		}
		++i;
	}	
	return -1;
}

//打印 
void SeqListPrint(SL* ps) {
	assert(ps);
	for(int i = 0;i<ps->size;++i){
		printf("%d\t",ps->arry[i]);
	}
	printf("\n");
}


int main(){
	SeqList s;
	SeqListInit(&s);
	SeqListPushBack(&s,1) ;
	SeqListPushBack(&s,4) ;
	SeqListPushBack(&s,1) ;
	SeqListPushBack(&s,1) ;
	SeqListPushBack(&s,4) ;
	SeqListPushBack(&s,1) ;
	SeqListPushBack(&s,1) ;
	SeqListPushBack(&s,4) ;
	SeqListPushBack(&s,1) ;
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPushFront(&s,-1);
	SeqListPopFront(&s); 
	SeqListPopFront(&s) ;
	SeqListPopFront(&s) ;
	SeqListPopFront(&s) ;
	SeqListPopFront(&s) ;
	SeqListPrint(&s);
		
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值