(数据结构复习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;
}
实验样例