单向链表是链表中的一种,其特色是链表的连接方向是单向的,对链表的访问要经过从头部开始,依序往下读取。固然,日后对数据结构的深刻学习,还会涉及到双向链表、循环链表等线性表,我在这里就再也不解释了。数据结构
链表主要是由结点一个个相继串起来的,其中每个结点又被分为两个部分:(data)数据域、(next)指针域。学习
单向链表的形式:ui
那么,既然咱们知道了单链表的元素是什么样了,以及单链表的形式是如何了,咱们就能够开始动手实现简单的增、删、查、改。spa
首先,要学会链表的建立,建立无非也就是增长:3d
须要说明的是,为了不二重指针的操做,便于各位的理解,我这里用的是头结点来保存指向第一个结点的地址,也就是我舍去了头结点的数据域,以它的next指向一个新的结点,如上图的单向链表的形式指针
//两个参数 一个是头结点,一个是 要插入的结点
//头结点:它的next指向的才是一个新的结点开始
void addNode(listNode * head, listNode * q) {
listNode * p = head->next;
if (head->next == NULL)
{
head->next = q;
}
else
{
while (p->next != NULL)
{
p = p->next;
}
p->next = q;
}
}
复制代码
链表的删除:这里的删除,指的是删除其中的某个结点,既然要删除某个结点,那么即是要遍历出符合给定条件的就把它删除。code
void deleteNode(listNode * head, int data) {
listNode * p = head->next, *q = head;
//若是是空的 能够返回一个提醒也能够不处理
while (p)
{
if (p->data == data)
{
q->next = p->next;
free(p);
break;
}
q = p;
p = p->next;
}
}
复制代码
查、改的操做在这里我就不细说了,由于,这个实现起来就是一个循环,而后再判断每个数据域是否与你要查找的一致...cdn
最后,我以一个总体的程序结束这篇博客:blog
#include <stdio.h>
#include <stdlib.h>
struct listNode {
int data;
struct listNode * next;
};
typedef struct listNode listNode;
void addNode(listNode * head, listNode * q);
void deleteNode(listNode * head, int data);
int main() {
listNode head,*q,*p;
head.next = NULL;
int i;
//链表的建立
for (i = 1; i < 6; i++)
{
q = (listNode *)malloc(sizeof(listNode));
if (!q) exit(0);
q->data = i;
q->next = NULL;
addNode(&head, q);
}
p = head.next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
deleteNode(&head, 2); //删除数据域为 2 的结点
p = head.next;
//遍历输出
while (p)
{
printf("%d ", p->data);
p = p->next;
}
//释放整个链表的内存空间
p = head.next;
q = &head;
while (p)
{
q->next = p->next;
free(p);
p = q->next;
}
return 0;
}
//两个参数 一个是头结点,一个是 要插入的结点
//头结点:它的next指向的才是一个新的结点开始
void addNode(listNode * head, listNode * q) {
listNode * p = head->next;
if (head->next == NULL)
{
head->next = q;
}
else
{
while (p->next != NULL)
{
p = p->next;
}
p->next = q;
}
}
void deleteNode(listNode * head, int data) {
listNode * p = head->next, *q = head;
//若是是空的 能够返回一个提醒也能够不处理
while (p)
{
if (p->data == data)
{
q->next = p->next;
free(p);
break;
}
q = p;
p = p->next;
}
}
复制代码
运行结果:内存
若是您喜欢的话,记得点个赞哇!!!Thanks.