0
点赞
收藏
分享

微信扫一扫

数据结构-单链表的基本操作代码实现

夕颜合欢落 2022-01-06 阅读 70

(数据结构复习day2)

#include <iostream>
using namespace std;

typedef int ElemType;
typedef struct LNode {
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;

bool InitList(LinkList& L);//链表初始化
bool EmptyList(LinkList L);//判断链表是否为空
bool CreateList(LinkList& L);//创建链表,给链表赋值
bool CreateList(LinkList& L, int n);//另一种创建方法,赋值个数为n
bool ListInsert(LinkList& L, int i, ElemType e);//在链表第i位插入元素e
bool ListRemove(LinkList& L, int i, ElemType& e);//删除链表第i位的元素,并用e返回
bool ListRemoveElem(LinkList& L, ElemType e);//删除链表中第一次出现的元素e
bool Insert_Next(LNode* node, ElemType e);//在node结点后插入元素e
int LengthList(LinkList L);//返回链表长度
bool PriorElem(LinkList L, ElemType e, ElemType& Pre);//查询元素e的前驱,并用Pre返回
bool NextElem(LinkList L, ElemType e, ElemType& Ne);//查询元素e的后继,并用Ne返回
void TraverseList(LinkList L);//遍历链表
void ClearList(LinkList& L);//清空链表
void DestoryList(LinkList& L);//销毁链表
bool GetElem(LinkList L, int i, ElemType& e);//查询链表第i位的元素,并用e返回
int LocateElem(LinkList L, ElemType e);//返回元素e在链表中第一次出现的位置
bool InvertList(LinkList& L);//链表逆置

bool InitList(LinkList& L) {
	L = new LNode;
	if (!L)return 0;
	L->next = NULL;
	return 1;
}
bool EmptyList(LinkList L) {
	if (L->next == NULL)
		return 1;
	return 0;
}
bool CreateList(LinkList& L) {
	LNode* temp;
	LNode* p = L;
	while (1) {
		temp = new LNode;
		if (!temp)return 0;
		cin >> temp->data;
		if (temp->data == -1)
			break;
		temp->next = p->next;
		p->next = temp;
		p = temp;
	}
	return 1;
}
bool CreateList(LinkList& L, int n) {
	cout << "请输入" << n << "个元素:" << endl;
	LNode* temp;
	LNode* p = L;
	for (int i = 0; i < n; i++) {
		temp = new LNode;
		if (!temp)return 0;
		cin >> temp->data;
		temp->next = p->next;
		p->next = temp;
		p = temp;
	}
	return 1;
}
bool ListInsert(LinkList& L, int i, ElemType e) {
	if (i<1 || i>LengthList(L) + 1)
		return 0;
	LNode* p = L;
	if (!p)return 0;
	for (int j = 0; j < i - 1; j++)
		p = p->next;
	Insert_Next(p, e);//在第i-1个结点后插入元素e
	return 1;
}
bool ListRemove(LinkList& L, int i, ElemType& e) {
	if (i<1 || i>LengthList(L))
		return 0;
	LNode* p = L;
	for (int j = 0; j < i - 1; j++)
		p = p->next;
	LNode* p_Pr = p;//p的前驱
	LNode* p_Ne = p->next->next;//p的后继
	p_Pr->next = p_Ne;
	return 1;
}
bool ListRemoveElem(LinkList& L, ElemType e) {
	int i = LocateElem(L, e);
	if (i == -1)return 0;
	ElemType temp;
	if (ListRemove(L, i, temp))
		return 1;
	else
		return 0;
}
bool Insert_Next(LNode* node, ElemType e) {
	LNode* p = node;
	LNode* newnode = new LNode;
	if (!newnode)return 0;
	newnode->data = e;
	newnode->next = p->next;
	p->next = newnode;
	return 1;
}
int LengthList(LinkList L) {
	if (EmptyList(L))
		return 0;
	LNode* p = L->next;
	int length = 0;
	while (p) {
		length++;
		p = p->next;
	}
	return length;
}
bool PriorElem(LinkList L, ElemType e, ElemType& Pre) {
	int i = LocateElem(L, e);
	if (i == -1 || i == 1)return 0;
	LNode* p = L->next;//第一个结点
	for (int j = 1; j < i - 1; j++)
		p = p->next;
	Pre = p->data;
	return 1;
}
bool NextElem(LinkList L, ElemType e, ElemType& Ne) {
	int i = LocateElem(L, e);
	if (i == -1 || i == LengthList(L))return 0;
	LNode* p = L->next;//第一个结点
	for (int j = 1; j < i + 1; j++)
		p = p->next;
	Ne = p->data;
	return 1;
}
void TraverseList(LinkList L) {
	LNode* p = L->next;
	while (p) {
		cout << p->data << "  ";
		p = p->next;
	}
}
void ClearList(LinkList& L) {
	L->next = NULL;
}
void DestoryList(LinkList& L) {
	ClearList(L);
	delete L;
}
bool GetElem(LinkList L, int i, ElemType& e) {
	if (i<1 || i>LengthList(L))return 0;
	LNode* p = L->next;//第一个结点
	if (!p)return 0;
	for (int j = 1; j < i; j++)
		p = p->next;
	e = p->data;
	return 1;
}
int LocateElem(LinkList L, ElemType e) {
	int pos = 0;
	LNode* p = L->next;
	if (!p)return -1;
	while (p) {
		pos++;
		if (p->data == e)
			return pos;
		p = p->next;
	}
	return -1;
}
bool InvertList(LinkList& L) {
	//方法1
	//LNode* p = L->next;//第一个结点
	//LNode* q = L->next;
	//int n = LengthList(L);
	//for (int i = 0; i < n; i++) {
	//	q = q->next;
	//}//q是最后一个节点
	//while (p < q) {
	//	ElemType temp;
	//	temp = p->data;
	//	p->data = q->data;
	//	q->data = temp;
	//}
	//return 1;

	//方法2 将链表清空后按头插法插入
	LNode* p = L->next;//第一个结点
	L->next = NULL;
	int head = 1;
	while (p) {
		if (!ListInsert(L, head, p->data))
			return 0;
		p = p->next;
	}
	return 1;
}

int main()
{
	LinkList L;
	int n, i;
	ElemType e;
	if (InitList(L))
		cout << "初始化线性表成功" << endl;
	else
	{
		cout << "初始化线性表失败" << endl;
		return 1;
	}
	cout << "输入线性表的元素个数:";
	cin >> n;
	if (n > 0) {
		if (!CreateList(L,n)) {
			cout << "线性表创建失败" << endl;
			return 2;
		}
	}
	if (EmptyList(L)) //检验线性表是否为空
		cout << "线性表为空" << endl;
	else {
		cout << "线性表不为空" << endl;
		cout << "线性表的元素个数为" << LengthList(L) << endl;//查询线性表中元素个数
		cout << "线性表的元素为:";
		TraverseList(L); //遍历
		cout << endl;
	}
	//查询指定位序元素
	cout << "请输入要查询的线性表的位序:" << endl;
	cin >> i;
	if (GetElem(L, i, e))
		cout << "线性表中第" << i << "个元素为" << e << endl;
	else
		cout << "位序越界" << endl;
	//查询元素在线性表中的位序 
	cout << "请输入要查询的元素:" << endl;//查询指定元素位序
	cin >> e;
	int orderID = LocateElem(L, e);
	if (orderID != -1)
		cout << "线性表中元素" << e << "为第" << orderID << "个" << endl;
	else
		cout << "输入元素未在表中" << endl;
	//查找前驱	
	cout << "请输入要查询前驱的元素:" << endl;
	cin >> e;
	ElemType Pre;
	if (PriorElem(L, e, Pre))
		cout << "线性表中元素" << e << "的前驱为" << Pre << endl;
	else
		cout << "未在表中找到前驱" << endl;
	//查找后继
	cout << "请输入要查询后继的元素:" << endl;
	cin >> e;
	ElemType Ne;
	if (NextElem(L, e, Ne))
		cout << "线性表中元素" << e << "的后继为" << Ne << endl;
	else
		cout << "未在表中找到后继" << endl;
	//测试在链表的第i个元素前插入元素e 
	cout << "请输入线性表插入元素的位序及插入元素值:" << endl;//查询指定位序元素
	cin >> i >> e;
	if (ListInsert(L, i, e)) {
		cout << "线性表插入元素成功" << endl;
		cout << "线性表中元素个数为" << LengthList(L) << endl;//查询线性表中元素个数
		cout << "线性表的元素为:";
		TraverseList(L);//遍历
		cout << endl;
	}
	else
		cout << "线性表插入元素失败" << endl;
	//删除L中第m个元素 
	if (!EmptyList(L)) {
		cout << "请输入删除元素的位序:" << endl;//查询指定位序元素
		cin >> i;
		if (ListRemove(L, i, e)) {
			cout << "线性表删除元素成功" << endl;
			cout << "线性表中元素个数为" << LengthList(L) << endl;//查询线性表中元素个数
			cout << "线性表的元素为:";
			TraverseList(L); //遍历
			cout << endl;
		}
		else
			cout << "删除失败" << endl;
	}
	//删除L中的元素 e
	if (!EmptyList(L)) {
		cout << "请输入删除元素:" << endl;//查询指定位序元素
		cin >> e;
		if (ListRemoveElem(L, e)) {
			cout << "线性表删除元素成功" << endl;
			cout << "线性表中元素个数为" << LengthList(L) << endl;//查询线性表中元素个数
			cout << "线性表的元素为:";
			TraverseList(L); //遍历
			cout << endl;
		}
		else
			cout << "删除元素未在表中" << endl;
	}
	//逆置线性表
	InvertList(L);
	if (!EmptyList(L)) {
		cout << "线性表已逆置" << endl;
		cout << "线性表中元素个数为" << LengthList(L) << endl;//查询线性表中元素个数
		cout << "线性表的元素为:";
		TraverseList(L); //遍历
		cout << endl;
	}
	//清空线性表 
	ClearList(L);
	if (EmptyList(L)) {
		cout << "线性表已置空" << endl;
	}
	//销毁线性表 
	DestoryList(L);
	cout << "线性表已销毁" << endl;
	return 0;
}

实验样例

 

举报

相关推荐

0 条评论