编译时已确定数组的大小和位置,程序运行期间不可改变。 源代码如下:
#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)); // destroyList(&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; // e插入到线性表的第i个位置 L->length++; return; } // 求线性表的长度 int listLength(SList L){ return L.length-1; } // 获取线性表的第i个元素 int getElem1(SList L,int i){ if(i<0 || i>L.length) exit(ERROR); return L.Selem[i]; } // 获取线性表的第i个元素 void getElem2(SList L,int i,int *e){ if(i<0 || i>L.length) exit(ERROR); *e = L.Selem[i]; return; } // 确定元素e是线性表中的第几个元素 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; } //删除线性表中的第i个元素,将其放在变量e中 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]; // 线性表中的第i个元素存放于变量e中 int j; for(j=i-1; j<L->length-1; j++) { //从第i个数据元素开始,依次将后面的元素前移一个位置 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; }运行结果