#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);
}
线性表的顺序表
于 2022-03-21 17:00:00 首次发布