单链表的基础定义和操作(C++版)

以下为单链表的基础定义和操作,可以参考,欢迎大家来共同讨论。

#include<iostream>
using namespace std;

typedef struct LNode//定义链表
{
	int data;//数据元素
	struct LNode* next;//尾指针
	
}LNode,*LinkList;


void InitList(LinkList &L)//初始化链表
{
	L = new LNode;//分配一个头节点
	if (L == NULL)
	{
		cout << "分配内存失败,初始化失败" << endl;//悲报
		return;//退出
	}
	L->next = NULL;//尾指针置空
	cout << "初始化成功" << endl;//喜报
}


LinkList Link_TailInsert(LinkList L)//建立单链表(尾插法)
{
	int x;//数据容器
	L = new LNode;//创建头指针
	L->next = NULL;//头指针的尾指针置空
	LNode*r = L;//创建工作指针
	
		cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
		cin >> x;
	 while (x != 10086)//循环插入
	{
		LNode* s = new LNode;//创建新节点
		s->data = x;//给新节点赋值
		r->next = s;//将新节点并入链表
		r = s;//工作指针后移一位
		cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
		cin >> x;//输入数据
	};
	 r->next = NULL;//工作指针的尾指针置空
	 return L;//返回单链表的头指针
}


LinkList List_HeadInsert(LinkList L)
{
	int x;//数据容器
	L = new LNode;//创建头指针
	L->next = NULL;//头指针的尾指针置空

	cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
	cin >> x;
	while (x != 10086)//循环插入
	{
		LNode* s = new LNode;//创建新节点
		s->data = x;//给新节点赋值
		s->next = L->next;//将新节点和头指针指向同一片区域
		L->next = s;//将新节点并入头指针
		cout << "请输入要插入的数据,如无需插入则输入10086" << endl;
		cin >> x;//输入数据
	};
	return L;//返回单链表的头指针
}


bool IsEmpty(LinkList L)//判断链表是否为空
{
	return L->next == NULL;
}


void ListInsert(LinkList& L, int i, int e)//链表插入,i为要求位置,e为插入的数据
{
	if (i < 1)
	{
		cout << "插入位置有误,插入失败" << endl;
		return;
	}
	LinkList p = L;//创建新指针
	int j = 0;
	while (p != NULL && j < i - 1)//指针扫描指定位置的节点
	{
		p = p->next;
		j++;
	}
	if (p == NULL)//如指定位置无节点
	{
		cout << "插入位置无节点,插入失败" << endl;//悲报
		return;//退出
	}
	LNode* s = new LNode;//创建要插入的新节点
	s->data = e;//赋值给新节点
	s->next = p->next;//新节点和要求节点尾指针指向同一个节点
	p->next = s;//要求位置的节点尾指针指向新节点
	cout << "插入成功" << endl;//喜报
}


void InsertNextNode(LNode* p, int e)//指定节点之后插入
{
	if (p == NULL)
	{
		cout << "指定节点为空,插入失败" << endl;//悲报
		return;
	}
	LNode* s = new LNode;
	if (s == NULL)
	{
		cout << "内存分配失败,插入失败" << endl;//悲报
		return;
	}
	s->data = e;//赋值给新节点
	s->next = p->next;//新节点和要求节点尾指针指向同一个节点
	p->next = s;//要求位置的节点尾指针指向新节点
	cout << "插入成功" << endl;//喜报

}


void ListDelete(LinkList& L, int i, int& e)//按位删除
{
	if (i < 1)
	{
		cout << "删除位置有误,删除失败" << endl;
		return;
	}
	LinkList p = L;//创建新指针
	int j = 0;
	while (p != NULL && j < i - 1)//指针扫描指定位置的节点
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		cout << "删除位置无节点,删除失败" << endl;//悲报
		return;//退出
	}
	if (p->next==NULL)
	{
		cout << "删除位置无节点,删除失败" << endl;//悲报
		return;//退出
	}
	LNode* q = p->next;//创建新指针指向被删除的节点
	e = q->data;//将数据挪出
	p->next = q->next;//将q节点从链表断开
	delete q;//删除q节点
	q = NULL;//防止指针乱指
	cout << "删除成功" << endl;//喜报
}


LNode* GetData(LinkList L, int i)//按位查找
{
	if (i < 0)
	{
		cout << "目标位置错误,查找失败" << endl;//悲报
		return NULL;
	}
	LinkList p = L;//创建工作链表
	int j = 0;//创建计数器
	while (p != NULL && j < i)//循环查找目标节点
	{
		p = p->next;
		j++;
	}
	return p;//如果目标节点存在则返回节点,否则返回NULL
}

LNode* LocateData(LinkList L, int e)//按值查找
{
	LNode* p = L->next;//创建工作链表
	while (p != NULL && p->data != e)//通过循环查找和数值匹配的节点
	{
		p = p->next;
	}
	return p;//返回该节点,若未找到则返回NULL
}


int Length(LinkList L)//统计链表长度
{
	int count = 0;//创建计数器
	LinkList p = L;//创建工作指针
	while (p != NULL)//通过循环来计数
	{
		p = p->next;
		count++;
	}
	return count;//返回长度
}

欢迎大家批评指正,我将虚心请教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值