1、前言
数组和结构体作为编程常用的数据结构,在使用的时候最大的缺陷就需要一块连续的内存空间,并且声明的时候还需要指定好长度,指定多了浪费,指定少了又怕后面不够。所以,链表它来了!
2、结构介绍
单向链表通常由两部分组成,一部分是链表需要存储的数据,另一部分则是一个指针,该指针的作用是指向下一个节点,详细的结构如图所示:
单个链表节点的数据结构与结构体一样,不过链表中指向下个节点的指针是必不可少的,一个简单的链表节点数据结构如下:
struct SingleList
{
int data;
struct SingleList *next;
};
3、使用讲解
3.1 创建链表
创建链表就是创建链表的头结点,有了头结点之后就可以使用指针进行节点的添加和删除了,创建头结点的代码操作就是定义一个链表指针,然后malloc内存分配给该节点就可以了:
SingleList * CreatList()
{
SingleList *pHead;
pHead = (SingleList *)malloc(sizeof(SingleList));
if (pHead == NULL)
{
return NULL;
}
else
{
pHead->next = NULL;
}
return pHead;
}
3.2 节点添加
链表的节点可以在任意位置进行添加,可以选择将新加的节点添加到头部、尾部或者中间位置,进行头部插入节点时的数据结构变化如图所示:
在头部进行节点插入的代码示例如下:
int InsertList(SingleList *pHead,int data)
{
SingleList *Next,*pList;
pList = (SingleList *)malloc(sizeof(SingleList));
if (pList == NULL)
{
return -1;
}
else
{
Next = pHead->next;
pHead->next = pList;
pList->next = Next;
}
pList->data = data;
return 0;
}
在中间位置进行节点插入后数据结构变化如图所示:
在中间位置可以指定第几个节点进行插入,也可以其它的方式,本文示例指定节点data值为Indata的节点后面进行插入:
int MidInsertList(SingleList *pHead,int Indata,int data)
{
SingleList *Now,*Next,*pList;
Now = pHead->next;
while(Now != NULL)
{
if(Now->data == Indata)
{
pList = (SingleList *)malloc(sizeof(SingleList));
if (pList == NULL)
{
return -1;
}
else
{
Next = Now->next;
Now->next = pList;
pList->next = Next;
pList->data = data;
}
return 0;
}
Now = Now->next;
}
return -1;
}
在尾部位置进行节点插入后数据结构变化如图所示,尾部插入的代码可以自行添加,不再多占篇幅。
3.3 节点删除
相对应节点添加,节点删除也可以从链表的任意位置进行删除,本文示例删除指定data值的节点,节点删除的本质是释放malloc申请的空间,节点2删除后链表结构变化如图所示:
相应代码如下:
int DelList(SingleList *pHead,int Indata)
{
SingleList *Now,*Last;
Last = pHead;
Now = pHead->next;
while(Now != NULL)
{
if(Now->data == Indata)
{
Next = Now->next;
// 释放当前节点
free(Last->next);
// 指向下一节点
Last->next = Next;
return 0;
}
Last = Now;
Now = Now->next;
}
return -1;
}
3.4 节点遍历
节点遍历的本质就是从头结点开始往后找,一直找到NULL为止结束,遍历节点并打印出data值的代码如下:
void DisplayList(SingleList *pHead)
{
SingleList *Now;
Now = pHead->next;
printf("展示节点 Data:\n");
while(Now != NULL)
{
printf("%d\n",Now->data);
Now = Now->next;
}
printf("\n");
}
4、简单测试
将上述代码和下面代码置于同一个.c文件中就可以测试了,测试代码如下:
#include <stdio.h>
#include<stdlib.h>
int main()
{
SingleList *pHead;
// 创建链表
pHead = CreatList();
// 使用头部插入方式插入节点,data值分别为1-2-3-4-5-6
InsertList(pHead,1);
InsertList(pHead,2);
InsertList(pHead,3);
InsertList(pHead,4);
InsertList(pHead,5);
InsertList(pHead,6);
// 在data为2的节点后面插入data为100的节点
MidInsertList(pHead,2,100);
// 遍历节点data值
DisplayList(pHead);
// 删除data值为5的节点
DelList(pHead,5);
// 遍历节点data值
DisplayList(pHead);
// 销毁节点
DestoryList(pHead);
return 0;
}
测试结果如下:
完结!有帮助的话记得点赞呀~
原文地址:https://blog.csdn.net/cesheng3410/article/details/128329619
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。