单链表的定义:
单链表(Singly Linked List)是一种常见的数据结构,它由一系列节点构成,每个节点包括一个数据元素和一个指向下一个节点的指针。单链表中只能从头节点开始顺序遍历,每个节点只有一个指向下一个节点的指针,没有指向前驱节点的指针,因此不能倒序遍历。
优点和缺点:
单链表在插入和删除操作时具有较高的效率,因为只需要修改相邻节点的指针即可完成操作。但是在查询、访问和定位操作中,由于需要遍历整个链表才能找到指定节点,效率相对较低。
单链表的优点在于可以灵活地动态分配内存空间,可以根据实际需要不断地插入和删除节点。常见的应用场景包括实现队列、堆栈、哈希表等数据结构,以及处理大量数据时的缓存数据结构。
单链表的实现:
直接看代码
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int value;//储存的数据
struct node *next;//指向下一个节点
} Node;//定义单链表的节点
typedef struct list{
Node* head;
} List;//记录头节点
int main()
{
List list;
list.head=NULL;//定义头节点,让其进行初始化。
}
由此我们就可以得到一个单链表的头,在此基础上我们可以进行其他操作。
1、单链表的增添和删除
首先增添我们要先学会创建一个新节点,将我们要传入的数据输入进去,再将链表链接起来。
而链接有头接和尾接。
以尾接法为例
#include <stdio.h>
#include <stdlib.h>
void add(List* plist,int number);//增添链表
int main()
{
List list;
list.head=NULL;
int number;定义一个变量
do {
scanf("%d",&number);输入数据
if(number!=-1)//输入-1后停止
{
add(&list,number);
}
void add(List* plist,int number)
{
Node *p=(Node*)malloc(sizeof(Node));//创建一个新节点
p->value=number;
p->next=NULL;//初始化
Node *last=plist->head;
if(last)//判断是否头节点后是否有其他节点,保证安全。
{
while(last->next)//找到最后一个节点链接
{
last=last->next;
}
last->next=p;
}else
{
plist->head=p;
}
}
头接则是只需要在头节点后直接链接即可,但要注意接上之前已经创建的节点。
其次是删除,删除需要找到要删除的节点,可以是第几个,也可以是某组数据。
以删除某数据为例
int n;//定义一个变量
scanf("%d",&n);//输入要删除的数据
Node *q;
Node *p;
for(q=NULL,p=list.head;p;q=p,p=p->next)//删除链表
{
if(p->value==n)//查找所要删除的数据,并将删除后的前后两段链接起来。
{
if(q)
{
q->next=p->next;
}else
{
list.head=p->next;
}
free(p);//删除
break;
}
}
注:上述代码一次只能删除一个链表节点。
2、单链表的打印
打印需要遍历整个链表,将每一个所对应的数据打印出来。
void print(List* plist)
{
Node *p;
for(Node *p=plist->head;p;p=p->next)//遍历链表
{
printf("%d ",p->value);
}
printf("\n");
}
3、单链表的查找
查找需要在整个链表中寻找,这里以直接遍历为例,来寻找是否存在某组数据。
int chazhao(List* plist,int n)//返回一个int类型的值来判断是否找到。n为寻找的数据。
{
Node *p;
int i=1;
for(Node *p=plist->head;p;p->next)
{
if(p->value==n)
{
return i;//找到
}
i++;
}
return 0;//没找到
}
4、链表的修改
链表的修改是在查找的基础上进行的,只需要将修改后的值传入链表对应位置即可。
void xiugai(List *plist,int n,int m)//n为链表的位置,m为修改后的值
{
Node *p=plist->head;
for(int i=0;i<n;i++)//遍历寻找要修改的节点
{
p=p->next;
}
p->value=m;//修改其数据
}
以上是我对在单链表的学习上的一些认识,其中有不足的地方,代码都是初学的时候自己写的,没有进行优化。