// 定义一个单链表
struct LNode
{
ElemType data;
struct LNode *next;
}
struct LNode *p = (struct LNode *)maclloc(sizeof(struct LNode));
typedef struct LNode LNode;
LNode *p = (LNode *)malloc(sizeof(LNode));
bool InitList(LinkList &L) // 带头结点的单链表初始化
{
L = (LNode *)malloc(sizeof(LNode)); // 创建头结点
L->next = null; // 头结点之后暂没有元素结点
return true;
}
bool InitList(LinkList &L) // 不带头结点的单链表初始化
{
L = NULL;
return true;
}
// 计算单链表中数据结点的个数
int Length(LinkList L)
{
int len = 0;
LNode *p = L;
while (p->next != NULL)
{
p = p->next;
len++;
}
return len;
}
// 按序号查找结点
LNode *GetElem(LinkList L, int i)
{
LNode *p = L;
int j = 0; // 记录当前结点的位序,头结点为第0个结点
while (p != NULL && j < i) // 循环找到第i个结点
{
p = p->next;
j++;
}
return p; // 返回第i个结点,或 NULL
}
// 按值查找结点
LNode *LocateElem(LinkList L, ElemType e)
{
LNode *p = L->next;
while (p != = NULL &&p->data != = e) // 从第一个结点开始查找数据域为e的结点
{
p = p->next;
}
return p; // 找到后返回该结点的指针,否则返回 NULL
}
// 插入结点
/**
* 将值为x 的新结点插入到单链表的第i个位置。
* 先检查插入位置的合法性
* 然后找到待插入位置的前驱,即第i-1个结点
*/
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) // i值不合法
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
// 删除结点
/**
* 删除结点操作
* 将单链表的第i个结点删除
* 先检查删除位置的合法性
* 查找表中第i-1个结点,即被删除结点的前驱
* 再删除第i个结点
*/
bool ListDelete(LinkList &L, int i, ElemType &e)
{
LNode *p = L;
int j = 0; // 记录当前结点的位序
while (p != NULL && j < i - 1) // 循环找到第i-1个结点
{
p = p->next;
j++;
}
if (p == NULL || p->next == NULL) // i值不合法
return false;
LNode *q = p->next; // 令q指向被删除结点
e = q->data; // 用e返回删除元素的值
p->next = q->next; // 将*q结点从链中断开
free(q); // 释放被删除的结点的存储空间
return true;
}