数据结构作业:递归实现链表操作集

问题描述

1. (简答题)

有一个不带头结点的单链表:

递归实现以下操作(强调:所有操作必须用递归完成)。

1,插入数据:13,15,8,4,8,3,4,8(可以用递归一次完成,也可以用递归将一个一维数组一个一个的尾部插入)

2,正向输出所有节点值

3,逆向输出所有节点值

4,输出单链表中数据结点个数

5,输出第k个节点的值(k由用户输入,要能给出错误情况)

6,在第k个位置上插入e元素。(k和e由用户输入,要能给出错误情况)

7,正向输出所有节点值

8,删除第k个结点(k由用户输入,要能给出错误情况)

9,正向输出所有节点值

10,删除值为X的数据结点(测试值为:8)

11,正向输出所有节点值

12,删除所有值为X的数据结点(测试值为:4)

13,正向输出所有节点值

14,输出该链表的最大值

15,输出该链表的最小值

16,查找值为X的数据结点在当前链表出现的位置(测试值为:3,要能给出错误情况)。

17,销毁该链表

要求,代码给出详细注释:上传代码贴图,运行结果贴图,上传源代码文件。

 

代码展示:

函数实现部分

#include<iostream>
#include<cmath>
#define INI_MIN -1e9
#define INI_MAX  1e9

using namespace std;
typedef int ElemType;

//定义结构体
typedef struct Node {
	ElemType data;
	struct Node* next;
}LinkList;

//初始化单链表
void InitList(LinkList*& L)
{
	L = new LinkList;
	L = NULL;               //定义一个没有头节点的单链表
}

/*-------------------------------------------------------------递归实现单链表的操作集----------------------------------------------------------------------------------------------*/

//插入数据
void CreateList(LinkList*& L, ElemType e)
{
	if (L == NULL)
	{
		L = new LinkList;
		L->data = e;
		L->next = NULL;
		return ;
	}
	return CreateList(L->next, e);
}

//正向递归输出单链表
void traverse(LinkList* L)
{
	if (L == NULL)return;
	cout << L->data << ' ';    //正向输出需要先输出当前节点元素再递归到下一层
	traverse(L->next);
}

//逆向递归输出单链表
void traverseR(LinkList* L)
{
	if (L == NULL)return;
	traverseR(L->next);			//逆向输出需要先递归到最后一层,找到表尾元素后再输出返回
	cout << L->data << ' ';
}

//递归输出单链表中的数据个数
int countList(LinkList* L)
{
	if (L == NULL) return 0;           //如果为空,返回零(递归终止条件)
	return countList(L->next) + 1;     //否则,递归下一层+1(递归推导式)
}

//递归输出第k个节点的值
int getList_K(LinkList* L, int k)
{
	if (L == NULL) {
		return -1;
	}
	if (k == 1)return L->data;        //递归处理的过程,如果k可以取到1证明了链表至少有k个节点,可以取到k
	return getList_K(L->next, k - 1);
}

//在第k个位置上插入e元素
bool InsertList_K(LinkList*& L, int k, ElemType e)
{
	if (k == 1) {	//成功找到插入位置(递归终止条件)
		LinkList* s;
		s = new LinkList;
		s->data = e;
		s->next = L;
		L= s;
		return true;
	}
	if (L == NULL) {
		                 //找不到插入的位置(递归终止条件)
		return false;
	}
	InsertList_K(L->next, k - 1, e);   //否则递归进入下一层
}

//删除第k个结点
bool DeleteList_K(LinkList*& L, int k)
{
	if (L == NULL) {					//递归终止条件:表空了
		return false;
	}
	if (k == 1) {					    //递归终止条件:找到了			
		LinkList* p = L;
		L = L->next;
		delete p;
		return true;
	}
	DeleteList_K(L->next, k - 1);		//递归到下一层
}

//删除第一个遇到的x元素节点
bool DeleteList_one(LinkList*& L, ElemType e)
{
	if (L == NULL) return false;  //递归终止条件
	if (L->data == e) {     //找到第一个,删除,然后马上递归进入下一层
		LinkList* p = L;
		L = L->next;
		delete p;
		return true;
	}
	else {
		DeleteList_one(L->next, e);  //否则,直接递归进入下一层

	}
}

