二 线性表
2.1 顺序表
2.1.1 顺序表的结构体
const int maxn = 1e5+5;
struct SqList{
int len;
int data[maxn];
};
2.1.2 顺序表的动态分配
const int maxn = 1e2+5;
struct SeqList{
int *data;
int MaxSize,lenght;
};
2.1.3 基本操作
bool ListInsert(SqList &L, int p, int e) {
if(p < 0 || p > L.len)
return false;
for(int i = L.len; i > p; i--)
L.data[i] = L.data[i - 1];
L.data[p] = e;
L.len++;
return true;
}
bool ListDelete(SqList &L, int p, int &e) {
if(p < 0 || p >= L.len)
return false;
e = L.data[p];
for(int i = p; i < L.len - 1; i++)
L.data[i] = L.data[i + 1];
L.len--;
return true;
}
int LocateElem(SqList L, int e) {
for(int i = 0; i < L.len; i++)
if(L.data[i] == e)
return i;
return -1;
}
void ListPrint(SqList L) {
for(int i = 0; i < L.len; i++)
cout << L.data[i] << " ";
cout << endl;
}
2.2 单链表
2.2.1 定义
struct Lnode {
int data;
Lnode* next;
};
typedef Lnode* LinkList;
2.2.2 初始化
void InitList(LinkList &L) {
L = new Lnode;
L->next = NULL;
}
2.2.3 输出
void List_print(LinkList L) {
Lnode* p = L->next;
while(p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
2.2.4 头插法
LinkList List_HeadInsert(LinkList &L, int n) {
Lnode *s;
InitList(L);
for(int i = 0; i < n; i++) {
s = new Lnode;
cin >> (s->data);
s->next = L->next;
L->next = s;
}
List_print(L);
return L;
}
2.2.5 尾插法
LinkList List_TailInsert(LinkList &L, int n) {
InitList(L);
Lnode *s, *r = L;
for(int i = 0; i < n; i++) {
s = new Lnode;
cin >> (s->data);
s->next = r->next;
r->next = s;
r = s;
}
r->next = NULL;
List_print(L);
return L;
}
2.2.6 按位置查找
Lnode *GetElem(LinkList L, int p) {
if(p < 0)
return NULL;
if(p == 0)
return L;
Lnode* s = L->next;
p--;
while(s && p--)
s = s->next;
return s;
}
2.2.7 按值查找
Lnode *locateElem(LinkList L, int e) {
Lnode* s;
for(s = L->next; s && s->data != e; s = s->next);
return s;
}
2.2.8 插入元素
bool ListInsert(LinkList &L, int p, int e) {
Lnode *s = L;
if(p<=0) return false;
p--;
while(p-- && s)
s = s->next;
if(!s)
return false;
else {
Lnode *t = new Lnode;
t->data = e;
t->next = s->next;
s->next = t;
return true;
}
}
2.2.9 删除元素
bool ListDelete(LinkList &L, int p, int &e) {
if(p <= 0)
return false;
p--;
Lnode *s = L;
while(p-- && s)
s = s->next;
if(!s || !(s->next))
return false;
else {
Lnode *t = new Lnode;
t = s->next;
e = t->data;
s->next = t->next;
delete t;
return true;
}
}
2.3 双链表
typedef struct Dnode{
int data;
Dnode * prior;
Dnode * next;
}DlinkNode;