本博文介绍单链表,及其C语言的实现
单链表
单链表是一种链式存取的数据结构,由每个结点单元连接而成。
每个结点单元由两部分组成:数据域和指针域,其中数据域用来存储数据,指针域用来存储下一节点的地址。
因此,每个结点的结构体可以表示为:
struct node
{
数据域;
struct node *next;//指针域
}
单链表的示意图如下:
单链表操作
插入
头结点插入
- 头结点为空
- 只需将现有结点作为头结点
- 头结点的
next
指针指向NULL
head=ptr;
ptr->next=NULL;
- 头结点不为空
- 使新结点的链接部分指向现有的头结点
- 将新结点作为头结点
示意图如下:
操作如下:
ptr->next=head;
head=ptr;
尾结点插入
- 尾结点为空的情况和头结点为空的情况一致
- 尾结点不为空
- 应先通过
temp=temp->next
先移动到最尾结点 - 使尾结点指向新结点
- 新插入结点的
next
指向NULL
示意图如下:
操作如下:
temp->next=ptr;
ptr->next=NULL;
指定位置插入
- 应先通过
temp=temp->next
先移动到指定位置 - 使新结点
ptr
的next
指向temp
的下一部分地址 temp
的next
指向新结点ptr
即可
示意图如下:
操作如下:
ptr->next=temp->next;
temp->next=ptr;
删除
头结点删除
- 将头结点指向下一结点
- 释放原来的头结点
示意图如下:
操作如下:
ptr=head;
head=head->next;
free(ptr);
尾结点删除
- 只有一个结点
直接释放该结点:
ptr=head;
head=NULL;
free(ptr);
- 有多个结点
- 由于是单链表,因此一个指针要想删除尾结点是不可行的,因此还应使用另外一个指针指到倒数第2个指针上(用于修改
next
的指向) - 使用
ptr=ptr->next
移动到最后一个位置 - 使倒数第二个指针的
next
为NULL
- 释放倒数第1个指针(
ptr
)
示意图如下:
操作如下:
ptr=head;
while(ptr->next!=NULL){
p=ptr;
ptr=ptr->next;
}
p->next=NULL;
free(ptr);
指定位置删除
- 由于为单链表,若指定位置为的结点为
ptr
,想删除ptr
的话必须得对ptr
上一位置进行操作,因此使用两个指针:p
和ptr
- 通过
ptr=ptr->next
移动到指定位置 - 使指定位置的上一位置的指针p指向指定位置的下一位置
- 释放指定位置指针
ptr
示意图如下:
操作如下:
移动指定步{
p=ptr;
ptr=ptr->next;
}
p->next=ptr->next;
free(ptr);
遍历
给定头结点,挨个遍历就行:
ptr = head;
while (ptr!=NULL){
ptr = ptr -> next;
}
查找
遍历的时候只需要与给定数据进行比对即可完成查找:
ptr = head;
while (ptr!=NULL){
if(ptr->data==data){
找到了
}
ptr = ptr -> next;
}
单链表C语言的实现
以上所有描述的操作均使用C语言进行了实现,具体代码见Github
代码的实现效果如下:
才疏学浅,难免有错误和不当之处,欢迎交流批评指正!
同时有问题的话欢迎留言或邮箱联系(ljt_IT@163.com)。