单链表

本文详细介绍了单链表的构成、遍历、长度计算、查找、插入、删除及创建链表的基本方法。重点讲解了头节点数据区和指针区的区别,以及如何使用Node和Link简化操作。通过实例演示,帮助读者理解并实践链表操作技巧。
摘要由CSDN通过智能技术生成

1、基本组成

一个链表包含若干个结点,每一个结点由数据域和指针域组成
在这里插入图片描述

单链表的结点结构

typedef struct node
{
	DataType data;//数据域
	struct node *next;//指针域
}Node,*Link;

next指针域用来指向另一个相同结构的结点

使用Node,*Link,可以方便我们以后定义指针和结点

Node st;
//等价于struct node st;

Link p;
//等价于struct node *p;

要使p指向st结构体变量
p=&st;

之后再需要申请结点的时候就可以直接写

p=(Link)malloc(sizeof(Node));

//也可以直接写
p=(struct node*)malloc(sizeof(Node));

如果想访问结点的数据域和指针域

//数据域
p->data

//指针域
p->next

--------------------------------------------------------
有两种链表,一种是第一个节点数据部分为空。另一种是第一个节点就存放数据。
两种方式的编程是有点不同的:
第一种方式,不管怎样对链表进行增加修改和删除,head的位置都不会变化,head的值只需要传入到函数中,不需要返回。
第二种方式,如果数据插入到第一个节点,head存储的地址会发生变化。这种方式的链表在定义函数时,需要返回链表的head。
推荐使用第一种,本文也是用的是第一种

--------------------------------------------------------

2、链表的基本操作

(1)单链表的遍历

操作接口

void displayNode(Link head)

具体代码

void displayNode(Link head)
{
	p=head->next;
	while(p!NULL)
	{
		printf("%d",p->data);
		p=p->next;
	}
}

注意:这里不能使用p++
因为链表的存储是不连续的,p++会到指针的下一块内存,而不是链表的指针域所指向的内存

(2)求单链表元素个数

操作接口

int length(Link head);

具体代码

int length(Link head)
{
	p=head->next;
	count=0;
	while(p!=NULL)
	{
		p=p->next;
		count++;
	}
	return count;
} 

(3)单链表的查找

操作接口

int queryNode(Link head,DataType x)

x是准备查找的数据,应该和数据域对应的数据类型一致

具体代码

int queryNode(Link head,DataType x)
{
	p=head->next;
	count=0;
	while(p!=NULL)
	{
		if(p->data==x)
		{
			print(data);
			return true;
		}
		p=p->next;
	}
	return false;//如果循环结束了,说明没有找到 
}

(4)单链表的插入

不论插入的位置在表头、表中、表尾,代码全都适用

bool insertNode(Link head,int i,DataType x)
{
	p=head;
	count=0;
	while(p!=NULL&&count<i-1)
	{
		p=p->next;
		count++;
	}
	if(p==NULL)
	{
		return false;
	}
	else
	{
		node=(Link)malloc(sizeof(Node));
		node->data=x;
		node->next=p->next;//先和下一个结点相连 
		p->next=node;//再和上一个结点相连。原来中间的连接关系自动断开 
		return true;
	}
} 

(5)创建一个单链表—头插法

操作接口

Link newList(DataType a[],int n)

将待插入的结点插入到头结点的后面

最好每次创建一个结点,就马上把他的next域设置为NULL

具体代码

Link newList(DataType a[],int n)
{
	//创建头结点 
	head=(Link)malloc(sizeof(Node));
	head->next=NULL;
	//创建后续结点
	for(i=0;i<n;i++)
	{
		node=(Link)malloc(sizeof(Node));
		node->data=a[i];
		node->next=head->next;
		head->next=node;
	} 
	return head;
}

(6)创建一个单链表—尾插法

操作接口

Link newList(DataType a[],int n)

具体代码

Link newList(DataType a[],int n)
{
	head=(Link)malloc(sizeof(Node));
	head->next=NULL;
	rear=head;
	for(i=0;i<n;i++)
	{
		node=(Link)malloc(sizeof(Node));
		node->data=a[i];
		//node->next=NULL;
		near->next=node;
		rear=node;
	}
	rear->next=NULL;//这个语句很容易被忽略,或者在前面加一句node->next=NULL
	return head;
}

(7)单链表结点的删除

操作接口

bool deleteNode(Link head,Datatype x)

具体代码

bool deleteNode(Link head,Datatype x)
{
	///判断是否是空表
	if(head==NULL||head->next==NULL)
	{
		return false;
	} 
	p=head->next;
	q=head;
	while(p!=NULL)
	{
		if(p->data==x)
		{
			q->next=p->next;
			free(p);
			return false;
		}
		else
		{
			q=p;
			p=p->next;
		}
	}
	//如果循环结束了,说明没有找到与x相等的数据
	return false; 
}

(8)单链表的释放

操作接口

void clearLink(Link head)

具体代码

void clearLink(Link head)
{
	while(head->next!=NULL)
	{
		q=head;
		head=head->next;
		free(p);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值