利用C++创建带头结点单链表,并实现插入、删除、遍历、清空、退出等功能

一、创建linklist.h头文件,创建LNode结点,LinkList链表类

#pragma once //防止头文件重复包含
#include<iostream> //标准输入输出流
using namespace std; //标志命名空间

//创建结点
struct LNode
{
	int Data; //数据域
	LNode* Next; //指针域
};

//创建单链表类
class LinkList
{
public:
	//利用构造函数初始化单链表
	LinkList();

	//显示菜单
	void MenuList();

	//创建单链表L并使用头插法,插入n个元素
	void CreateList_H();

	//创建单链表L并使用尾插法,插入n个元素
	void CreateList_R();

	//在单链表L中第i个元素之前插入数据元素e
	void ListInsert();

	//将单链表L中第i个数据元素删除
	void ListDelete();

	//遍历单链表L
	void PrintList();

	//求单链表的表长
	void ListLength();

	//判断单链表是否为空
	void ListEmpty();

	//获取单链表中的某个元素的内容,通过变量e返回
	void GetElem();

	//在单链表L中查找值为e的数据元素的位置序号
	void LocateElem();
	
	//清空单链表
	void ClesrList();

	//销毁单链表,并退出
	void DestroyList();

public:
  LNode * L; //头指针,单链表名
};

二、创建linklist.cpp源文件,实现链表类中函数功能的具体实现

#include"linklist.h"

//利用构造函数初始化单链表
LinkList::LinkList()
{
	L = new LNode; //头指针指向头结点
	L->Next = NULL;
	L->Data = 0;
}

//显示菜单
void LinkList::MenuList()
{
	cout << "---------1、头插法创建链表---------------------" << endl;
	cout << "---------2、尾插法创建链表---------------------" << endl;
	cout << "---------3、在链表中任意位置插入元素-----------" << endl;
	cout << "---------4、在链表中任意位置删除元素-----------" << endl;
	cout << "---------5、遍历单链表-------------------------" << endl;
	cout << "---------6、返回单链表表长---------------------" << endl;
	cout << "---------7、判断单链表是否为空-----------------" << endl;
	cout << "---------8、按位查找返回值---------------------" << endl;
	cout << "---------9、按值查找返回序号-------------------" << endl;
	cout << "---------10、清空单链表------------------------" << endl;
	cout << "---------0、销毁单链表并退出------------------" << endl;
}

//创建单链表L并使用头插法,插入n个元素
void LinkList::CreateList_H()
{
	L = new LNode; //创建头结点
	L->Next = NULL; //将头结点指针域置空
	LNode* p; //创建指针变量p
	int n; //记录插入个数
	cout << "请输入你要插入的元素个数:" << endl;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		p = new LNode; //生产新结点
		cout << "请输入第" << i << "个元素:" << endl;
		cin >> p->Data; //输入元素值
		p->Next = L->Next; //将头结点的指针域赋值给新结点的指针域
		L->Next = p; //头结点的指针域记录新结点的地址
	}
	cout << "插入完毕,按任意键继续" << endl;
	system("pause");
	system("cls");
}

//创建单链表L并使用尾插法,插入n个元素
void LinkList::CreateList_R()
{
	L = new LNode; //创建头结点
	L->Next = NULL; //将头结点指针域置空
	LNode* r,*p; //创建尾指针r 新结点p
	r = L; //将头指针赋值给尾指针,使尾指针也指向头结点
	int n; //记录插入个数
	cout << "请输入你要插入的元素个数:" << endl;
	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		p = new LNode; //生产新结点
		cout << "请输入第" << i << "个元素:" << endl;
		cin >> p->Data; //输入元素值
		p->Next = NULL; //将新结点指针域置为空
		r->Next = p; //尾指针指针域指向新结点
		r = p; //r指向新的尾结点
	}
	cout << "插入完毕,按任意键继续" << endl;
	system("pause");
	system("cls");
}

