#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef char ElemType;
typedef int Status;
typedef struct{
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
}Sqlist;
Status InitList_Sq(Sqlist *L) {
int i;
L->elem = (ElemType *) malloc (LIST_INIT_SIZE * sizeof(ElemType) );
if(!L->elem)exit(OVERFLOW);//存储分配失败
for(i=0;i<26;i++)
L->elem[i]='a'+i;
L->length=26;
L->listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq ( Sqlist *L, int i, ElemType e ){
//在顺序线性表L中第i个位置之前插入新的元素e,
//i的合法值为1<=i<=ListLength_Sq(L)+1
ElemType *newbase, *p, *q;
if(i<1 ||(i>L->length)) return ERROR;
if(L->length >= L->listsize) {//当前存储空间已满,增加分配
newbase = (ElemType *)realloc(L->elem, (L->listsize+LISTINCREMENT)*sizeof(ElemType) );
if(!newbase) exit(OVERFLOW);//存储分配事变
L->elem = newbase;//新基址
L->listsize += LISTINCREMENT;//增加存储容量
}
q = &(L->elem[i-1]);//q为插入位置
for( p = &(L->elem[L->length-1]); p >= q; --p)
*(p+1)=*p;//插入位置及之后的元素右移
*q = e;//插入e
++L->length;//表长增1
return OK;
}
Status ListDelete_Sq(Sqlist *L, int i, ElemType e){
//在顺序表L中删除第i个元素。
//i的合法值为1<=i<=ListLength_Sq(L)+1}
ElemType *p, *q;
if((i<1)||(i>L->length))return ERROR;
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;
}
Status ListDisplay(Sqlist A){//显示顺序表元素
int i=0;
printf("
字母表为:");
while(i < A.length) {
printf("%5c", A.elem[i]);
i++;
}
printf("\n");
return 0;
}
void main( ) {
char e;
int i,a;
Sqlist A;
InitList_Sq(&A);
ListDisplay(A);
printf("请输入要插入的字母和位置:\n");
scanf("%c,%d", &e,&i);
getchar();
ListInsert_Sq(&A,i,e);
ListDisplay(A);
printf("请输入要删除的字母和位置:\n");
scanf("%c,%d", &e,&i);
ListDelete_Sq(&A,i,e);
ListDisplay(A);
}