您的位置:首页 > 其它

单链表及其应用

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: