单链表基本操作

链表

1、链表原理

链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不必须相邻,只需给每个元素附加一个指针域,指向下一个元素的存储位

置,每个结点包含两个域:数据域和指针域,指针域存储下一个结点的地址,因此指针指向的类型也是结点类型。

2、链表的核心要素

1、每个节点由数据域和指针域组成

2、 指针域指向下一个节点的内存地址

3、结构体定义

Typedef struct LinkNode{
	ElemType data;
	struct LinkNode *next;
}LinkList, LinkNode;

4、单链表概念

链表的节点均单向指向下一个节点,形成一条单向访问的数据链
在这里插入图片描述

1、单链表初始化

typedef struct _LinkNode {
	int data; //结点的数据域
	struct _LinkNode *next; //结点的指针域
}LinkNode, LinkList; //链表节点、链表

bool InitList(LinkList* &L)//构造一个空的单链表 L
{
	L=new LinkNode; //生成新结点作为头结点,用头指针 L 指向头结点
	if(!L)return false; //生成结点失败
	L->next=NULL; //头结点的指针域置空
	return true;
}

2、单链表添加元素

1、前插法
//前插法
bool ListInsert_front(LinkList* &L, LinkNode * node){
	if(!L || !node ) return false;
	node->next = L->next;
	L->next = node;
	return true;
}
2、尾插法
//尾插法
bool ListInsert_back(LinkList* &L, LinkNode *node){
	LinkNode *last = NULL;
	if(!L || !node ) return false;
	//找到最后一个节点
	last = L;
	while(last->next) last=last->next;
	//新的节点链接到最尾部
	node->next = NULL;
	last->next = node;
	return true;
}
3、任意位置插
//任意位置插法
bool LinkInsert(LinkList* &L, int i, int &e)//单链表的插入
{
	//在带头结点的单链表 L 中第 i 个位置插入值为 e 的新结点
	int j;
	LinkList *p, *s;
	p=L;
	j=0;
	while (p&&j<i-1) //查找第 i-1 个结点,p 指向该结点
	{
	p=p->next;
	j++;
	}
	if (!p || j>i-1){//i>n+1 或者 i<1
	return false;
}
	s=new LinkNode; //生成新结点
	s->data=e; //将新结点的数据域置为 e
	s->next=p->next; //将新结点的指针域指向结点 ai
	p->next=s; //将结点 p 的指针域指向结点 s
	return true;
}

3、单链表遍历

void LinkPrint(LinkList* &L) //单链表的输出
{
	LinkNode* p;
	p=L->next;
	while (p)
	{
	cout <<p->data <<"\t";
	p=p->next;
	}
	cout<<endl;
}

4、单链表元素获取

bool Link_GetElem(LinkList* &L, int i, int &e)//单链表的取值
{
//在带头结点的单链表 L 中查找第 i 个元素
//用 e 记录 L 中第 i 个数据元素的值
	int j;
	LinkList* p;
	p=L->next;//p 指向第一个结点,
	j=1; //j 为计数器
	while (j<i && p) //顺链域向后扫描,直到 p 指向第 i 个元素或 p 为空
		{
	p=p->next; //p 指向下一个结点
	j++; //计数器 j 相应加 1
		}
	if (!p || j>i){
	return false; //i 值不合法 i>n 或 i<=0
	}
	e=p->data; //取第 i 个结点的数据域
	return true;
}

5、单链表找查元素

bool Link_FindElem(LinkList *L, int e) //按值查找
{
	//在带头结点的单链表 L 中查找值为 e 的元素
	LinkList *p;
	p=L->next;
	while (p && p->data!=e){//顺链域向后扫描,直到 p 为空或 p 所指结点的数据域等于 e
	p=p->next; //p 指向下一个结点
	}
	if(!p)return false; //查找失败 p 为 NULL
	return true;
}

6、单链表删除元素

bool LinkDelete(LinkList* &L, int i) //单链表的删除
{
	//在带头结点的单链表 L 中,删除第 i 个位置
	LinkList *p, *q;
	int j;
	p=L;
	j=0;
	while((p->next)&&(j<i-1)) //查找第 i-1 个结点,p 指向该结点
	{
	p=p->next;
	j++;
	}
	if (!(p->next)||(j>i-1))//当 i>n 或 i<1 时,删除位置不合理
	return false;
	q=p->next; //临时保存被删结点的地址以备释放空间
	p->next=q->next; //改变删除结点前驱结点的指针域
	delete q; //释放被删除结点的空间
	return true;
}

7、单链表销毁

void LinkDestroy(LinkList* &L) //单链表的销毁
{
	//定义临时节点 p 指向头节点
	LinkList *p = L;
	cout<<"销毁链表!"<<endl;
	while(p)
	{
	L=L->next; //L 指向下一个节点
	cout<<"删除元素: "<<p->data<<endl;
	delete p; //删除当前节点
	p=L; //p 移向下一个节点
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值