/顺序表
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct table
{
int size,count;//代表顺序表中所存储的长度和拥有数据的数量
int *data;//连续的存储区
}table;
table *getnewtable(int n)
{
table *T=(table*)malloc(sizeof(table));//顺序表的连续存储空间
T->count=0;//初始化顺序表中元素为0
T->size=n;//初始化顺序表中的长度为n
T->data=(int *)malloc(sizeof(int)*n);//顺序表中数据连续的存储空间
return T;
}
int insert(table *T,int val,int pos)
{
if(pos<0||pos>T->size)return 0;
if(T->size==T->count)return 0;//顺序表中最大能存储的长度已经等于count
for(int i=T->count-1;i>=pos;i--){
T->data[i+1]=T->data[i];
}//要使得顺序表中从pos元素开始平行向后移动一位
//逆序变量是为了防止元素被覆盖导致元素被丢弃
T->data[pos]=val;//pos位置插入val值
T->count+=1;//顺序表中的元素数据加1
return 1;
}
//给定值来删除对应的值
int removedata(table *T,int val)//给出指定的值进行删除
{
if(T->count==0) return 0;//顺序表中的元素都没有删什么啊
int pos=0;
while(val!=T->count){
pos++;
}
for(int i=pos+1;i<T->count;i++){
T->data[i]=T->data[i+1];
}
T->count-=1;
return 1;
}
int removepos(table *T,int pos)//通过位置删除指定元素
{
if(pos<0||pos>T->size)return 0;
if(T->count==0) return 0;
for(int i=pos+1;i<T->count;i++){
T->data[i]=T->data[i+1];//向前移动一位进行覆盖
}
T->count-=1;
return 1;
}
int expand(table *T)//扩容操作
{
/*
realloc的工作机制
一:在原来的基础上向后扩展一片新的内存
二:如果发现在原来基础扩展一片内存还是不够,realloc会寻找新的内存地址来进行扩容
三:如果第二种方法也扩容不成功,则realloc会返回NULL
所以为了防止内存地址丢失,需要重新开辟新的指针来判断realloc的返回状态,如果为NULL则不进行任何操作,否则在原来data的区域上扩展内存
*/
if(T==NULL) return 0;
int *p=(int*)realloc(T->data,sizeof(int)*2*T->size);
if(p==NULL) return 0;
T->data=p;
T->size*=2;//二倍扩展内存
return 1;
}
int search(table *T,int val)//顺序表中搜索指定元素
{
if(T->count==0) return 0;
int pos=0;
while(val!=T->count){
pos++;
}
if(pos==T->count-1) return 0;//没找到
return pos;
}
void clear(table *T)
{
if(T->size!=0) free(T->data);
free(T);
return ;
}
void output(table *T)//输出output函数
{
int len=0;
for(int i=0;i<T->size;i++){
len+=printf("%3d ",i);
}
printf("\n");
for(int i=0;i<len;i++){
printf("--");
}
printf("\n");
for(int i=0;i<T->count;i++){
printf("%3d ",T->data[i]);
}
return ;
}
#define Max 20
int main(void)
{
srand(time(0));//产生随机数
table *T=getnewtable(Max);
for(int i=0;i<Max;i++){
int p=rand()%4,pos,val;//p为产生0-3的数字
switch(p){
case 0:
case 1:
case 2:
pos=rand()%(T->count+2);
val=rand()%100;
printf("insert %d at %d to table = %d\n",val,pos,insert(T,pos,val));
break;
case 3:
pos=rand()%(T->count+2);
printf("remove item at %d to table = %d\n",pos,removepos(T,pos));
break;
}
}
output(T);
clear(T);
return 0;
}
注:输出函数海贼胡船长的输出代码进行改写