关于顺序表删除的问题
在顺序表操作6那里出了问题,想不通是什么问题,小弟目前是大二软件工程的学生,求大师解答!#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量
#define LISTINCREMENT 10 // 线性表存储空间的分配增量
#define OK 1
#define OVERFLOW 0
#define ERROR 0
typedef char ElemType; // 处理字符数据
typedef struct {
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量以sizeof(ElemType)为单位
} SqList; // 顺序表
int InitList_Sq(SqList& L) { // 顺序表操作1
// 构造一个空的顺序表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
} // InitList_Sq
void ShowList_Sq(SqList L) { // 顺序表操作2
// 显示顺序表中的所有元素
int i;
if(!L.elem)exit(OVERFLOW);
for(i=0;i<L.length;i++)
{
printf("%5d",L.elem[i]);
}
return;
} // ShowList_Sq
int GetLength_Sq(SqList L) { // 顺序表操作3
// 获取顺序表表长
if(!L.elem)exit(OVERFLOW);
return L.length;
} // GetLength_Sq
int LocationList_Sq(SqList L, ElemType e) { // 顺序表操作4
// 给定元素e在顺序表中找其位序
// 因为只找相等的,可以定义比较函数,也可不定义直接在本函数中比较相等
int i=1;
ElemType *p=L.elem;
while(i<=L.length&&*p++!=e)i++;
if(i<=L.length) return i;
else return 0;
} // LocationList_Sq
int ListInsert_Sq(SqList& L, int i, ElemType e) { // 顺序表操作5
// 在顺序表L的第i个元素之前插入新的元素e,
// i 的合法范为 1≤i≤L.length+1
if (i < 1 || i > L.length+1) return ERROR;
if (L.length >= L.listsize) {
// 当前存储空间已满,增加分配
ElemType *newbase;
newbase = (ElemType *)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof (ElemType));
if (!newbase) exit(OVERFLOW);
// 存储分配失败
L.elem = newbase; // 新基址
L.listsize += LISTINCREMENT; // 增加存储容量
}
} // ListInsert_Sq
int ListDelete_Sq(SqList& L, int i, ElemType& e) { // 顺序表操作6
// 把顺序表L的第i个元素删除, 并把其值放到e中
// i 的合法范围为 1≤i≤L.length
if((i<1)||(i>L.length)) return ERROR;
int p,q;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
} // ListDelete_Sq
[/color]
void DestroyList_Sq(SqList& L) { // 顺序表操作7
// 销毁顺序表
free(L.elem);
L.length=0;
}
int main() {
int i;
SqList L;
ElemType e;
ElemType a[]={'a','b','c','d','e'};
InitList_Sq(L); // 实验内容1
for(i=0;i<5;i++) ListInsert_Sq(L, i+1, a[i]); // 实验内容2
printf("当前表中的元素:\n");
ShowList_Sq(L);
printf("当前表的长度:%d\n",GetLength_Sq(L));
i=LocationList_Sq(L, 'e'); // 实验内容3
if(i==0) printf("e不在当前表中\n");
else printf("e在当前表中,在表中的位置:%d\n",i);
i=LocationList_Sq(L, 'f');
if(i==0) printf("f不在当前表中\n");
else printf("f在当前表中,在表中的位置:%d\n",i);
if(ListInsert_Sq(L, 2, 'f')) { // 实验内容4
printf("插入成功,当前表中的元素:\n");
ShowList_Sq(L);
printf("当前表的长度:%d\n",GetLength_Sq(L));
}
if(ListDelete_Sq(L, 5, e)) { // 实验内容5
printf("删除成功,删除的第5个元素是:%c\n",e);
printf("当前表中的元素:\n");
ShowList_Sq(L);
printf("当前表的长度:%d\n",GetLength_Sq(L));
}
DestroyList_Sq(L); // 实验内容6
return 0;
}