栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现单链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现单链表

LinkList.h

#pragma once
#include 
using namespace std;
template 
struct Node
{
	DataType data;//数据域
	Node* next;//指针域
};
template
class LinkList
{
public:
	LinkList();//建立只有头结点的空链表
	LinkList(DataType a[], int n);//建立n个元素的单链表
	~LinkList();//析构函数
	int length();//求单链表的长度
	DataType Get(int i);//按位查找,查找第i个节点的的元素值
	int Locate(DataType x);//按值查找,查找值为x的元素序号
	void Insert(int i, DataType x);//插入操作,第i个位置插入值为x的结点
	DataType Delete(int i);//删除操作,删除第i个结点
	int Empty();//判断线性表是否为空
	void PrintList();//遍历操作,按序号依次输出个元素
private:
	Node* first;//单链表的头指针
};
template 
LinkList::LinkList()//建立只有头结点的空链表
{
	first = new Node;//生成头结点
	first->next = NULL;

}

template 
int LinkList::Empty()//判断线性表是否为空
{
	if (first->next == NULL)return false;
	else return true;
}
template 
void LinkList::PrintList()//遍历操作,按序号依次输出个元素
{
	Node* p = first->next;//工作p指针初始化
	while (p != NULL)
	{
		cout << p->data << 't';
		p = p->next;
	}
	cout <
int LinkList::length()//求单链表的长度
{
	Node* p = first->next;//工作指针初始化
	int count = 0;//累加器初始化
	while (p!= NULL)
	{
		p = p->next;
		count++;
	}
	return count;
}
template 
DataType LinkList::Get(int i)//按位查找,查找第i个节点的的元素值
{
	Node* p = first->next;//工作指针p初始化
	int count = 1;//累加器count初始化
	while(p != NULL && count < i)
	{
		p = p->next;//工作指针p向后移
		count++;
	}
	if (p == NULL)throw"查找位置错误";
	else return p->data;
}

template 
int LinkList::Locate(DataType x)//按值查找,查找值为x的元素序号
{
	Node* p = first->next;//工作指针p初始化
	int count = 1;//累加器count初始化
	while (p != NULL)
	{
		if (p->data == x)return count;
		p = p->next;
		count++;
	}
	return 0;
}
template 
void LinkList::Insert(int i, DataType x)//插入操作,第i个位置插入值为x的结点
{
	Node* p = first, * s = NULL;
	int count = 0;
	while (p != NULL && count < i - 1)//查找第i-1个结点
	{
		p = p->next;//工作指针p向后移
		count++;
	}
	if (p == NULL)throw"插入位置错误";
	else
	{
		s = new Node;
		s->data = x;//申请结点s,数据域为x;
		s->next = p->next;//将结点s插入结点p之后
		p->next = s;
	}
}
template 
LinkList::LinkList(DataType a[], int n)//建立n个元素的单链表
{
	first = new Node;//生成头结点
	Node* r = first, * s = NULL;
	for (int i = 0; i < n; i++)
	{
		s = new Node;
		s->data = a[i];
		r->next = s; r = s;//将结点s插入终端结点之后
	}
	r->next = NULL;
}
template 
DataType LinkList::Delete(int i)//删除操作,删除第i个结点
{
	DataType x;
	Node *p = first, * q = NULL;
	int count = 0;
	while (p != NULL && count < i - 1)
	{
		p = p->next;
		count++;
	}
	if (p == NULL || p->next == NULL)//结点p不存在或p的后继结点不存在
		throw"删除位置错误";
	else
	{
		q = p->next; x = q->data;//暂存被删结点
		p->next = q->next;//摘链
		delete q;
		return x;
	}
}
template 
LinkList::~LinkList()//析构函数
{
	Node* p = first;
	while (first != NULL)//释放每一个结点的存储空间
	{
		first = first->next;//first指向被释放结点的下一个结点
		delete p;
		p = first;//工作指针后移
	}
}

main.cpp

#include "LinkList.h"
#include 
using namespace std;
int main(void)
{
	int r[5] = {1,2,3,4,5},i,x;
	LinkList L(r,5);
	cout << "当前线性表的数据为:";
	L.PrintList();//输出当前链表1 2 3 4 5、
	try
	{
		L.Insert(2, 8);//在第二个位置插入值为8的结点
		cout << "执行插入操作后数据为:";
		L.PrintList();//输出插入后链表1 8 2 3 4 5
	}
	catch (char *str) { cout << str << endl; }
	cout << "当前链表的长度为:" << L.length() << endl;//输出链表长度
	cout << "请输入查找的元素值:";
	cin >> x;
	i = L.Locate(x);
	if (i > 0)cout << "元素" << x << "的位置为:" << i << endl;
	else cout << "单链表中没有元素" << x << endl;
	try
	{
		cout << "请输入要删除第几个元素:";
		cin >> i;
		x = L.Delete(i);//删除第i个元素
		cout << "删除的元素值为:" << x << ",执行删除操作后的数据为:";
		L.PrintList();//输出删除后的单链表
	}
	catch (char* str) { cout << str << endl; }
	return 0;
}

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015141.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号