顺序表创建插入删除操作及实现

      学数据结构时在实现顺序表创建插入删除操作中,书中提供了伪代码,但是用c实现时在创建相应函数时,不能用&调用表的另一个名字。所以应该这样实现

     #include<stdio.h>
     #include<stdlib.h>
     #define LIST_INIT_SIZE  100
     #define LISTINCREMENT   10
typedef struct  //结构体
{
    int  *elem;//基地址
    int  length;长度
    int  listsize;//容量
}SqList;
int Initlist(SqList *L)//创建线性表 此处只能用*L,不能用&L,c中不能用&L并且*L为指针类型,需要用->实现
{
    L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
    if(!(L->elem))
        return 0;
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
    return 1;
}
//插入
int ListInsert_Sq(SqList *L,int i,int e)
{

    if(i<1||i>(L->length)+1)
              return 0;
      int * newbase;
       int * p,* q;
       if(L->length>=L->listsize)
       {
              newbase=(int *)realloc(L->elem, (L->listsize+LISTINCREMENT)*sizeof(int));
              if(!newbase)
                     return 0;
             L->elem=newbase;
              L->listsize+=LISTINCREMENT;
       }
       q=&(L->elem[i-1]);//q为第i个元素的位置
       for(p=&(L->elem[(L->length)-1]);p>=q; --p)
             *(p+1)=*p;//i-1之后的元素依次后移一位
       *q=e;
       ++(L->length);

       return 1;
}
//删除
int ListDelete_Sq(SqList* L,int i,int e)
{
    int *p,*q;
    if(i<1||i>L->length)
        return 0;
    p=&(L->elem[i-1]);
    *p=e;
    q=L->elem+(L->length)-1;
    for(p;p<q;p++)
    {
        *p=*(p+1);
    }
    (L->length)--;
    return 1;
}
void main()
{
    SqList L;
    Initlist(&L);
    int i;
    printf("input 10 interger");
    for(i=0;i<10;i++)
    {
        scanf("%d",&(L.elem[i]));
        printf("\t");
        L.length++;
    }
    printf("insert later\n");
    ListInsert_Sq(&L,5,10000);
    for(i=0;i<L.length;i++)
    {
        printf("\t%d\t",L.elem[i]);
        printf("\n");
    }
    printf("delete later\n");
    for(i=0;i<L.length;i++)
    {
        if(L.elem[i]==8)
        ListDelete_Sq(&L,i+1,8);
    }

    for(i=0;i<L.length;i++)
    {
        printf("\t%d\t",L.elem[i]);
    }
}

此为本人第一次写,在学数据结构时有些小感悟,如有错误,希望各位前辈指教,小辈不胜感激



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值