C语言顺序线性表的操作

值得注意的是,在C语言中,&表示的取内容运算符,并不能表示引用类型,所以如果在下面函数形参是使用&的时候,那么就会发生报错expected ";" "," ")" before "&"token,对应的解决方法是:
方案一、将函数的形参修改成为指针类型*
方案二、将这个文件的拓展名修改成为cpp即可
对应的文章链接:https://blog.csdn.net/qq_38329811/article/details/78076819?ops_request_misc=&request_id=&biz_id=102&utm_term=expected%20%22:%22%20%22;%22%20before%20%22&%22%20to&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-78076819.first_rank_v2_pc_rank_v29

在第i个元素的前面插入新元素,这里提一下i的范围问题:
由于是第i个元素,所以i的范围本应该是 i >= 1 && i <= L.length,那么一些伙伴就会有疑问了,既然这样,那么实际判断i的范围的时候,为什么是 i < 1 || i > L.length + 1的时候返回ERROR呢?,为什么不是 i < 1 || i > L.length的时候返回ERROR?如果是后者的话,那么在输入第一个元素的时候,始终会造成插入失败,因为如果i输入0,那么就会造成i < 1从而返回了ERROR,而如果输入的i是1,那么就会导致i > L.length(因为L.length = 0),从而再次返回ERROR,插入失败,因此为了解决这个问题,应该是i < 1 || i > L.length + 1。这里可能会有说的不太好的地方,请大家指正哈

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100 //初始定义顺序线性表的最大容量
#define LIST_INCREMENT 10 //定义如果顺序线性表的长度大于最大容量时,每一次插入添加的长度
#define ElementType int //定义顺序表元素的类型为int
typedef struct{
   int *elem;//通过定义一个指针,后面给其分配空间,其作用相当于一个数组
   int listSize;//表示顺序表的初始最大容量
   int length; //表示当前顺序表的长度
}SqList;
int initSqList(SqList &L){
  /*
  值得注意的是,这里的形参使用了&,表示引用类型的,但是在C语言中并没有这个
  用法,而是应该使用指针*来表示,或者将这个文件的拓展名修改为.cpp即可,否
  则,如果没有修改的话,就会发生报错expected ";")" before "&" token
  */
  L.elem = (ElementType *)malloc(sizeof(ElementType) * LIST_INIT_SIZE);//给elem这个数组进行分配空间,最大的初始容量为LIST_INIT_SIZE
  if(!L.elem)
     return ERROR;//如果分配空间错误,那么返回ERROR
  L.length = 0;//当前顺序表的长度为0
  L.listSize = LIST_INIT_SIZE;
  return OK;//初始化成功,返回OK
}
/*
在顺序表的第i个元素前面插入元素e
如果插入成功,那么返回OK,否则返回ERROR,但是插入的前提需要判断
i的范围是否正确,由于是在第i个元素(即i是从1开始算的)前插入,所以i的范围应为i>= 1 && i <= L.length,但是一开始顺序表的长度是0,所以是只能输入1,那么如果是i > L.length的判断的话,那么就会导致插入失败,所以对应的判断条件应该是i < 1 || i > L.length + 1
*/
int insertSqList(SqList &L,int i,int e){

    if(i < 1 || i > L.length + 1)
        return ERROR;//i的范围错误,返回ERROR
    if(L.length >= L.listSize){
       //如果当前的长度大于等于最大容量,那么需要修改对应的内存空间
       ElementType *newElem= (ElementType *)realloc(L.elem,sizeof(ElementType) * (L.listSize + LIST_INCREMENT));//注意这里不应该是使用malloc,而是realloc进行修改内存空间
       if(!newElem)
          return ERROR;
       L.elem = newElem;
    }
    ElementType *p = NULL;//获取最后一个元素的地址
    //将在i及其后面的元素后移,从而使得新元素插入在下标为i - 1这个位置
    for(p = &(L.elem[L.length - 1]); p >= &(L.elem[i - 1]); p--)
       *(p + 1) = *p;
    *(p + 1) = e;
    L.length++;//插入一个元素之后,顺序表的长度相应的加1
    printf("插入新元素之后,顺序表的长度为%d\n",L.length);
    return OK;
}

/*
删除第i个元素,并将这个元素赋值给e,但是前提是需要判断
i的范围,由于是删除第i个元素,所以  i >= 1 && i <= L.length
*/
int deleteSqList(SqList &L,int i,int &e){
   if(i < 1 || i > L.length)
       return ERROR;
   ElementType *p = &(L.elem[i - 1]);//获取删除元素的地址
   e = *p;//将删除元素的值赋给e
   //将删除元素后面的值往前移
   for(p = p + 1; p <= &(L.elem[L.length - 1]); p++){
        *(p - 1) = *p;
   }
   L.length--;//删除一个元素之后,将顺序表的长度减1
   return OK;
}

/*
遍历元素,但是前提是需要判断这个顺序表是否为空
*/
void display(SqList &L){
     if(L.length == 0){
        printf("顺序表为空");
     }else{
        int i;
        for(i = 0; i < L.length; i++){
           if(i == L.length - 1)
               printf("{%d}\n",L.elem[i]);
           else
               printf("{%d} ->",L.elem[i]);
        }
     }
}
int main(){
   int i,x;
   ElementType e;
   SqList T;
   if(initSqList(T)){
      printf("顺序表创建成功!!!\n");
      printf("请输入相应的操作: 1->插入 2->删除 3->遍历 0退出操作: \n");
      scanf("%d",&i);
      while(i){
        switch(i){
           case 1:
               printf("请输入要新元素的值及其插入的位置:");
               scanf("%d%d",&x,&i);
               if(insertSqList(T,i,x)) printf("插入成功!!!\n");
               else printf("插入失败!!!\n");
               break;
            case 2:
               scanf("%d",&i);
               printf("删除链表的第%d个元素,",i);
               if(deleteSqList(T,i,e)){
                 printf("删除成功,删除的元素的值为%d\n",e);
               }else{
                 printf("删除失败!!!\n");
               }
               break;
           case 3:
               printf("顺序表为:");
               display(T);
               break;
        }
        printf("请输入相应的操作: 1->插入 2->删除 3->遍历 0->结束操作:\n");
        scanf("%d",&i);
     }
   }else{
      printf("链表创建失败!!!\n");
   }
   return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值