//在单链表L中第i个元素之前插入数据元素e
void LinkList::ListInsert()
{
	LNode* p,*s; //创建指针变量p,s
	p = L; //p指向头结点是因为可以在头结点之后插入,所以要从头结点开始出发
	int i,e,j=0; //i记录插入位置,e记录插入元素,j记录序号

	cout << "请输入要插入的位置:" << endl;
	cin >> i;
	while (p&&j<i-1) //p为空或找到i前一个元素,则停止循环
	{
		p = p->Next;
		j++;
	}

	if (!p || j > i - 1) //!p为真则i大于表长+ 1,j >i-1为真则表示i小于1
	{
		cout << "输入的位置不合法" << endl;
	}
	else
	{
		s = new LNode; //创建新结点
		cout << "请输入要插入的数据:" << endl;
		cin >> e;
		s->Data = e; //将e赋给s结点的数据域
		s->Next = p->Next; //将p指针域中记录的下一结点地址赋给s结点的指针域
		p->Next = s; //p结点指针域中记录结点s地址
		cout << "插入成功,请按任意键继续" << endl;
	
	}

	system("pause");
	system("cls");
}


//将单链表L中第i个数据元素删除
void LinkList::ListDelete()
{
	LNode* p, * q; //创建指针变量p,q
	p = L;
	int i,e,select, j = 0; //i记录选择想要删除位置,e保存删除位置数据域,select选择是否删除
	cout << "请输入要删除的位置:" << endl;
	cin >> i;
	while (p->Next && j <i-1) //p->为空或找到i前一个元素,则停止循环
	{
		p = p->Next;
		j++;
	}

	if (!(p->Next) || j > i - 1)//!p->Next为真则输入的i大于表长+ 1,j >i-1为真则表示i小于1
	{
		cout << "输入的" << i << "不合法或不存在" << endl;
	}
	else
	{
		q = p->Next; //q结点记录要删除的结点
		p->Next = q->Next; //p结点的指针域指向要删除结点的下一结点指针域
		e = q->Data; //保存要删除结点的数据域
		cout << "第" << i << "个位置中的元素为:" << e << " 请确认是否删除" <<endl;
		cout << "1、是" << endl;
		cout << "2、否" << endl;
		cin >> select;
		if (select == 1) //确认是否删除
		{
			delete q;
			cout << "删除成功" << endl;
		}
		
	}

	system("pause");
	system("cls");
}

//遍历单链表L
void LinkList::PrintList()
{
	LNode* p; //创建临时变量p
	p = L->Next; //p指向第一个结点

	while (p)
	{
		cout << p->Data << " ";
		p = p->Next;
	}
	cout << endl;
	system("pause");
	system("cls");
}

//求单链表的表长
void LinkList::ListLength()
{
	LNode* p; //创建临时变量p
	p = L->Next; //p指向第一个结点
	int count = 0; //统计表长
	while (p) //判断p是否指向空,为空结束循环
	{
		count++; 
		p = p->Next; //p指向下一结点的指针域
	} 

	cout << "单链表的表长为:" << count << endl;
	system("pause");
	system("cls");
}

//判断单链表是否为空
void LinkList::ListEmpty()
{
	if (L->Next == NULL) //判断头结点指针域释放为空
	{
		cout << "单链表L为空" << endl;
	}
	else
	{
		cout << "单链表L不为空" << endl;
	}
	system("pause");
	system("cls");
}

//获取单链表中的某个元素的内容,通过变量e返回
void LinkList::GetElem()
{
	LNode* p; //创建临时变量p
	p = L->Next;  //p变量存放头结点的指针域
	int i, e, j = 1; //变量i记录要查找的位置,e 记录查找到的数据,j记录序号
	cout << "请输入你要查找的位置:" << endl;
	cin >> i;

	while (p && j < i) //判断当p为空或j = i是为假,则停止循环
	{
		p = p->Next;
		++j;
	}

	if (!p || j > i) //当p为空或j>i时元素不存在
	{
		cout << "第" << i << "个元素不存在" << endl;
	}
	else
	{
		e = p->Data; //将查找到值赋给e
		cout << "第" << i << "个位置元素为:" << e << endl;
	}

	system("pause");
	system("cls");
}

//在线性表L中查找值为e的数据元素的位置序号
void LinkList::LocateElem()
{
	LNode* p; //创建临时变量p
	p = L->Next;  //p变量存放头结点的指针域
	int e,j = 1; //变量e记录要查找的元素,变量j记录序号

	cout << "请输入你要查找的元素:" << endl;
	cin >> e;

	while (p&&p->Data != e) //判断当p为空或p->data中的数据=e时为假,则停止循环
	{
		p = p->Next;
		j++;
	}

	if (p) //判断p是否为空,不为空则找到元素序号
	{
		cout << "元素" << e << "位置的序号为:" << j << endl;
	}
	else
	{
		cout << "未找到" << endl;
	}

	system("pause");
	system("cls");
}

