Kilig_0912 2021-12-20 03:04 采纳率: 0%
浏览 68

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; 
}
  • 写回答

2条回答 默认 最新

  • 关注

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

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 12月20日

悬赏问题

  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题