线性表:具有相同特性的数据元素的一个有限序列
特性:①有穷性(元素的个数有限)②一致性(所有元素的性质相同)③序列性(相对位置是线性的)
顺序表:线性表的顺序存储结构
结构体定义:
typedef stuct { ElemType data[MaxSize];//元素 int length;//长度 }SqList;
建立:
void CreatList(SqList * &L,ElemType a[],int n) { int i=0,k=0; L=(SqList *)malloc(sizeof(SqList)); while(i<n) { L->data[k]=a[i]; k++,i++; } L->length =k; }
初始化:InitList(&L)
void InitList(* &L){ L=(SqList *)malloc(sizeof(Sqlist)); L->length =0;//长度设置为0 }
销毁:DestoryList(&L)
void DestroyList(SqList *&L){ free(L); }
判断是否为空表:ListEmpty(L)
bool ListEmpty(SqList *L) { return(L->length==0); }
求线性表的长度:ListLength(L)
int ListLength(SqList *L){ return (L->length); }
输出线性表:DispList(L)
void DispList(SqList *L) { for(i=0;i<L->length;i++) printf("%d",L->data[i]); printf("\n"); )
求线性表某个数据元素的值:GetElem(L,i,&e)
bool GetElem(SqList *L,int i,ElemType &e) { if(i<1||i>L->length) return flase; e=L->data[i-1]; return true; )
按元素查找 LocateElem(L,e)
int LocateElem(SqList *L,ElemType e) { int i=0; while(i<L->length&&L->data[i]!=e) i++; if(i>L->length) return 0; else return i+1; }
插入数据元素ListInsert(&L,i,e)
bool ListInsert(SqList *&L,int i,ElemType e){ int j; if(i<1||i>L->length+1||L->length==Maxsize) return flase; i--; for(j=L->length;j>i;j--) L->data[j]=L->data[j-1];//往后面移位 L->data[i]=e;//插入到i这个位置 L->length++;//成功长度加一 return true; }
删除数据元素ListDelete(&L,i,&e)
bool ListDelete(SqList *&L,int i,ElemType &e){ int j; if(i<1||i>L->length+1) return flase; i--; e=L->data[i]; for(j=i;j<L->length-1;j++) L->data[j]=L->data[j+1]; L->length--; return true; }
例子:删除所有值为x的元素
void delnode1(SqList *&L,ElemType x) { int i,k=0; for(i=0;i<L->length;i++){ if(L->data[i]!=x) {L->data[k]=L->data[i];//重新构建线性表 k++; } else continue;//可以不写 } L->length=k; }
void delnode2(SqList *&L,ElemType x){ int k=0,j=0; while(i<L->length){ if(L->data[i]==x) k++;//记录有多少个X else L->data[i-k]=l->data[i];//向前以动K个X位置 i++; }
案例二:以第一个元素为分界线,将小于它的数放在前面,大于它的数放在后面
int partition(SqList *&L) { int i=0;j=l->length-1; ElemType pivot=L->data[0]; while(i<j) { while(i<j&&L->data[j]>pivot) j--; while(i<j&&L->data[i]<=pivot) i++; if(i<j) swap(L->data[i],L->data[j]); } swap(L->data[0],L->data[i]); }