这两天实现了一下顺序表的相关操作,包括顺序表初始化、创建、遍历、第i个元素前插入,删除第i个元素、查找元素e的位置、清空顺序表、销毁顺序表、合并两个非递减顺序表操作。
这次在网上学习到了新的布局方法,将顺序表的存储结构定义,函数说明部分放在了头文件里,源文件中实现的是主函数和各功能函数。
这次使用的编译环境是vc++6.0
//头文件部分#define LIST_INIT_SIZE 5#define INCREAMENT 5typedef char Elemtype;typedef int Status;//线性表存储结构定义typedef struct {Elemtype *elem;int length;int listsize;}SqList;//函数说明部分Status InitList(SqList &L);Status CreateList(SqList &L,int size);Status TraverseList(SqList L);Status ListInsert(SqList &L,int i,Elemtype e);Status ListDelete(SqList &L,int i,Elemtype &e);int LocateElem(SqList L,Elemtype e,Status (*compare)(Elemtype e,Elemtype temp));Status ClearList(SqList &L);Status DestroyList(SqList &L);Status EqualElem(Elemtype e,Elemtype temp);void MergeList(SqList La,SqList Lb,SqList &Lc);//源文件部分#include#include //malloc函数包含在其中//将自定义头文件包含进来时只能用""#include"ListHeader.h"//程序入口void main(){ int size=6; SqList list; Elemtype deletes; InitList(list); CreateList(list,size);// TraverseList(list);// ListInsert(list,5,'o');// TraverseList(list);// ListDelete(list,5,deletes);// TraverseList(list);// printf("找到符合compare关系的元素位序是:%d\n",LocateElem(list,'b',EqualElem));// ClearList(list);// TraverseList(list);// DestroyList(list);// TraverseList(list); SqList list2; InitList(list2); CreateList(list2,5); SqList list3; InitList(list3); MergeList(list,list2,list3); TraverseList(list3); getchar();}//初始化一个顺序表Status InitList(SqList &L){ //分配内存 L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype)); if(!L.elem){ return false; } L.length=0; L.listsize=LIST_INIT_SIZE; return true;}//创建顺序表(判断是否需要重新分配内存,将元素读入)Status CreateList(SqList &L,int size){ if(size>L.listsize){ Elemtype *newbase; newbase=(Elemtype *)realloc(L.elem ,(L.listsize+INCREAMENT)*sizeof(Elemtype)); if(!newbase){ return false; } L.elem=newbase; L.listsize+=INCREAMENT; } printf("输入创建顺序表内容:\n"); for(int i=0;i L.length){ return false; } if(L.length>=L.listsize){ Elemtype *newbase;//这里为了更好的判断出空间分配结果,新建一个变量newbase newbase=(Elemtype *)realloc(L.elem,(L.listsize+INCREAMENT)*sizeof(Elemtype)); if(!newbase){ return false; } L.listsize+=INCREAMENT; } Elemtype *itemp,*ttemp; itemp=&(L.elem[i-1]); ttemp=&(L.elem[L.length-1]); for(ttemp;ttemp>=itemp;ttemp--){ *(ttemp+1)=*ttemp; } *itemp=e; //这里的itemp始终指向第i个元素的位置,所以用他赋值较好 L.length+=1; return true;}//删除顺序表中第i个元素Status ListDelete(SqList &L,int i,Elemtype &e){ if(i<0||i>L.length){ return false; } Elemtype *itemp=&(L.elem[i-1]); e=*itemp; Elemtype *ttemp=&(L.elem[L.length-1]); for(itemp;itemp L.length){ i=0; } return i;}//清空顺序表,只让length=0Status ClearList(SqList &L){ L.length=0; return true;}//销毁顺序表,释放elem指针Status DestroyList(SqList &L){ if(L.elem){ free(L.elem); } L.length=0; return true;}//两个元素是否相等Status EqualElem(Elemtype e,Elemtype temp){ if(e==temp){ return true; } return false;}//将两个值不递减的顺序表合并到一个新的顺序表中void MergeList(SqList La,SqList Lb,SqList &Lc){ Lc.listsize=La.length+Lb.length; Lc.length=Lc.listsize; Lc.elem=(Elemtype *)malloc(Lc.listsize*sizeof(Elemtype)); Elemtype *pa,*pb,*pa_last,*pb_last,*pc; pa=&La.elem[0]; pb=&Lb.elem[0]; pa_last=&(La.elem[La.length-1]); pb_last=&(Lb.elem[Lb.length-1]); pc=&Lc.elem[0]; while(pa<=pa_last&&pb<=pb_last){ if(*pa<*pb){ *pc++=*pa++; } else{ *pc++=*pb++; } } while(pa<=pa_last){ *pc++=*pa++; } while(pb<=pb_last){ *pc++=*pb++; }}