### 线性表(逻辑结构) ---> 链式存储(存储结构)
#include<bits/stdc++.h>
using namespace std;
// 单链表(不带头节点)
typedef struct LNode{
int e;
struct LNode *next;
}LNode,*LinkList;
// 单链表初始化(传入单链表起始位置)
bool InitLNode(LinkList &L){
L = NULL; // 空表,暂时没有任何节点
return true;
}
// 判断单链表是否为空
bool isEmpty(LinkList &L){
if(L == NULL) return true;
return false;
}
#include<bits/stdc++.h>
using namespace std;
// 单链表(带头节点)
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
// 单链表初始化
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); // 分配一个头节点
if(L == NULL) return false; // 如果内存不足,则分配失败
L->next = NULL; // 头节点后暂时无节点
return true;
}
// 单链表按位序插入操作(在第k位置插入元素e)
bool ListInsert(LinkList &L,int k,int e){
if(k < 1) return false;
// 先找到第k-1个元素所在地址
LNode *p = L;
int j = 0;
while(p != NULL && j < k-1){
p = p->next;
j++;
}
if(p == NULL) return false;
LNode * q = (LNode *) malloc(sizeof(LNode));
q->next = p->next;
q->data = e;
p->next = q;
return true;
}
// 单链表按位序删除操作(删除第k位置的节点)
int e = -1;
bool ListDelete(LinkList &L,int k,int &e){
// 找到第k-1位置的节点
LNode *p = L;
int j = 0;
while(p != NULL && j < k - 1){
p = p->next;
j++;
}
if(p == NULL || p->next == NULL) return false;
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
// 指定节点的后插操作
bool InsertNextNode(LNode *p, int e){
if(p == NULL) return false;
LNode *s = (LNode *) malloc(sizeof(LNode));
if(s == NULL) return false; // 如果内存不足则分配失败
s->next = p->next;
s->data = e;
p->next = s;
return true;
}
// 指定节点的前插操作(复制操作)
bool InsertFrontNode(LNode *p,int e){
if(p == NULL) return false;
LNode *s = (LNode *) malloc(sizeof(LNode));
if(s == NULL) return false; // 内存不足则分配失败
s->data = p->data;
s->next = p->next;
p->next = s;
p->data = e;
return true;
}