按位序删除(带头结点)
#define NULL 0
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * LinkList;
//按位序删除(带头结点)
bool ListInsert(LinkList& L, int i, int& e) {
if (i < 1)
return false;
LNode* p = L; //指针p指向当前扫描结点,目前指向头结点,是第0个
int j = 0; //当前p指向第几个结点
while (p != NULL && j < i - 1) //循环指到第i-1个结点
{
p = p->next;
j++;
}
if (p == NULL) //i值不合法
return false;
if (p->next == NULL) //第i-1结点之后已无其他结点
return false;
LNode* q = p->next; //令q指向即将删除结点
e = q->data; //用e返回元素的值
p->next = q->next; //将*q结点从链中断开
free(q); //释放结点的存储空间
return true;
}
指定结点的删除
//删除指定结点p
bool DeleteNode(LNode* p) {
if (p == NULL)
return false;
LNode* q = p->next; //令q指向*p的后继结点
p->data = p->next->data; //和后继结点交换数据
p->next = q->next; //将*q结点从链中断开
free(q); //释放后继结点的存储空间
return true;
}
如果要删除的结点p是最后一个元素,代码不适用会报错