//清空单链表
void LinkList::ClesrList()
{
	LNode* p, * q; //创建临时变量p,p
	p = L->Next; //p变量存放头结点的指针域
	while (p)
	{
		q = p->Next; //q变量存放p的下一指针域
		delete p; //释放p
		p = q; //将q变量中的内容返还给p
	}
	L->Next = NULL; //将头结点的指针域置为空
	cout << "清空成功" << endl;
	system("pause");
	system("cls");
}

//销毁单链表并退出
void LinkList::DestroyList()
{
	LNode* p; //创建临时变量p
	while (L) //循环执行直到L为空退出循环
	{
		p = L; //将头指针L的值付给p
		L = L->Next; //让头指针指向下一节点的指针域
		delete p; //销毁p
	}
	cout << "销毁成功,欢迎下次使用" << endl;
	system("pause");
	exit(0);
}

三、在主函数中包含linklist.h头文件,并利用while、switch等循环实现功能调用。

#include<iostream>
using namespace std;
#include"linklist.h" //链表类头文件

int main()
{
	LinkList L;
	int select = 0;
	
	while (true)
	{
		L.MenuList();
		cout << "请输入你的选择:" << endl;
		cin >> select;

		switch (select)
		{
		case 1: //头插法创建链表
			L.CreateList_H();
			break;
		case 2: //尾插法创建链表
			L.CreateList_R();
			break;
		case 3: //在链表中任意位置插入元素
			L.ListInsert();
			break;
		case 4: //在链表中任意位置删除元素
			L.ListDelete();
			break;
		case 5://遍历单链表
			L.PrintList();
			break;
		case 6://返回单链表表长
			L.ListLength();
			break;
		case 7://判断单链表是否为空
			L.ListEmpty();
			break;
		case 8://按位查找返回值
			L.GetElem();
			break;
		case 9://按值查找返回序号
			L.LocateElem();
			break;
		case 10://清空单链表
			L.ClesrList();
			break;
		case 0://销毁单链表并退出
			L.DestroyList();
			break;
		default:
			cout << "输入有误请重新输入" << endl;
			system("pause");
			system("cls");
			break;
		}
	}

	system("pause");
	return 0;
}

四、功能展示

 

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是用C++设计的头结点单链表类的实现: ```cpp #include <iostream> using namespace std; template <typename T> class ListNode { public: T data; ListNode<T>* next; ListNode(T val = 0, ListNode<T>* ptr = nullptr) : data(val), next(ptr) {} }; template <typename T> class LinkedList { private: ListNode<T>* head; public: LinkedList() { head = new ListNode<T>; } ~LinkedList() { clear(); delete head; } void clear(); bool isEmpty() const { return head->next == nullptr; } int length() const; bool insert(int i, const T& x); bool remove(int i); int search(const T& x) const; void input(); void output() const; }; template <typename T> void LinkedList<T>::clear() { ListNode<T>* p = head->next, *q; head->next = nullptr; while (p != nullptr) { q = p->next; delete p; p = q; } } template <typename T> int LinkedList<T>::length() const { ListNode<T>* p = head->next; int len = 0; while (p != nullptr) { len++; p = p->next; } return len; } template <typename T> bool LinkedList<T>::insert(int i, const T& x) { if (i < 0) return false; ListNode<T>* p = head; int j = -1; while (p != nullptr && j < i - 1) { p = p->next; j++; } if (p == nullptr) return false; ListNode<T>* q = new ListNode<T>(x, p->next); p->next = q; return true; } template <typename T> bool LinkedList<T>::remove(int i) { if (i < 0) return false; ListNode<T>* p = head; int j = -1; while (p != nullptr && j < i - 1) { p = p->next; j++; } if (p == nullptr || p->next == nullptr) return false; ListNode<T>* q = p->next; p->next = q->next; delete q; return true; } template <typename T> int LinkedList<T>::search(const T& x) const { ListNode<T>* p = head->next; int i = 0; while (p != nullptr && p->data != x) { p = p->next; i++; } if (p == nullptr) return -1; else return i; } template <typename T> void LinkedList<T>::input() { clear(); int n; cin >> n; for (int i = 0; i < n; i++) { T x; cin >> x; insert(i, x); } } template <typename T> void LinkedList<T>::output() const { ListNode<T>* p = head->next; while (p != nullptr) { cout << p->data << " "; p = p->next; } cout << endl; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值