注意!函数内部传参二级指针易错点,不能一级指针*pphead
个人理解:pphead存放该二级指针的地址,*pphead一层解引用可改变它的指向,**pphead二层解引用获取一级指针指向的具体内容。
void LinkListPrint(Link* phead) {//打印链表
Link* cur = phead;
while (cur != NULL) {
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
Link* BuyNewNode(LinkDataType x) {//创建新节点
Link* newnode = (Link*)malloc(sizeof(Link));
if (newnode == NULL) {
perror("申请内存失败!\n");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
void LinkListPushBack(Link** pphead, LinkDataType x) {//尾插
Link* newnode = BuyNewNode(x);
if (*pphead == NULL) {
*pphead = newnode;
}
else {
Link* tail = *pphead;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = newnode;
}
}
void LinkListPushFront(Link** pphead, LinkDataType x) {//头插
Link* newnode = BuyNewNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
void LinkListPopBack(Link** pphead) {//尾删
assert(*pphead);
if ((*pphead)->next == NULL) {
free(*pphead);
*pphead = NULL;
}
else {
Link* Prev = *pphead;
while (Prev->next->next != NULL) {
Prev = Prev->next;
}
free(Prev->next);
Prev->next = NULL;
}
}
void LinkListPopFront(Link** pphead) {//头删
assert(*pphead);
Link* del = *pphead;
*pphead = del->next;
free(del);
del = NULL;
}
Link* LinkListFind(Link* phead, LinkDataType x) {查找指定节点并返回节点地址
Link* cur = phead;
while (cur != NULL) {
if (cur->data == x)
return cur;
cur = cur->next;
}
return NULL;
}
void LinkListInsert_Before(Link** pphead, Link* pos, LinkDataType x) {//任意指定节点前插入
assert(pos);
Link* newnode = BuyNewNode(x);
if (*pphead == pos) {
newnode->next = *pphead;
*pphead = newnode;
}
else {
Link* Prev = *pphead;
while (Prev->next != pos) {
Prev = Prev->next;
}
Prev->next = newnode;
newnode->next = pos;
}
}
void LinkListErase_Before(Link** pphead, Link* pos) {//任意指定节点前删除
assert(pos && *pphead);
if (*pphead == pos) {
LinkListPopFront(pphead);
//函数内部传参二级指针易错点,这里不能传*pphead
//理解:pphead存放该二级指针的地址,*pphead一层解引用可改变它的指向,**pphead二层解引用获取一级指针指向的具体内容
}
else{
Link* Prev = *pphead;
while (Prev->next != pos) {
Prev = Prev->next;
}
Prev->next = pos->next;
free(pos);
pos = NULL;
}
}