数据结构——单链表的相关操作

前言:本文是在lady_killer9的博客_CSDN博客-网络安全,python,常见算法与数据结构实现领域博主做出相应的修改,完善了部分代码,有不足之处欢迎指正

#include<bits/stdc++.h>
using namespace std;
#define Status int
#define ElemType int
typedef struct LNode
{
	ElemType data;//数据域
	struct LNode* next;//指针域
}LNode, * LinkList;

Status InitList(LinkList& L)
{
	L = new LNode;
	L->next = NULL;
	return 1;
}
//头插法创建
void CreateList_H(LinkList& L) {
	int i, n,x;
	LNode* temp;
	cout << "请输入链表的结点个数:";
		cin >> n;
	L = new LNode;
	L->next = NULL;
	for (i = n; i >= 1; i--) {
		cout << endl << "--------请输入第" << i << "个节点的数据:" ;
		cin >> x;
		temp = new LNode;
		temp->data = x;
		temp->next = L->next;
		L->next = temp;
	}
}
//尾插法创建
void CreateList_R(LinkList& L) {
	int i, n,x;
	cout << "请输入链表的结点个数:";
	cin >> n;
	L = new LNode;
	L->next = NULL;
	LNode* temp, * r;
	r = L;
	for (i = 1; i <= n; i++) {
		cout << endl << "--------请输入第"<<i<<"个节点的数据:" ;
		temp = new LNode;
		cin >> x;
		temp->data = x;
		temp->next = r->next;
		r->next = temp;
		r = temp;
	}
}
int ListLength(LinkList L)
{
	LinkList p = L; int sum = 0;
	while (p)
	{
		sum++;
		p = p->next;
	}
	return sum - 1;//不含头结点
}
//插入
bool ListInsert(LinkList& L, int i, ElemType e)
{
	LNode* s; LinkList p = L; int j = 0;
	while (p && (j < i - 1))//j指到i-1位置或者p已经到最后时跳出
	{
		p = p->next;
		++j;
	}
	if (!p || j > i - 1)//i<1或者i>ListLength(L)+1时,插入位置无效 不调用ListLength,提高效率
	{
		cout << "插入的位置无效!!!" << endl;
		return false;
	}
	s = new LNode;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}
bool ListDelete(LinkList& L, int i)
{
	LNode* p, * q;
	p = L;
	int j = 0;
	while ((p->next)&& (j < i - 1))//j指到i-1位置
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || (j > i - 1))//i<1或者i>ListLength(L)时,删除位置无效
	{
		cout << "删除的位置无效!!!" << endl;
		return false;
	}
	q = p->next;
	p->next = q->next;
	delete q ;//释放空间
	return true;
}
LNode* LocateElem(LinkList L, ElemType e)
{
	LNode* p = L;
	while (p && (p->data != e))
	{
		p = p->next;
	}
	return p;
}
bool  GetLElem(LinkList& L,int i,ElemType &e) {
	LNode* p;
	p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		++j;
	}
	if (!p || j > i) {
		printf("\n位置不合法!!\n");//i值不合法
		return false;
	}
	e = p->data;
	return true;
}
//遍历输出函数
void PrintList(LinkList L)
{
	LinkList p = L->next;//跳过头结点
	if (ListLength(L))
	{
		cout << "当前单链表所有元素:";
		while (p)
		{
			cout <<p->data<<" ";
			p = p->next;
		}
		printf("\n");
	}
	else
	{
		cout << "当前单链表已空!" << endl;
	}
}
void Insert(LinkList& L)
{
	int place; ElemType e; bool flag;
	cout << "请输入要插入的位置(从1开始)及元素:" << endl;
	cin >> place >> e;
	flag = ListInsert(L, place, e);
	if (flag)
	{
		cout << "插入成功!!!" << endl;
		PrintList(L);
	}
}
void Delete(LinkList L)
{
	int place; bool flag;
	cout << "请输入要删除的位置:" << endl;
	cin >> place;
	flag = ListDelete(L, place);
	if (flag)
	{
		cout << "删除成功!!!" << endl;
		PrintList(L);
	}
}
void Search(LinkList L)
{
	ElemType e; LNode* q;
	cout << "请输入要查找的值:" << endl;
	cin >> e;
	q = LocateElem(L, e);
	if (q)
	{
		cout << "找到该元素!" << endl;
	}
	else
		cout << "未能找到该元素!" << endl;
}
void GetElem(LinkList L) {
	int i;
	ElemType e;
	bool flag;
	cout << "请输入要查找的结点位置:" << endl;
	cin >> i;
	flag = GetLElem(L, i, e);
	if (flag) {
		cout << "该元素为:" << e << endl;
	}
	else {
		cout << "位置不合理!" << endl;
	}
}
void menu()
{
	printf("********1.插入    2.删除*********\n");
	printf("********3.查找    4.输出*********\n");
	printf("***5.创建(头)   6.***创建(尾)\n");
	printf("********7.取值    8.退出*********\n");
}
int main()
{
	LinkList L; int choice;
	InitList(L);
	while (1)
	{
		menu();
		cout << "请输入菜单序号:" << endl;
		cin >> choice;
		if (choice == 8) break;
		switch (choice)
		{
		case 1:Insert(L); break;
		case 2:Delete(L); break;
		case 3:Search(L); break;
		case 4:PrintList(L); break;
		case 5:CreateList_H(L); break;
		case 6:CreateList_R(L); break;
		case 7:GetElem(L); break;
		default:cout << "输入错误!!!" << endl; 
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值