以下为顺序表的基本操作,是可以正常运行的,结果也没问题
问题如代码中所问
#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;
}