链表初始化
链表的初始化是必要的。只有初始化后,稍后的插入、删除等操作才能使用。
- 头结点不存放数据
- 将头结点指针域置空
- 注意是头结点的指针域为nullptr,而不是整个头结点为nullptr
// 初始化链表
void Init(LinkedNode *&L){
L = (LinkedNode *) malloc(sizeof (LinkedNode));
L->next = nullptr;
}
链表插入
链表的插入,需要找到那个指针域为空的结点
void Insert(LinkedNode *&l, int x){
LinkedNode *p = l;
while (p->next != nullptr){
p = p->next;
}
LinkedNode *temp = (LinkedNode *) malloc(sizeof (LinkedNode));
temp->data = x;
temp->next = nullptr;
p->next = temp;
}
链表的遍历
遍历所以结点,注意头结点不算链表长度,因为头结点不存放数据。
void Traversal (LinkedNode *l){
LinkedNode *p = l->next;
while (p != nullptr){
printf("%d",p->data);
p = p->next;
}
}
销毁链表
- 链表回收需要回收头结点
- 要先保存下一个元素才能回收上一个元素
void Destroy(LinkedNode *&L){
LinkedNode *pre,*p;
pre = L; p = pre->next;
while (p!= nullptr){
free(pre);
pre = p->next;
p = p->next;
}
free(pre);
}
获取链表长度
- 头结点不算长度
// 求链表长度
void GetLength(LinkedNode *L){
LinkedNode *p = L->next;
int i = 0;
while (p != nullptr){
i++;
p = p->next;
}
printf("Length:%d",i);
}
获取链表的第n个元素
// 返回第n个元素 未找到返回0 n表示第几个元素而不是下标 ,e用于存储返回元素
int GetElem(LinkedNode *L, int n , int &e){
int j = 0;
if (n <= 0)return 0;
LinkedNode *p = L;
while (p != nullptr && j < n){
j++;
p = p->next;
}
if (p != nullptr){
e = p->data;
} else return 0;
}
与获取链表长度,首结点赋值的不同
如果你仔细观察代码就会发现,与获取链表长度方法相比,这里的首结点赋值不同。获取链表长度,是将首结点赋值为头结点的下一个结点,而这个方法是将头结点赋值为首结点(这样操作必须要考虑是否会发送获取头结点的错误)。如下图所示,获取长度是为了提前判定下一个结点是否为空;而获取第n个元素就需要使用如下图“第二种情况”这种方式了。
按值查找
// 按值查找 返回是链表的第几个元素
int Locate(LinkedNode *l, int x){
LinkedNode *p = l->next;
int i = 1;
while (p != nullptr && p->data != x){
i++;
p = p->next;
}
if (p == nullptr)return 0;
else return i;
}
插入运算
先找到需要插入的结点的前序结点
- 前序结点指针域赋值给插入结点
- 将前序结点的指针域指向插入结点
int InsElem(LinkedNode *L,int n, int x){
int i = 0;
LinkedNode *pre = L;
while (pre != nullptr && i<n-1){
i++;
pre = pre->next;
}
if (pre == nullptr)return 0;
else {
LinkedNode *temp = (LinkedNode *) malloc(sizeof (LinkedNode));
temp->data = x;
temp->next = pre->next;
pre->next = temp;
return 1;
}
}
删除运算
找到前序结点,并通过前序结点找到当前结点,将当前结点的指针域赋值给前序结点指针域。
//删除节点
int DelElem(LinkedNode *&L, int n){
LinkedNode *p = L;
int i = 0;
while (p != nullptr && i < n-1){
i++;
p = p->next;
}
if (p == nullptr)return 0;
else {
LinkedNode *q = p->next;
// 没有第n个节点
if (q == nullptr) return 0;
else {
p->next = q->next;
free(q);
return 1;
}
}
}