//删除数值为x的所有数据结点
void DeleteList_all(LinkList*& L, ElemType e)
{
	if (L == NULL) return ;  //递归终止条件
	if (L->data == e) {     //找到第一个,删除,然后马上递归进入下一层
		LinkList* p = L;
		L = L->next;
		delete p;
		DeleteList_all(L, e);
	}
	else {
		DeleteList_all(L->next, e);  //否则,直接递归进入下一层

	}
}

//输出链表的最大值元素
int MaxList(LinkList* L)
{
	if (L == NULL) return INI_MIN;  //设定一个极小值用于max的求解
	return max(L->data, MaxList(L->next));
}

//输出链表的最小值
int MinList(LinkList* L)
{
	if (L == NULL)return INI_MAX;
	return min(L->data, MinList(L->next));
}

//查找数值为x的数据结点在当前链表出现的位置
int FindList(LinkList* L, ElemType e, int k)
{
	if (L == NULL) {
		return -1;
	}
	if (L->data == e) return k;
	return FindList(L->next,e, k + 1);
}

//销毁单链表
void DestroyList(LinkList*& L)
{
	if (L == NULL) return;  //递归终止条件
	DestroyList(L->next);   //递归到下一层,确保从链表的尾部开始删除元素
	delete L;          
	L = NULL;				
}

/*---------------------------------------------------------------------递归实现单链表的操作集-------------------------------------------------------------------------------------*/

主函数描述 

int main()
{
	ElemType a[8] = { 13,15,8,4,8,3,4,8 };
	int k, e;   //操作数!!
	LinkList* L;
	InitList(L);

	cout << "1.插入数据元素结点:"<<endl;
	for (int i = 0; i < 8; i++)
		CreateList(L, a[i]);
	cout << endl;

	cout << "2.正向输出所有结点值:" << endl;
	cout << "  ";
	traverse(L);
	cout << endl;

	cout << "3.逆向输出所有结点值:" << endl;
	cout << "  ";
	traverseR(L);
	cout << endl;

	cout << "4.输出单链表中数据结点的个数:" << endl;
	cout<<"    "<<countList(L);
	cout << endl;

	cout << "5.输出第k个节点的值:" << endl;
	cout << "请输入操作数k; ";
	cin >> k;
	if (getList_K(L, k) == -1) cout << "    " << "查询失败,没有第k个节点值";
	else  cout << "    " << getList_K(L, k);
	cout << endl;

	cout << "6.在第k个位置插入e元素:" << endl;
	cout << "请输入操作数k和e: ";
	cin >> k >> e;
	if (InsertList_K(L, k, e)) cout << "    " << "成功插入!";
	else cout << "    " << "插入失败!";
	cout << endl;

	cout << "7.正向输出所有结点值:" << endl;
	cout << "  ";
	traverse(L);
	cout << endl;

	cout << "8.删除第k个节点" << endl;
	cout << "请输入操作数k:";
	cin >> k;
	if (DeleteList_K(L, k)) cout << "    " << "删除成功!";
	else cout << "    " << "删除失败!";
	cout << endl;

	cout << "9.正向输出所有结点值:" << endl;
	cout << "  ";
	traverse(L);
	cout << endl;

	cout << "10.删除值为e的第一个数据节点:" << endl;
	cout << "请输入操作数e:";
	cin >> e;
	if (DeleteList_one(L, e)) cout << "    删除成功!";
	else cout << "    删除失败!";
	cout << endl;

	cout << "11.正向输出所有结点值:" << endl;
	cout << "  ";
	traverse(L);
	cout << endl;

	cout << "12.删除值为e的全部数据节点;" << endl;
	cout << "请输入操作数e:";
	cin >> e;
	DeleteList_all(L, e);
	cout << endl;

	cout << "13.正向输出所有结点值:" << endl;
	cout << "  ";
	traverse(L);
	cout << endl;

	cout << "14.输出该链表的最大值:" << endl;
	cout << "MAX_N = " << MaxList(L);
	cout << endl;

	cout << "15.输出该链表的最大值:" << endl;
	    cout << "MIN_N = " << MinList(L);

	cout << endl;

	cout << "16.查找值为e的数据节点出现在当前链表的位置:" << endl;
	cout << "请输入操作数e:";
	cin >> e;
	if (FindList(L, e, 1) == -1)cout << "    查询失败!";
	else cout <<"    查询成功!在" << FindList(L, e, 1);
	cout << endl;

	return 0;
}

代码运行示意图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值