静态分配
编译时已确定数组的大小和位置,程序运行期间不可改变。
源代码如下:
#include<stdio.h>
#include<stdlib.h>
#define maxSize 1000
#define OVERFLOW 9999
#define ERROR -1
#define EMPTY -2
typedef struct{
int Selem[maxSize];
int length;
}SList;
void initList(SList *L);
void insertList(SList *L,int i,int e);
int listLength(SList L);
int getElem1(SList L,int i);
void getElem2(SList L,int i,int *e);
int locateElem(SList L,int e);
void listDelete(SList *L,int i,int *e);
void printList(SList L);
int emptyList(SList L);
void destroyList(SList *L);
int main(){
SList L;
initList(&L);
int e;
int i;
int o;
for(i=1;i<5;i++){
insertList(&L,i,i);
}
printList(L);
printf("Hello!\n");
int m = listLength(L);
printf("顺序表的长度:\t%d\n",m);
insertList(&L,2,22);
printList(L);
printf("第二个元素:%d\t\n",getElem1(L,1));
getElem2(L,2,&e);
printf("第三个元素:%d\t\n",e);
printf("元素4的index=%d\n",locateElem(L,4));
listDelete(&L,3,&o);
printf("删除的元素值:%d\n",o);
printList(L);
printf("%d\n",emptyList(L));
return 0;
}
void initList(SList *L){
L = malloc(sizeof(SList));
if(!L->Selem)
exit(OVERFLOW);
L->length = 0;
return;
}
void insertList(SList *L,int i,int e){
if(L->length==maxSize)
exit(OVERFLOW);
if(i<1 || i>L->length)
exit(ERROR);
int j;
for(j=L->length-1;j>=i-1;j--)
L->Selem[j+1] = L->Selem[j];
L->Selem[i-1] = e;
L->length++;
return;
}
int listLength(SList L){
return L.length-1;
}
int getElem1(SList L,int i){
if(i<0 || i>L.length)
exit(ERROR);
return L.Selem[i];
}
void getElem2(SList L,int i,int *e){
if(i<0 || i>L.length)
exit(ERROR);
*e = L.Selem[i];
return;
}
int locateElem(SList L,int e){
int i;
for(i=0;i<L.length-1;i++)
if(L.Selem[i]==e)
break;
if(i!=L.length)
return i;
else
return 0;
}
void listDelete(SList *L,int i,int *e){
if(L->length==0){
exit(EMPTY);
}
if(i<1 || i>L->length)
exit(ERROR);
*e = L->Selem[i-1];
int j;
for(j=i-1; j<L->length-1; j++)
{
L->Selem[j] = L->Selem[j+1];
}
L->length--;
return;
}
void printList(SList L){
int i;
for( i=0;i<L.length-1;i++){
printf("%d\t",L.Selem[i]);
}
printf("\n");
}
int emptyList(SList L){
if(L.length > 0) return 1;
return 0;
}
void destroyList(SList *L){
if(!L->Selem)
exit(ERROR);
free(L->Selem);
L->length =0;
}
运行结果

代码来源于教材,经过组织修正得到的结果。