线性表中的单向链表的简单操做

单向链表是链表中的一种,其特色是链表的连接方向是单向的,对链表的访问要经过从头部开始,依序往下读取。固然,日后对数据结构的深刻学习,还会涉及到双向链表、循环链表等线性表,我在这里就再也不解释了。数据结构

链表主要是由结点一个个相继串起来的,其中每个结点又被分为两个部分:(data)数据域、(next)指针域。学习

  • 数据域(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.

相关文章
相关标签/搜索