一、顺序表顺序存储结构
typedef struct {
ElemType *elem;
int length;
}SqList;
顺序表的初始化
typedef int Status;
#define MAXSIZE 10000
Status InitList(SqList &L) {
L.elem = (int *)malloc(sizeof(int) * MAXSIZE);
if(!L.elem) exit(0);
L.length = 0;
return 1;
}
顺序表的取值
Status GetElem(SqList L, int i, ElemType &e) {
if(i < 1 || L.length) return 0;
e = L.elem[i-1];
return 1;
}
顺序表的查找
int LocateElem(SqList L, ElemType e) {
for(int i = 0; i < L.length; i++) {
if(L.elem[i] == e) return i+1;
}
return 0;
}
顺序表的插入
Status ListInsert(SqList &L, int i, ElemType e) {
if(i < 1 || i > L.length+1) return 0;
if(L.length == MAXSIZE) return 0;
for(int j = L.length-1; j >= j - 1; j--) {
L.elem[j+1] = L.elem[j];
}
L.elem[i-1] = e;
L.length++;
return 1;
}
顺序表的删除
Status ListDelete(SqList &L, int i) {
if(i < 1 || i > L.length) return 0;
for(int j = i; j <= L.length-1; j++) {
L.elem[j-1] = L.elem[j];
}
L.length--;
return 1;
}
二、顺序表的链式存储结构
typedef int ElemType ;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode, *LinkList;
单链表的初始化
typedef int Status;
#define MAXSIZE 1000
Status InitList(LinkList &L) {
L = (LinkList) malloc (sizeof(LNode) * MAXSIZE);
L->next = NULL;
return 1;
}
单链表的取值
Status GetElem(LinkList L, int i, ElemType &e) {
LinkList p = L->next;
int j = 1;
while(p && j < i) {
p = p->next;
j++;
}
if(!p || j > i) return 0;
e = p->data;
return 1;
}
单链表的查找
LNode *LocateElem(LinkList L, ElemType e) {
LinkList p = L->next;
while(p && p->data != e) {
p = p->next;
}
return p;
}
单链表的插入
Status ListInsert(LinkList &L, int i, ElemType e) {
LinkList p = L;
int j = 0;
while(p && j < i - 1) {
p = p->next;
j++;
}
if(!p || j > i - 1) return 0;
LinkList s = (LinkList) malloc (sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
单链表的删除
Status ListDelete(LinkList &L, int i) {
LinkList p = L;
int j = 0;
while(p->next && j < i - 1) {
p = p->next;
j++;
}
if(!(p->next) || (j > i - 1)) {
return 0;
}
LinkList q = p->next;
p->next = q->next;
free(q);
return 1;
}
头插法创建单链表
void CreateList_H(LinkList &L, int n) {
L = (LinkList) malloc (sizeof(LNode));
L->next = NULL;
for(int i = 0; i < n; i++) {
LinkList p = (LinkList) malloc (sizeof(LNode));
cin >> p->data;
p->next = L->next;
L->next = p;
}
}
尾插法创建单链表
void CreateList_R(LinkList &L, int n) {
L = (LinkList) malloc (sizeof(LNode));
L->next = NULL;
LinkList r = L;
for(int i = 0; i < n; i++) {
LinkList p = (LinkList) malloc (sizeof(LNode));
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
三、双向链表
typedef int ElemType;
typedef struct DuLNode {
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
双向链表的插入
Status ListInsert_DuL(DuLinkList &L, int i, ElemType e) {
DuLinkList p;
if(!(p = GetElem_DuL(L, i))) return 0;
DuLinkList s = (DuLinkList) malloc (sizeof(DuLNode));
s->data = e;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return 1;
}
双向链表的删除
Status ListDelete_DuL(DuLinkList &L, int i) {
DuLinkList p;
if(!(p = GetElem(L, i))) return 0;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return 1;
}