【数据结构】-单链表(无头结点)

这篇博客详细介绍了无头结点单链表的各种操作,包括初始化、判空、插入、删除、查找、求表长、创建和遍历等,并探讨了如何处理首结点的特殊情况。此外,还讨论了使用带头结点单链表的优点。
摘要由CSDN通过智能技术生成

1.头文件及类型定义

#include<stdio.h>
#include<stdlib.h>
#define ElemType int

2.单链表结点类型定义

typedef struct LNode {
   		//定义单链表结点类型
	ElemType data;			//每个结点存放一个数据元素
	struct LNode* next;		//指针指向下一个结点
}LNode,*LinkList;

3.函数声明

LinkList InitList(LinkList& L);								//1.初始化单链表(不带头结点)
bool Empty(LinkList L);										//2.判空
bool InsertList(LinkList& L, int i, ElemType e);			//3-1.插入函数-按位序插入:表中第i个位置上插入指定元素e 
bool InsertNextNode(LNode* p, ElemType e);					//3-2.插入函数-指定结点后插:在指定结点之后插入元素e
bool InsertPriorNode1(LinkList& L, LNode* p, ElemType e);	//3-3-1.插入函数-指定结点前插:在指定结点之前插入元素e---法1:老实人O(n)
bool InsertPriorNode2(LNode* p, ElemType e);				//3-3-2.插入函数-指定结点前插:在指定结点之前插入元素e---法2:偷天换日O(1)
bool ListDelete(LinkList& L, int i, ElemType& e);			//4-1.按位序删除
bool DeleteNode1(LinkList& L, LNode* p);					//4-2-1.指定结点的删除:删除指定的元素p---法1:老实人O(n)
bool DeleteNode2(LNode* p);									//4-2-2.指定结点的删除:删除指定的元素p---法2:偷天换日O(1)
LNode* GetElem(LinkList L, int i);							//5-1.查找函数-按位查找:返回第i个元素
LNode* LocateElem(LinkList L, ElemType e);					//5-2.查找函数-按值查找
int Length(LinkList L);										//6.求表的长度
LinkList List_TailInsert1(LinkList& L);						//7-1-1.创建单链表-尾插法1:O(n^2)
LinkList List_TailInsert2(LinkList& L);						//7-1-2.创建单链表-尾插法2:O(n)
LinkList List_HeadInsert(LinkList& L);						//7-2.创建单链表-头插法:O(n)
void PrintList(LinkList L);									//8.遍历单链表

4.基本操作

4.1 初始化单链表

//1.初始化单链表(不带头结点)
LinkList InitList(LinkList& L) {
   
	L = NULL;			//初始化为空,暂时没有任何结点
	return L;
}

4.2 判空

//2.判空
bool Empty(LinkList L) {
   
	if (L == NULL)
		return true;
	else
		return false;
	//或者 return (L==Null);
}

4.3 插入操作

4.3.1 按位插入

//3-1.插入函数-按位序插入:表中第i个位置上插入指定元素e 
bool InsertList(LinkList& L, int i, ElemType e) {
   
	if (i == 1) {
   
		LNode* s = (LNode*)malloc(sizeof(LNode));
		if (s == NULL)		//内存分配失败
			return false;
		s->data = e;
		s->next = L;
		L = s;
		return true;
	}
	/*此段代码=====按位查找操作
		LNode* p;		//指针p指向当前扫描到的结点
		int j = 1;		//当前p指向的是第几个结点
		p = L;			//L指向头指针
		while (p != NULL && j < i - 1) {	//循环找到第i-1个结点
			p = p->next;
			j++;
		}
	*/
	LNode* p = GetElem(L, i - 1);

	/*此段代码====后插操作
		if (p == NULL)
			return false;		//i值不合法
		LNode* s = (LNode*)malloc(sizeof(LNode));		//为要插入的结点申请空间
		if (s == NULL)		//内存分配失败
			return false;
		s->data = e;			//放入数据
		s->next = p->next;		//要插入结点指向i-1的后继结点
		p->next = s;		//i-1的结点指向插入的结点
		return true;
	*/
	return InsertNextNode(p, e);
}

4.3.2 指定结点插入

4.3.2.1 指定结点后插
//3-2.插入函数-指定结点后插:在指定结点之后插入元素e
bool InsertNextNode(LNode* p, ElemType e) {
   
	if (p == NULL)
		return false;
	LNode* s = 
  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值