单链表及其应用
2017-11-27 18:31
127 查看
实验2 单链表及其应用
一、 将课本p61程序改为用单链表来实现,程序运行结果不变。Main函数基本不变,11个算法用单链表的操作实现。
二、 编写一个完整的单链表操作的演示程序。
要求实现以下功能:
1) 新建一个单链表:依次从键盘上输入五个整数:5,8,10,5,19。把这五个数依次保存到一个单链表中,输出遍历单链表;
2) 在屏幕上输出单链表的长度;
3) 在单链表的表头添加一个元素 56;
4) 在单链表的表尾添加一个元素 77、输出遍历单链表;
5) 删除单链表中的表头元素、输出遍历单链表;
6) 删除单链表中的表尾元素、输出遍历单链表。
7) 删除单链表中值为 5的所有元素、输出遍历单链表。
8) 编写算法实现课本p93【习题2-4】第1、2、3、4题(也可只做第3题)的功能,并在main函数中调用以上算法来验证结果是否正确。
#include<iostream>
typedef int ElemType;
struct LNode
{
ElemType data;
LNode* next;
};
void InitList(LNode* &HL)
{
HL = NULL;
}
void ClearList(LNode*& HL)
{
LNode *cp;
for (cp = HL; cp != NULL; cp = cp->next)
delete cp;
HL = NULL;
}
int LenthList(LNode* HL)
{
int i = 0;
while (HL != NULL)
{
i++;
HL = HL->next;
}
return i;
}
bool EmptyList(LNode* HL)
{
return HL == NULL;
}
ElemType GetList(LNode* HL, int pos)
{
LNode* cp;
if (pos < 1)
{
std::cerr << "pos is out range!" << std::endl;
exit(1);
}
int i = 0;
for (cp = HL; cp != NULL; cp = cp->next)
{
i++;
if (i == pos) break;
}
if (cp != NULL)
return cp->data;
else
{
std::cerr << "pos is out range!" << std::endl;
exit(1);
}
}
void TraverseList(LNode* HL)
{
LNode* cp;
for (cp = HL; cp != NULL; cp = cp->next)
std::cout << cp->data << " ";
std::cout << std::endl;
}
bool FindList(LNode* HL, ElemType& item)
{
LNode* cp;
for (cp = HL; cp != NULL; cp = cp->next)
if (item == cp->data)
{
item = cp->data;
return true;
}
return false;
}
bool UpdateList(LNode* HL, const ElemType& item)
{
LNode* cp;
for (cp = HL; cp != NULL; cp = cp->next)
if (item == cp->data)
{
cp->data = item;
return true;
}
return false;
}
bool InsertList(LNode* &HL, ElemType item, int pos)
{
if (pos < -1)
{
std::cout << "pos值无效!" << std::endl;
return false;
}
LNode* newptr;
newptr = new LNode;
newptr->data = item;
LNode* cp = HL;
LNode* ap = NULL;
if (pos == 0)
{
for (; cp != NULL; ap = cp, cp = cp->next)
if (item < cp->data) break;
}
else if (pos == -1)
for (; cp != NULL; ap = cp, cp = cp->next)
{
;
}
else
{
int i = 0;
for (; cp != NULL;ap=cp,cp = cp->next)
{
i++;
if (i == pos) break;
}
if (cp == NULL&&i + 1 < pos)
{
std::cout << "pos值超出单链表长度加一!" << std::endl;
return false;
}
}
if (ap == NULL)
{
newptr->next = HL;
HL = newptr;
}
else
{
newptr->next = cp;
ap->next = newptr;
}
return true;
}
bool DeleteList(LNode* &HL, ElemType& item, int pos)
{
if (HL == NULL)
{
std::cerr << "单链表为空,删除操作无效!" << std::endl;
return false;
}
if (pos < -1)
{
std::cout << "pos值无效!" << std::endl;
return false;
}
LNode* cp = HL;
LNode* ap = NULL;
if (pos == 0)
{
for (; cp != NULL; ap=cp,cp = cp->next)
{
if (item == cp->data) break;
}
if (cp == NULL)
{
std::cout << "单链表中没有相应的结点可删除!" << std::endl;
return false;
}
}
else if (pos == -1)
for (; cp->next!= NULL;ap=cp, cp = cp->next)
{
;
}
else
{
int i = 0;
for (; cp != NULL; ap=cp,cp = cp->next)
{
i++;
if (i == pos) break;
}
if (cp == NULL)
{
std::cout << "pos值无效!" << std::endl;
return false;
}
}
if (ap == NULL)
HL = HL->next;
else ap->next = cp->next;
delete cp;
return true;
}
void SortList(LNode* &HL)
{
LNode* SL;
InitList(SL);
LNode* r = HL;
while (r != NULL)
{
LNode* t = r->next;
LNode* cp = SL;
LNode* ap = NULL;
for (; cp != NULL; ap = cp, cp = cp->next)
if (r->data < cp->data) break;
if (ap == NULL)
{
r->next = SL;
SL = r;
}
else
{
r->next = cp;
ap->next = r;
}
r = t;
}
HL = SL;
}
void nixu(LNode* &HL)
{
LNode*p, *q;
p = HL;
HL = NULL;
while (p != NULL)
{
q = p;
p = p->next;
q->next = HL;
HL = q;
}
}
ElemType maxitem(LNode* HL)
{
LNode* cp;
ElemType max = HL->data;
for (cp = HL; cp != NULL; cp = cp->next)
if (max < cp->data)
max = cp->data;
return max;
}
int jiedian(LNode* HL,ElemType x)
{
LNode* cp;
int i = 0;
for (cp = HL; cp != NULL; cp = cp->next)
if (cp->data == x)
i++;
return i;
}
void main()
{
int a[12], i, x;
int item = 5;
LNode *L;
InitList(L);
for (i = 0; i < 5; i++)
{
std::cin >> a[i];
InsertList(L, a[i], i + 1);
}
TraverseList(L);
std::cout << "表长为:" << LenthList(L) << std::endl;
std::cout << "在表头添加一个元素56:";
InsertList(L, 56, 1);
TraverseList(L);
std::cout << "在表尾添加一个元素77:";
InsertList(L, 77, -1);
TraverseList(L);
std::cout << "删除表头元素:";
DeleteList(L, x, 1);
TraverseList(L);
std::cout << "删除表尾元素:";
DeleteList(L, x, -1);
TraverseList(L);
std::cout << "删除表中所有值为5的元素:";
for (i = 0; i < 2; i++)
DeleteList(L, item, 0);
TraverseList(L);
nixu(L);
std::cout << "逆序链接后的单链表:" ;
TraverseList(L);
std::cout << "单链表中最大的元素为:" << maxitem(L) << std::endl;
std::cout << "请输入定值x结点个数:";
std::cin >> x;
std::cout << "单链表中值为x结点个数为:" << jiedian(L,x) << std::endl;
system("pause");
}
相关文章推荐
- 单链表的基本操作及其应用(实验2.1)
- 链表的改进及其应用
- 单链表及其应用
- 链表及其应用3————一元多项式的运算
- 【每日算法】归并排序及其应用(逆序对&合并有序链表)
- C语言----链表及其应用
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- 单向链表及其应用(C语言)
- 数据结构————链表及其简单应用2
- 双链表的基本使用及其应用(实验2.2)
- 数据结构————链表及其简单应用
- 数据结构代码补全-C版-链表及其应用
- 单链表的基本操作及其应用(实验2.1)
- 排序不等式、证明及其应用
- 图遍历算法及其应用
- 常用设计模式及其应用场景
- 深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用
- 一道 SQL 题 ... (关于树型结构的在关系表中的存储及其应用处理)
- 数据结构试验-栈的实现及其应用
- 第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析