最近趁时间充足,回顾了一下数据结构,心血来潮,借此机会添上源码,如有错误,还请各位请多多指正,但请别指指点点o(╯□╰)o! #include <stdio.h> #define INIT_SIZE 50 /*定义顺序表存储空间初始化大小*/ #define INCREMENT_SIZE 15 /*存储空间的自增量*/ #define ERROR 0 //错误时返回的状态 #define OK 1 //成功时返回状态 typedef int Status; /*定义返回状态*/ typedef int ElemType; /*定义元素类型*/ /*定义顺序表的存储结构*/ typedef struct { ElemType *elem; //存储元素类型 int length; //长度 int size; //当前分配的存储容量 }ArrayList; void Print(ArrayList *L);//打印函数在前面的函数里要使用,必须先声明 /** *顺序表初始化函数 *需要传递结构指针 */ Status Init(ArrayList *L) { L->elem=(ElemType *)malloc(INIT_SIZE*sizeof(ElemType)); //分配内存 if(!L->elem)return ERROR; //分配失败 L->length=0; //初始化长度为0 L->size=INIT_SIZE; //初始化分配的内存大小 return OK; } Status Build(ArrayList *L,int len) { int i; if(len>=L->size) //长度大于顺序表存储空间的大小的时候,重新增加分配空间 { L->elem=(ElemType *)realloc(L->elem,(L->size+len)*sizeof(ElemType));//重新分配内存 if(!L->elem) return ERROR; L->size+=(L->size+len); //在原有的大小上增加分配的内存大小 } printf("请输入顺序表元素(空格隔开):/n"); for(i=0;i<len;i++) //输入元素 { scanf("%d",&L->elem[i]); } L->length=len; //修改长度 } /** *顺序表的插入 *L:结构指针; pos位置; ElemType:要插入的元素; */ Status Insert(ArrayList *L,int pos,ElemType elem) { int k; if(pos<1||pos>L->length+1)return ERROR; //pos位置不合法的 if(L->length>=L->size) //查看存储空间是否充足,不足则分配内存 { L->elem=(ElemType *)realloc(L->elem,(L->size+INCREMENT_SIZE)*sizeof(ElemType));//重新分配内存 if(!L->elem) return ERROR; L->size+=(L->size+INCREMENT_SIZE); //在原有的大小上增加分配的内存大小 } for(k=L->length;k>=pos;k--) L->elem[k]=L->elem[k-1]; //插入位置之后的元素向后移动一位 L->elem[pos-1]=elem; //插入元素到pos位置上 ++L->length; //长度增加一 return OK; } /** *顺序表的删除 *L:顺序表结构;pos:删除的位置;e返回删除的元素 */ Status Delete(ArrayList *L,int pos,ElemType *e) { int k; if(pos<1||pos>L->length+1)return ERROR; //pos位置不合法的 *e=L->elem[pos-1]; //当前删除的元素赋值给e for(k=pos;k<=L->length-1;k++) L->elem[pos-1]=L->elem[k]; //删除后,后续元素向前移动一位 --L->length; //长度减一 return OK; } int Locate(ArrayList L,ElemType elem) { int i,temp=0; for(i=0;i<L.length;i++) { if(L.elem[i]==elem){ temp=i+1; break; } } return temp; } Status Destroy(ArrayList *L) { if(L&&L->size>0) { if(free(L->elem)) { L=NULL; return OK; } } } /** * 打印顺序表元素 */ void Print(ArrayList *L) { int i; printf("当前顺序表包含(%d)个元素,打印结果:/n",L->length); for(i=0;i<L->length;i++) { printf("【%d】/t",L->elem[i]); } printf("/n"); } int main(int argv,char *argc[]) { ArrayList *L; //声明一个顺序表L变量 int pos,num,search_pos,del_pos; //定义变量 ElemType elem,search,del; //定义插入的元素elem变量 printf("★★★★★★★★初始化★★★★★★★★/n/n"); Init(L); printf("请输入顺序表元素个数:/n"); scanf("%d",&num); Build(L,num); Print(L); printf("/n★★★★★★★★插入元素★★★★★★★★/n/n"); printf("请输入要插入元素的位置:/n"); scanf("%d",&pos); printf("请输入要插入的元素:/n"); scanf("%d",&elem); Insert(L,pos,elem); Print(L); printf("/n★★★★★★★★查找元素★★★★★★★★/n/n"); printf("请输入要查找的元素:/n"); scanf("%d",&search); search_pos=Locate(*L,search); if(!search_pos) { printf("未查找到!/n"); } else { printf("您查找的元素在位置:%d/n",search_pos); } printf("/n★★★★★★★★删除元素★★★★★★★★/n/n"); printf("请输入要删除的元素的位置:/n"); scanf("%d",&del_pos); Delete(L,del_pos,&del); printf("成功删除元素:%d/n",del); Print(L); if(Destroy(L)==OK) { printf("成功销毁顺序表!/n"); } else { printf("销毁顺序表失败!/n"); } return 0; } 结构如下: