数据结构---单链表的增删改查(C语言实现)
数据结构---单链表的增删改查(C语言实现)适合小白学习和复习链表操作的人观看!
·
- 链表的创建
- 链表元素插入(头插,尾插,指定位置插入)
- 链表元素的删除
- 链表元素的查看
1.链表的创建(有头链表)
有头链表的创建就是创建一个头结点代表此链表,用一个结构体指针指向头结点,通常称为头指针,方便找到此链表。
- 头结点的数据域一般不做处理(不存放数据)
- 代码如下
Node* createList() { Node* headNode = calloc(1, sizeof(Node)); //动态内存分配,为头结点分配内存 if (!headNode) return; //判断内存是否申请成功 else { headNode->next = NULL; //对头结点的指针域做处理,数据域不做处理 } Node* pList = headNode; //创建头指针指向头结点 return headNode; //返回一个头结点,方便创建链表的时候直接调用该函数 }
2.链表元素的插入
- 头插法
- 尾插法
- 指定位置插入法
**头插法
先上代码
//头插法
void InsertByHead(Node* headNode,DATA* pval) //pval是你要插入的数据,头插头插肯定是要插入数据的
{
//只有头结点的情况下
if (headNode->next == NULL) //说明此链表只有头结点
{
Node* newNode = calloc(1, sizeof(Node)); //动态分配一个新节点
if (newNode != NULL) //如果内存申请成功的话执行以下操作
{
newNode->data = pval; //把需要插入的元素pval放在newNode里面
headNode->next = newNode; //让头结点指向 newNode,此时链表有两个节点一个是头结点(数据域没有存放数据),另一个是newNode.
}
}
//不是只有头结点
else if (headNode->next != NULL)
{
Node* newNode = calloc(1, sizeof(Node)); //动态分配一个新节点
if (newNode)
{
newNode->data = pval; //把需要插入的元素pval放在newNode里面
newNode->next = headNode->next; //新节点指向头结点的后面
headNode->next = newNode; //头结点指向新节点连接起来
}
}
}
头插法的图解
**尾插法
尾插法就比较简单了,只要找到尾节点(指针域为NULL),直接让尾节点的指针指向新节点就行
代码如下
//尾插法
void InsertByTail(Node* headNode, DATA* pval)
{
Node* pMove = headNode->next; //创建一个移动的指针
while (pMove) //判断指针的指向不为Null时,pMove一直往下走
{
pMove = pMove->next;
}
//退出while循环时此时pmoVe就是尾节点
Node* newNode = calloc(1, sizeof(Node)); //创建新节点
newNode->data = pval; //数据赋值
pMove->next = newNode; //原来的尾节点指向newNode ,结束后newNode即为此链表的尾节点
}
尾插法图解
**指定位置插入
指定位置插入是头插和尾插的结合版 代码很好理解。
//指定位置插入
void InsertByPos(Node* headNode, DATA* pval, DATA val) //pval是要插入的元素,val是指定位置的数据
{
Node* pMove = headNode->next; //创建一个移动的指针
while (pMove->next->data != val ) //判断pMove的next的数据域不等于val时,pMove一直往下走
{
pMove = pMove->next;
}
//把链表遍历了一遍也没有找到指定的位置
if (pMove->next == NULL)
{
puts("你要指定的位置没有找到");
}
//此时pMove就是指定节点的前一个节点
Node* newNode = headNode->next; //创建一个新节点
//以下三行代码和头插法类似
newNode->data = pval;
newNode->next = pMove->next;
pMove->next = newNode;
}
**链表元素的删除
删除的话很好理解 主要是找到要删除的元素的节点在哪就可以了,和指定位置删除的过程相似
代码如下
/删除
void Dele(Node* headNode, DATA val)
{
Node* pMove = headNode->next; //创建一个移动的指针
while (pMove->next->data != val) //判断指针的下一个节点的数据不等于val,pMove一直往下走
{
pMove = pMove->next;
}
//把链表遍历了一遍也没有找到指定的位置
if (pMove->next == NULL)
{
puts("你要删除的位置没有找到");
}
//此时 pMove为要删除的节点的前一个节点
Node* newNode = pMove->next; //找一个newNode指向pMove(需要删除的节点)
pMove = newNode->next; //pMove指向删除节点的下一个节点 确保链表不断开
free(newNode); //释放掉需要删除的节点
}
删除节点的图解
**链表元素的查看
就是遍历一遍链表,输出每个节点的内存即可
代码如下
//打印链表
void PrintList(Node* headNode)
{
Node* pMove = headNode->next;
while (pMove != NULL)
{
printf("%d ", pMove->data);
pMove = pMove->next;
}
}
链表元素的修改,看了以上链表操作,元素的修改不是什么大事了。
感谢观看。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)