单链表基本操作
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
//等价于
/*struct LNode {
int data;
struct LNode* next;
};
typedef struct LNode LNode;
typedef struct LNode* LinkList;
*/
//******************************************************************************************
//无头结点
//初始化
void InitList(LinkList &L) {
L = NULL;
}
//判断是否为空链表
bool Empty(LinkList& L) {
return (L == NULL);
}
//按位序插入
bool InsertList(LinkList& L, int a, int e) {
if (a < 1) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
if (a == 1) {
s->next = L;
L = s;
return true;
}
LNode* p=L;
int j = 1;
while (p != NULL && j < a - 1) {
p = p->next;
j++;
}
if (p == NULL) return false;
s->next = p->next;
p->next = s;
return true;
}
//前插
bool PriInsertList(LNode* p, LNode* s) {
if (p == NULL || s == NULL) return false;
s->next = p->next;
p->next = s->next;
int temp = p->data;
p->data = s->data;
s->data = temp;
return true;
}
//*************************************************************************************************
//有头结点
//初始化
bool InitLsit(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) return false;
L->next = NULL;
return true;
}
//判断是否为空链表
bool IfEmpty(LinkList &L) {
return (L->next == NULL);
}
//按位序插入
bool ListInsert(LinkList &L, int a, int e) {
if (a < 1) return false;
LNode* p = L;
int j = 0;
while (L != NULL && j<a-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 Pri_InsertList(LNode *p, LNode *s) {
if (p == NULL || s == NULL) return false;
s->next = p->next;
p->next = s->next;
int temp = p->data;
p->data = s->data;
s->data = temp;
return true;
}
//按位删除
bool DeleteList(LinkList &L, int a, int &e) {
if (a < 1) return false;
LNode* p = L;
int j = 0;
while (p != NULL && j < a - 1) {
p = p->next;
j++;
}
if (p == NULL) return false;
if (p->next == NULL) return false;
LNode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
//指定节点的删除
bool DeleteList(LNode* p) {
if (p == NULL) return false;
LNode* q;
q = p->next;
p->data = q->data;
q->next = q->next;
free(q);
return true;
}
//按位查找节点
LNode* GetElem(LinkList& L, int a) {
if (a < 0) return NULL;
LNode* p = L;
int j = 0;
while (p != NULL && j < a) {
j++;
p = p->next;
}
return p;
}
//按值查找节点
LNode* Get_Elem(LinkList& L, int e) {
LNode* p = L->next;
while (p != NULL && p->data != e) p = p->next;
return p;
}
//单链表创建(尾插法)
LNode* LinkList_Tail_List(LinkList &L) {
LNode* p, * q;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
q = L;
int x;
cin >> x;
while (x != -1) {
p = (LNode*)malloc(sizeof(LNode));
p->data = x;
q->next = q;
q = p;
cin >> x;
}
return L;
}
//单链表创建(头插法)
LNode* LinkList_head_List(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
LNode* s;
int x;
cin >> x;
while (x != -1) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
头插法可实现链表的逆序
_____________________________________________________________________________
双链表基本操作
typedef struct DNode {
int data;
struct DNode* prior, * next;
}DNode,*DLinkList;
//初始化
bool InitList(DLinkList& L) {
L = (*DNode) malloc(sizeof(DNode));
if (L == NULL) return false;
L->next = NULL;
L->prior = NULL;
}
//后插
bool Next_Insert(DNode* p, DNode* s) {
if (p == NULL || s == NULL) return false;
s->next = p->next;
if(p->next!=NUL) p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
//后删
bool Next_Delete(DNode* p) {
if (p == NULL || p->next == NULL) return false;
DNode* q = p->next;
p->next = q->next;
if(q->next!=NULL) q->next->prior = p;
free(q);
return true;
}
//销毁链表
bool Destory_List(DLinkList &L) {
if (L == NULL) return false;
DNode* p = L;
while (p ->next!= NULL) {
Next_Delete(p);
}
free(L);
L = NULL;
return true;
}