顺序表逻辑与程序实现

顺序表

思路:按下标寻找表中的数据

#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"); 

}                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值