线性表之顺序操作

/
*顺序表 数组a[i],有一个基址a 相当于&a[0],还有下标i,代表第i 个元素,
*数组的最大容量,假定声明一个数组为a[10],则该数组的容量为10
化为指针形式 a[i] = (a+i),[]就相当于*
*要注意的是a是一个常量,它代表的是数组的首地址,是不可以发生变化的
*关于数组的扩容,从新给数组分配空间始终在原有的基址上进行操作
*数组元素的插入和删除操作,就要相应地将插入位置元素的后面的元素前移
/

#include<stdio.h>
#include<stdlib.h>

#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2

typedef int ElemType; 

typedef struct List
{
    ElemType *elem;                      //线性表的基址,相当于数组的首地址
    int length;                    //线性表的当前长度 
    int listsize;                  //线性表的容量 
}sqList;

/////////线性表的初始化
void InitList(sqList &s)
{
    s.elem = (int *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);         //分配数组空间
    if(!s.elem)
     exit(0);                               //若分配失败,则退出

    s.listsize = LIST_INIT_SIZE;            //设置数组容量
    s.length = 0;                           //刚开始时数组为空   
}

////////////////销毁线性表 
void DestoryList(sqList &s)
{
    free(s.elem);                      //销毁线性表只需要回收已分配的空间即可 
} 

////////////////向线性表中插入元素
int ListInsert(sqList &s,int i,ElemType e)           //表示在线性表s第i位插入元素e
{
    ElemType *p,*q;
    if(i<1 || i>s.length+1)                         //i的值不合法
      return -1;                                    
    if(s.length >= s.listsize)                      //如果线性表已满,就重新分配空间
    {
        s.elem = (ElemType *)realloc(s.elem,sizeof(ElemType)*(LIST_INIT_SIZE+s.listsize));
        s.listsize += LIST_INCREMENT;
    } 

    q = s.elem + i - 1;                //q为要插入的位置,因为数组的下标从0开始,所以减一
    for(p = s.elem+s.length-1 ; p >= q ; --p)            //从线性表的最后一个元素位置遍历到插入位置的后一个
        *(p+1) = *p;                   //将元素后移一位

    /*for(int j = s.length-1 ; j >= i ; --j)                //另一种移位法 
        *(s.elem+j+1) = *(s.elem+j);*/
    *q = e;                            //插入e
    s.length ++;                       

    return 1;
} 

/////////////////删除线性表中的元素 
int ListDelete(sqList &s,int i)
{   
    ElemType *p,*q;  
    if(s.length == 0 || i<1 || i>=s.length)   //判断线性表是否为空和i的位置是否合法 
        exit(0); 
    q = s.elem + i - 1;                      //q为要插入的位置

    for(p = q; p <= s.elem+s.length-1; p++)
        *p = *(p+1);
    /*
    for(int j = i-1; j <= s.length-1 ; j++)
       *(s.elem+j) = *(s.elem+j+1);                //将删除位置后的元素前移一位*/ 

    s.length --; 
    return 1;     
}


int main()
{   
    sqList s;
    int a[10] = {9,6,0,3,2,5,8,4,7,1};
    int i;

    InitList(s);

    for(i=0;i<10;i++)                         //向线性表中加入10个元素 
      ListInsert(s,i+1,a[i]);

    for(i=0;i<10;i++)                        //打印线性表中的每个元素 
      printf("%d ",*(s.elem+i));
    printf("\n"); 

    ListDelete(s,2);                        //删除线性表第二个元素 
    for(i=0;i<9;i++)
      printf("%d ",*(s.elem+i));
    printf("\n");  

    ListInsert(s,5,-2);                    //在线性表第5个元素的位置插入-2这个元素 
    for(i=0;i<10;i++)
      printf("%d ",*(s.elem+i));
    printf("\n");

    DestoryList(s);
    return 0; 
} 

运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值