值得注意的是,在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;
}