顺序表
思路:按下标寻找表中的数据
#define SIZE 5 //方便修改数组的大小
顺结构体可定义为:
typedef struct
{
int *p; //用于保存堆空间开出来的地址
int sign; //有效数据的下标
int size; //数组元素的总个数
}seq_t;
顺序表的初始化
void seq_init(seq_t * ps)
{
ps->size=SIZE;
ps->p=(int *)malloc(ps->size * sizof(int));
if(ps->p=NULL)
{
perror("空间申请失败!!\n");
return;
}
ps->sign=-1; //刚刚申请的空间,里面没有输入数据令其为-1,表示空间里没有数据
}
添加数据
void seq_add(int data,seq_t* ps)
{
int *temp; //用于接受当空间不足时重新扩容的地址
if(ps->sign==ps->size-1)
{
//扩容
ps->size += SIZE ;
temp=(int *)realloc(ps->p,ps->size * sizeof(int));
ps->p=temp; //这里通过temp转存堆空间的地址,而不是直接用ps->p接受,
//一方面是逻辑上便于理解,
//另一方面是ps->p即作为relloc函数内的实参
//又作为realloc函数的返回地址,这可能发生混淆
printf("空间重定义,扩容成功!!\n")
}
ps->sign++;//使得下标移动
ps->p[ps->sign]=data;//将数据存放进p指向的堆空间,ps->sign作下标
}
//删除
//添加完数据源后,思考如何才能进行删除操作?
//我们想删除一个数据,要先找到这个数据的位置,然后把其后面的数据往前移
//由于每次我们加人一个元素都会使得ps->sign++,因此实际上ps->sign的值其实是该数组的有效数据个数,也是该数组的长度
void seq_del(seq_t *sp,data)
{
if(ps->sign==-1)
{
printf("数组为空\n");
return;
}
int i,j;
for(i=0;i<=ps->sign,i++) //遍历
{
if(ps->p[i]==data) //找到了要删除的数据
{
for(j=i;j<ps->sign;j++) //尾元素下标 - 被删除的元素下标 得到要移动的元素个数
{
ps->p[j]=ps->p[j+1]; //自被删除的元素处,后面的元素往前移动一格
}
ps->sign--;//自减使得有效数据减少一个,即表示该数组长度减少一格
return;
}
printf("没有该元素\n");\\遍历完了一遍都没进if说明没找到
}
//修改数据
//改谁? 改成什么?
//找到数据 替换数据 操作与删除类似
void seq_del(seq_t *sp,data,int new ,int old)
{
int i;
for(i=0;i<=ps->sign,i++) //遍历
{
if(ps->p[i]==old) //找到了要替换的数据
{
ps->p[i]=new;
return;
}
printf("没有该元素\n");\\遍历完了一遍都没进if说明没找到
}
\\遍历
void display(seq_t *sp)
{
for(i=0;i<=ps->sign,i++) //遍历
{
printf("a[%d]=%d",i,ps->sign);
return;
}
printf("\n");
}