数据结构实验二:单链表

上课没听,现学现卖
😅
实验二:实现单链表各种基本运算的算法
内容:编写程序实现单链表各种基本运算,并编写main方法测试程序可行性。主要完成以下功能:
1、 初始化单链表;
2、 一次采用尾插法插入a、b、c、d、e元素;
3、 输出单链表;
4、 输出单链表长度;
5、 判断单链表是否为空;
6、 输出单链表的第3个元素;
7、 输出元素d的位置;
8、 在第4个元素位置上插入f元素;
9、 输出插入后的单链表;
10、 删除单链表中的第2个元素;
11、 输出删除后的单链表;
12、 (选做)单链表“原地”逆转,要求算法空间复杂度为O(1)。

PS:12不会,那位大神可以教教我吗???

#include<iostream>
using namespace std;

typedef struct LNode {
	int date;
	struct LNode* next;
}LNode, * LinkList;
//LinkList与LNode*二者本质上是等价的
LinkList r, p, s;
int n;

bool InitList(LinkList& L) {
	L = new LNode;
	L->next = NULL;
	return 1;
}

void CreatList_R(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;
	r = L;
	for (int i = 0; i < n; i++) {
		p = new LNode;
		cin >> p->date;
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

bool GetElem(LinkList L, int i, int& e) {
	p = L->next; int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p || j > i) return 0;
	e = p->date;
	return 1;
}

bool Judge(LinkList L) {
	if (L->next == NULL) return 0;
	return 1;
}

LNode* LocateElem(LinkList L, int e) {
	p = L->next;
	while (p && p->date != e) p = p->next;
	return p;
}

bool ListInsert(LinkList& L, int i, int e) {
	p = L; int j = 0;
	while (p && j < i - 1) {
		p = p->next;
		j++;
	}
	if (!p || j > i - 1) return 0;
	s = new LNode;
	s->date = e;
	s->next = p->next;
	p->next = s;
	return 1;
}

bool ListDelete(LinkList& L, int i) {
	p = L; int j = 0;
	while (p->next && j < i - 1) {
		p = p->next; j++;
	}
	if (!p->next || j > i - 1) return 0;
	s = p->next;
	p->next = s->next;
	delete s;
	return 1;
}

void print(LinkList L, int num) {
	int tmp = 0;
	for (int i = 1; i <= n; i++) {
		GetElem(L, i, tmp);
		cout << tmp << " ";
	}
	cout << endl << "----------------" << endl << endl;
}

int main() {
	LNode* list;

	cout << "创建单链表" << endl;
	if (InitList(list)) cout << "创建成功" << endl;
	cout << "-----------------" << endl << endl;

	cout << "你要输入几个元素?" << endl;
	cin >> n;
	cout << "请依次输入元素,中间用空格隔开" << endl;
	CreatList_R(list, n);
	cout << "-----------------" << endl << endl;

	cout << "输出单链表" << endl;
	print(list, n);

	cout << "单链表长度为" << n << endl;
	cout << "-----------------" << endl << endl;

	cout << "判断单链表是否为空" << endl;
	if (Judge(list)) cout << "不为空" << endl;
	else cout << "为空" << endl;
	cout << "-----------------" << endl << endl;

	cout << "输出单链表第3个元素" << endl;
	if (n < 3) cout << "第3个元素不存在" << endl;
	else {
		int tmp = 0;
		GetElem(list, 3, tmp);
		cout << "第3个元素为" << tmp << endl;
	}
	cout << "-----------------" << endl << endl;

	cout << "你想找哪个元素的地址?请输入此元素" << endl;
	int d; cin >> d;
	cout << LocateElem(list, d) << endl;//这里
	cout << "-----------------" << endl << endl;

	cout << "在第4个元素位置上插入f元素,请输入f" << endl;
	int f; cin >> f; 
	n++;
	if (ListInsert(list, 4, f)) cout << "插入成功" << endl;
	else cout << "插入失败" << endl;
	cout << "-----------------" << endl << endl;

	cout << "输出插入后的单链表" << endl;
	print(list, n);

	cout << "删除单链表中第2个元素" << endl;
	n--;
	if (ListDelete(list, 2)) cout << "删除成功" << endl;
	else cout << "删除失败" << endl;
	cout << "-----------------" << endl << endl;

	cout << "输出删除后的单链表" << endl;
	print(list, n);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值