用c语言设计线性顺序表,求前驱,后进的问题。

/*顺序表抽象数据类型实现*/
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int status;
typedef int elemtype;
typedef struct {
elemtype elem[MAXSIZE];
int length;
}sqlist;
/*初始化*/
status initlist(sqlist *l){
l->length=0;
return OK;
}
/*销毁*/
status destroylist(sqlist *l){
l->length=0;
return OK;
}
/*顺序表置空*/
status clearlist(sqlist *l){
l->length=0;
return OK;
}
/*求顺序表长度*/
int listlength(sqlist l){
return l.length;
}
/*顺序表空否*/
status listempty(sqlist l){
if( l.length) return FALSE;
else return TRUE;
}
/*查找*/
int locateelem(sqlist l,elemtype e){
int i=0;
while(i<l.length)
if (l.elem[i++]==e) return i;
return 0;
}
/*读第i个元素*/
status getelem(sqlist l,int i,elemtype *e){
if((i<1)||(i>l.length)) return ERROR;
*e=l.elem[i-1];
return OK;
}
/*求前驱*/
status priorelem(sqlist l,elemtype cur_e,elemtype *pre_e){
int i;
i=locateelem(l,cur_e);
if((i==0)||(i==1)) return ERROR;
*pre_e=l.elem[i-2];
return OK;
}
/*求后继*/
status nextelem(sqlist l,elemtype cur_e,elemtype *next_e){
int i;
i=locateelem(l,cur_e);
if((i==0)||(i==l.length)) return ERROR;
*next_e=l.elem[i];
return OK;
}
/*在第i个位置插入元素e*/
status listinsert(sqlist *l,int i,elemtype e){
int j;
if((i<1)||(i>l->length+1)) return ERROR;
for(j=l->length;j>i-1;j--) l->elem[j]=l->elem[j-1];
l->elem[i-1]=e;
l->length++;
return OK;
}
/*删除第i个元素*/
status listdelete(sqlist *l,int i,elemtype *e){
int j;
if((i<1)||(i>l->length)) return ERROR;
*e=l->elem[i-1];
for(j= i;j< l->length;j++) l->elem[j-1]=l->elem[j];
l->length--;
return OK;
}
/*遍历*/
status listtraverse(sqlist l){
int i;
for(i=1;i<=l.length;i++)
printf("%d ",l.elem[i-1]);
printf("\n");
return OK;
}
/*建立顺序表*/
status listcreate(sqlist *l){
int i=0;
elemtype e;
printf("input data(end by -1):");
scanf("%d",&e);
while(e!=-1){
l->elem[i++]=e;
scanf("%d",&e);
}
l->length=i;
return OK;
}
/*主函数*/
main(){
sqlist la,lb,lc;
int i;
elemtype e,pre_e,next_e;
listcreate(&la);
listtraverse(la);
printf("the length of the list is %d\n",listlength(la));
printf("input i and e for insert:");
scanf("%d %d",&i,&e);
if(listinsert(&la,i,e)) listtraverse(la);
else printf("i is error!\n");
printf("input i :");
scanf("%d",&i);
getelem(la,i,&e);
printf("the element is %d ,",e);
priorelem(la,e,&pre_e);
nextelem(la,e,&next_e);
printf("the priore is %d,",pre_e);
printf("the next is %d\n",next_e);
listdelete(&la,i,&e);
listtraverse(la);

}
这是我的代码,我在求前驱和后进的时候,若输入i=1,则前驱显示不正常,若i=最后一个,则后进显示不正常,怎样完善程序,给出正确的提示,例如,“没有前驱”,“没有后进”。

第1个回答  推荐于2017-11-24
下面是我该完的程序。请运行一下,我改的地方都加了注释”//这里修改了“
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int status;
typedef int elemtype;
typedef struct {
elemtype elem[MAXSIZE];
int length;
}sqlist;
/*初始化*/
status initlist(sqlist *l){
l->length=0;
return OK;
}
/*销毁*/
status destroylist(sqlist *l){
l->length=0;
return OK;
}
/*顺序表置空*/
status clearlist(sqlist *l){
l->length=0;
return OK;
}
/*求顺序表长度*/
int listlength(sqlist l){
return l.length;
}
/*顺序表空否*/
status listempty(sqlist l){
if( l.length) return FALSE;
else return TRUE;
}
/*查找*/
int locateelem(sqlist l,elemtype e){
int i=0;
while(i<l.length)
if (l.elem[i++]==e) return i;
return 0;
}
/*读第i个元素*/
status getelem(sqlist l,int i,elemtype *e){
if((i<1)||(i>l.length)) return ERROR;
*e=l.elem[i-1];
return OK;
}
/*求前驱*/
status priorelem(sqlist l,elemtype cur_e,elemtype *pre_e){
int i;
i=locateelem(l,cur_e);
if((i==0)||(i==1)) {*pre_e='no';printf(" 没有前驱 ");;return ERROR;} //这里修改了
else //这里修改了
{
*pre_e=l.elem[i-2];
return OK;
}
}
/*求后继*/
status nextelem(sqlist l,elemtype cur_e,elemtype *next_e){
int i;
i=locateelem(l,cur_e);
if((i==0)||(i==l.length)){ *next_e='no';printf(" 没有后继 ");return ERROR;} //这里修改了
else //这里修改了
{
*next_e=l.elem[i];
return OK;
}
}
/*在第i个位置插入元素e*/
status listinsert(sqlist *l,int i,elemtype e){
int j;
if((i<1)||(i>l->length+1)) return ERROR;
for(j=l->length;j>i-1;j--) l->elem[j]=l->elem[j-1];
l->elem[i-1]=e;
l->length++;
return OK;
}
/*删除第i个元素*/
status listdelete(sqlist *l,int i,elemtype *e){
int j;
if((i<1)||(i>l->length)) return ERROR;
*e=l->elem[i-1];
for(j= i;j< l->length;j++) l->elem[j-1]=l->elem[j];
l->length--;
return OK;
}
/*遍历*/
status listtraverse(sqlist l){
int i;
for(i=1;i<=l.length;i++)
printf("%d ",l.elem[i-1]);
printf("\n");
return OK;
}
/*建立顺序表*/
status listcreate(sqlist *l){
int i=0;
elemtype e;
printf("input data(end by -1):");
scanf("%d",&e);
while(e!=-1){
l->elem[i++]=e;
scanf("%d",&e);
}
l->length=i;
return OK;
}
/*主函数*/
main(){
sqlist la,lb,lc;
int i;
elemtype e,pre_e,next_e;
listcreate(&la);
listtraverse(la);
printf("the length of the list is %d\n",listlength(la));
printf("input i and e for insert:");
scanf("%d %d",&i,&e);
if(listinsert(&la,i,e)) listtraverse(la);
else printf("i is error!\n");
printf("input i :");
scanf("%d",&i);
getelem(la,i,&e);
printf("the element is %d ,",e);
priorelem(la,e,&pre_e);
nextelem(la,e,&next_e);
if(pre_e!='no')printf("the priore is %d\n",pre_e); //这里修改了
if(next_e!='no')printf("the next is %d\n",next_e); //这里修改了
listdelete(&la,i,&e);
listtraverse(la);

}本回答被提问者采纳
第2个回答  2016-01-03
请百度一下