LinkList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode;
void LinkListPrint(LNode* phead);
// 尾插
void LinkListPushBack(LNode** phead,ElemType x);
// 头插
void LinkListPushFront(LNode** phead, ElemType x);
// 尾删
void LinkListPopBack(LNode** phead);
// 头删
void LinkListPopFront(LNode** phead);
// 查找
LNode* LinkListFind(LNode* pphead, ElemType x);
// 在pos的前面插入x
void LinkListInsert(LNode** phead, LNode* pos, ElemType x);
// 删除pos位置的值
void LinkListErase(LNode** phead,LNode* pos);
有些地方
下标i的位置插入x
//void LinkListInsert(LNode** phead, int i, ElemType x);
删除下标i位置的值
//void LinkListErase(LNode** phead, int i);
LinkList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "LinkList.h"
void LinkListPrint(LNode* phead)
{
LNode* cur = phead;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULLn");
}
// 尾插
void LinkListPushBack(LNode** pphead, ElemType x)
{
// 申请一个要插入的节点(申请节点,实际开发注意事项)
LNode* newNode = (LNode*)malloc(sizeof(LNode));
if (newNode == NULL)// 申请节点失败,(VS报错:取消对 NULL 指针“newNode”的引用)
{
printf("%s", strerror(errno));// 将错误码转换成错误信息
}
else
{
newNode->data = x;
newNode->next = NULL;
}
if (*pphead == NULL)// phead为空,直接把新节点赋给phead,
{
*pphead = newNode;
}
else// 至少有一个或多个,找到尾节点,链接新节点
{
// 找尾节点
LNode* tail = *pphead;//
while (tail->next != NULL)
{
tail = tail->next;
}
// 尾节点,链接新节点
tail->next = newNode;
}
}
// 头插
void LinkListPushFront(LNode** pphead, ElemType x)
{
// 申请一个到插入的节点
LNode* newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = x;
newNode->next = NULL;
// 将该节点指向头节点,第一个节点为空也不影响
newNode->next = *pphead;
*pphead = newNode;// 将新节点作为头节点
}
// 尾删
void LinkListPopBack(LNode** pphead)
{
// 为空,没有节点
// 只有一个节点,先释放再置为空,避免野指针
// 有多个节点,找尾节点并创建一个节点找尾节点的前一个节点
if (*pphead == NULL)
return;
else if ((*pphead)->next == NULL)// *的优先级比较低
{
free(*pphead);
*pphead = NULL;
}
else
{
LNode* prev = NULL;
LNode* tail = *pphead;
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);
prev->next = NULL;
}
}
// 头删
void LinkListPopFront(LNode** pphead)
{
// 头删确保不为空,否则越界
//assert(*pphead);
if (*pphead == NULL)
return;
LNode* next = (*pphead)->next;// 申请一个节点指向头节点的下一个节点
free(*pphead);// 释放头节点
*pphead = next;
}
// 查找pos节点的位置
LNode* LinkListFind(LNode* pphead, ElemType x)
{
LNode* cur = pphead;
while (cur != NULL)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
// 在pos的前面插入x
void LinkListInsert(LNode** pphead, LNode* pos, ElemType x)
{
// 如果pos是第一个位置,在第一个位置前面插入x(头插)
// 否则找到pos的前一个节点
if (pos == *pphead)
{
LinkListPushFront(pphead, x);
}
else
{
LNode* newNode = (LNode*)malloc(sizeof(LNode));// 申请一个要插入的节点
newNode->data = x;
newNode->next = NULL;
LNode* prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = newNode;
newNode->next = pos;
}
}
// 删除pos位置的值
void LinkListErase(LNode** pphead, LNode* pos)
{
// pos在第一个节点(头删)
if (pos == *pphead)
{
LinkListPopFront(pphead);
}
else
{
LNode* prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "LinkList.h"
// 二级指针存放(取出)的是一级指针的地址
void LinkListTest1()
{
LNode* plist = NULL;// 结构体类型的指针,头指针
LinkListPushBack(&plist, 1);
LinkListPushBack(&plist, 2);
LinkListPushBack(&plist, 3);
LinkListPushBack(&plist, 4);
LinkListPushFront(&plist, 0);// 要想改变一级指针应该传一级指针的地址,对一级指针解引用
LinkListPrint(plist);
LinkListPopFront(&plist);
LinkListPopFront(&plist);
LinkListPopFront(&plist);
LinkListPopFront(&plist);
LinkListPrint(plist);
LinkListPopFront(&plist);
LinkListPrint(plist);
//LinkListPopFront(&plist);
}
void LinkListTest2()
{
LNode* plist = NULL;// 结构体类型的指针,头指针
LinkListPushBack(&plist, 1);
LinkListPushBack(&plist, 2);
LinkListPushBack(&plist, 3);
LinkListPushBack(&plist, 4);
LinkListPushFront(&plist, 0);// 要想改变一级指针应该传一级指针的地址,对一级指针解引用
LinkListPrint(plist);
LinkListPopBack(&plist);
LinkListPopBack(&plist);
LinkListPrint(plist);
LinkListPopBack(&plist);
LinkListPopBack(&plist);
LinkListPrint(plist);
}
void LinkListTest3()
{
LNode* plist = NULL;// 结构体类型的指针,头指针
LinkListPushBack(&plist, 1);
LinkListPushBack(&plist, 2);
LinkListPushBack(&plist, 3);
LinkListPushBack(&plist, 4);
LinkListPushFront(&plist, 0);// 要想改变一级指针应该传一级指针的地址,对一级指针解引用
LinkListPrint(plist);
// 找到1,在1的前面插入30
LNode* pos = LinkListFind(plist, 0);
if (pos)
{
LinkListInsert(&plist, pos, 30);
}
LinkListPrint(plist);
}
void LinkListTest4()
{
LNode* plist = NULL;// 结构体类型的指针,头指针
LinkListPushBack(&plist, 1);
LinkListPushBack(&plist, 2);
LinkListPushBack(&plist, 3);
LinkListPushBack(&plist, 4);
LinkListPushFront(&plist, 0);// 要想改变一级指针应该传一级指针的地址,对一级指针解引用
LinkListPrint(plist);
LNode* pos = LinkListFind(plist, 0);
if (pos)
{
LinkListErase(&plist, pos);
}
pos = LinkListFind(plist, 4);
if (pos)
{
LinkListErase(&plist, pos);
}
//pos = LinkListFind(plist, 3);
//if (pos)
//{
// LinkListErase(&plist, pos);
//}
pos = LinkListFind(plist, 2);
if (pos)
{
LinkListErase(&plist, pos);
}
//pos = LinkListFind(plist, 1);
//if (pos)
//{
// LinkListErase(&plist, pos);
//}
LinkListPrint(plist);
}
int main()
{
//LinkListTest1();
//LinkListTest2();
LinkListTest4();
return 0;
}
原文地址:https://blog.csdn.net/Virgo_616/article/details/134744771
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_46770.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。