线性表
一、顺序表
1.1 顺序表——定义
静态分配
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
动态分配
#define InitMax 10
typedef struct{
ElemType *data;
int MaxSize;
int length;
}SeqList;
1.2 顺序表——初始化
静态分配
void InitList(SqList &L){
for(int i=0;i<MaxSize;i++){
L.data[i]=0;
}
L.length=0;
}
动态分配
void InitList(SeqList &L){
L.data=(ElemType*)malloc(InitSize*sizeof(ElemType));
L.length=0;
L.MaxSize=InitSize;
}
1.3 顺序表——增加长度
void IncreaseSize(SeqList &L,int len){
int *p=L.data;
L.data=(int*)malloc((L.MaxSize+len))*sizeof(int);
for(int i=0;i<MaxSize;i++){
L.data[i]=p[i];
}
L.MaxSize=L.MaxSize+len;
free(p);
}
1.4 顺序表——插入
void ListInsert(SqList &L,int i,int e){
for(int j=L.length;j>i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
bool ListInsert(SqList &L,int i,int e){
if(i<1||i>L.length+1)
return false;
if(L.length>=MaxSize)
return false;
for(int j=L.length;j>i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
1.5 顺序表——删除
void ListDelete(SqList &L,int i,int &e){
if(i<1||i>L.length)
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return true;
}
1.6 顺序表——查找
按位查找
ElemType GetElem(SqList &L,int i){
return L.data[i-1];
}
按值查找
int LocateElem(SqList &L,ElemType e){
for(int i=0;i<L.length;i++){
if(L.data[i]==e)
return i-1
}
return 0;
}
bool isCustomerEqual(Customer a,Customer b){
if(a.num==b.num&&a.people==b.people)
return true;
else
return false;
}
二、单链表
2.1 单链表——定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
2.2 单链表——初始化
不带头结点
bool InitList(LinkList &L){
L=NULL;
return true;
}
带头结点
bool InitList(SqList &L){
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)
return false;
L->next=NULL;
return true
}
2.3 单链表——插入
按位序插入(不带头结点)
bool ListInit(LinkList &L,int i,ElemType e){
if(i<1)
return false;
if(i==1){
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L;
L=s;
return true;
}
LNode *p;
int j=1;
p=L;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
按位序插入(带头结点)
bool ListInit(LinkList &L,int i,ElemType e){
if(i<1)
return false;
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
后插操作
bool InsertNextNode(LNode *p,ElemType e){
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool ListInsert(LinkList &L,int i,ElemType e){
if(i<1)
return false;
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i-1){
p=p->next;
j++
}
return InsertNextNode(p,e);
}
前插操作
bool InsertPriorNode(LNode *p,ElemType e){
if(p==NULL)
return false;
LNode *s=(LNode)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return true
}
bool InsertPriorNode(LNode *p,LNode *s){
if(p==NULL||s==NULL)
return false;
s->next=p->next;
p->next=s;
ElemType temp=s->data;
s->data=p->data;
p->data=temp;
return true;
}
2.4 单链表——删除