C语言数据结构中顺序表遇到的困难

以下为顺序表的基本操作,是可以正常运行的,结果也没问题
问题如代码中所问

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100 
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;
typedef char ElemType;

//顺序表的的定义* 
typedef struct{
    ElemType *elem;
    int length;
}SqList; 

//线性表的初始化* 
Status InitList_Sq(SqList &L){
    L.elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
    if(!L.elem){
        exit(OVERFLOW);
    }
    L.length = 0;
    return OK;
} 

//销毁线性表L*
void DestroyList(SqList &L){
    if(L.elem){
        free(L.elem);
    }
} 

//清空线性表L*
void ClearList(SqList &L){
    L.length = 0;
} 

//判断线性表L的长度* 
int GetLength(SqList L){
    return L.length;
} 

//判断线性表L是否为空* 
Status IsEmpty(SqList L){
    if(!L.length){
        return TRUE;
    }else{
        return FALSE;
    }
} 

//顺序表的取值* 
Status GetElem(SqList L,int i,ElemType &e){
    if(i<1||i>L.length){
        return ERROR;
    }
    e = L.elem[i-1];
    return OK;
} 

//顺序表的查找* 
int LocateElem(SqList L,ElemType e){
    for(int i=0;i<L.length;i++){
        if(L.elem[i]==e){
            return (i+1);
        }
    }
    return 0;
}

//顺序表的插入* 
Status ListInsert_Sq(SqList &L,ElemType e,int i){
    if(i<1||i>L.length+1){
        return ERROR;
    }
    if(L.length==MAXSIZE){
        return ERROR;
    }
    if(i<=L.length){
        for(int j=L.length;j>=i;j--){
            L.elem[j] = L.elem[j-1];
        }
        L.elem[i-1] = e;
    }else{
        L.elem[i-1] = e;
    }
    L.length += 1;
    return OK;
} 

//顺序表的删除* 
Status ListDelete_Sq(SqList &L,int i){
    if(i<1||i>L.length){
        return ERROR;
    }
    for(int j=i-1;j<L.length-1;j++){
        L.elem[j]=L.elem[j+1];
    }
    L.length--;
    return OK;
}

int main(){
    char a[MAXSIZE] = {};
    char x;
    ElemType m;
    int n;
    printf("请输入一串字符");
    scanf("%s",&a);//第一个问题:为什么这里&a和a都可以,不影响运行和结果
    int length = (int)strlen(a);
    SqList S;//定义 
    InitList_Sq(S);//初始化 
    for(int i=0;i<length;i++){
        ListInsert_Sq(S,a[i],i+1);//插入 
    }
    printf("顺序表的长度为%d\n",GetLength(S));//判断长度 
    printf("请输入要删除的字符:");
    scanf("%s",&m);/*第二个问题:为什么这里必须是&m,用m就无法正常运行(m会赋值失败,变成空的然后继续后面的运行)用%c也会运行错误,甚至会直接不给输入的时间,跳过后直接运行后方代码。用%c后getchar()也是同%c一样,会不给输入时间*/
    n = LocateElem(S,m);//查找 
    if(ListDelete_Sq(S,n)){//删除 
        if(GetElem(S,n,x)){//取值 
            printf("第%d个元素为:%c,现在的顺序表长度为%d\n",n,x,GetLength(S));//判断长度 
        }
    }
    ClearList(S);//清空 
    if(IsEmpty(S)){//判空 
        printf("顺序表此时为空\n");
    }else{
        printf("顺序表此时不为空\n");
    }
    DestroyList(S);//销毁 
    if(S.elem){
        printf("销毁成功");
    }else{
        printf("销毁失败");
    }
    return 0; 
}

因为a是数组名称,a就是数组的首地址,& a也是传地址,简单讲如果参数是数组可以省略&符号。

第一个问题,因为a是数组,语言规则规定的a传的本身就是指针,那么对a取址取的也是它本身的地址,你就当它是一种人为规定,不需要想太多,想太多会累而且很多余。

第二个问题,scanf是个输入相关函数,你要让它输入到什么地方,那肯定是输入到你想要输入的变量的内存里面,那就必须对此变量获取内存地址,你不取址,那么就等于把m的值传给scanf函数了,m的值是任意的,它与m的地址又无关。还有一点你这个是错误的,m是字符类型,不是字符数组不能接收字符串啊,必须用%c来操作,至于你说的不成功可能是其它问题造成。而且你用%s给m赋值,这就有有可能越界的。为什么没有出错,那只能是巧合。