CH2 线性表
2.2 线性表的顺序实现
假定线性表的元素类型为ElemType
静态分配的顺序表存储结构
#define MaxSize 50
typedef struct{ElemType data[MaxSize];int length;
}SqList;
动态分配的顺序表存储结构
#define InitSize 100
typedef struct{ElemType *data;int MaxSize,length;
}SeqList;
顺序表的插入操作
bool ListInsert(SqList &L,int i,ElemType 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;
}
顺序表的删除操作
bool ListDelete(SqList &L,int i,ElemType &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;
}
顺序表按值查找
int LocateElem(SqList L,ElemType e){int i;for(i=0;i<L.length;i++)if(L.data[i]==e)return i+1;return 0;
}
2.3 线性表的链式表示
2.3.1 单链表
单链表的节点类型
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;
插入节点操作
bool ListInsert(LinkList &L,int i,ElemType e){LNode *p=L;int j=0;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 ListDelete(LinkList &L,int i,ElemType &e){LNode *p=L;int j=0;while(p->next!=NULL&&j<i-1){p=p->next;j++;}if(p->next==NULL||j>i-1)return false;LNode *q=p->next;e=q->data;p->next=q->next;free(q);return true;
}
采用头插法建立单链表
LinkList List_HeadInsert(LinkList &L){LNode *s; int x;L=(LNode*)malloc(sizeof(LNode));L->next=NULL;scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);}return L;
}
采用尾插法建立单链表
LinkList List_TailInsert(LinkList &L){int x;L=(LNode*)malloc(sizeof(LNode));LNode *s,*r=L;scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;scanf("%d",&x);}r->next=NULL;return L;
}
2.3.2 双链表
双链表的节点类型
typedef struct DNode{ElemType data;struct DNode *prior,*next;
}DNode, *DLinkList;
2.3.3 静态链表
静态链表的结构类型
#define MaxSize 50
typedef struct{ElemType data;int next;
}SLinkList[MaxSize];