例:编写一个程序依次实现如下功能:
(1)让计算机产生出20个0一9之间的随机整数并依次保存到单链表中;
(2)输出遍历单链表;
(3)从单链表中删除与给定值相等的所有结点;
(4)输出遍历单链表;
(5)输出单链表的长度。
由独立结点构成的单链表
.h文件:
/*由独立结点构成的单链表*/
//初始化
void InitList(LNode* &HL)
{
HL = NULL;
}
//清空单链表
void ClearList(LNode* &HL)
{
LNode *cp,*np; //cp:current pointer; np: next pointer
cp = HL;
while(cp != NULL) //遍历
{
np = cp->next;
delete np;
cp = np;
}
HL = NULL;
}
//得到单链表的长度
int ListSize(LNode* &HL)
{
LNode *p = HL;
int i = 0;
while(p != NULL)
{
i++;
p = p->next;
}
return i;
}
//检查单链表是否为空
int ListEmpty(LNode* &HL)
{
return (HL == NULL);
}
//得到单链表中指定位置的元素
ElemType GetElem(LNode* &HL, int pos)
{
if(pos < 1)
{
cerr<<"pos is out of range!"<<endl;
exit(1);
}
LNode *p = HL;
int i = 0; //统计已遍历的结点数
while(p != NULL)
{
i++;
if(i == pos)
break;
p = p->next;
}
if(p != NULL)
return p->data;
else
{
cerr<<"pos is out of range!"<<endl;
exit(1);
}
}
//遍历单链表并打印
void TraverseList(LNode* &HL)
{
LNode *p = HL;
while(p != NULL)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
//从单链表中查找具有给定值的第一个元素
int Find(LNode* HL, ElemType &item)
{
LNode *p = HL;
while(p != NULL)
{
if(p->data == item)
{
item = p->data;
return 1;
}
else
p = p->next;
}
return 0;
}
//更新单链表中具有给定值的第一个元素
int Update(LNode* &HL, const ElemType &item)
{
LNode *p = HL;
while(p != NULL)
{
if(p->data == item)
break;
else
p = p->next;
}
if(p == NULL)
return 0;
else
{
p->data = item;
return 1;
}
}
//向单链表的末尾添加一个元素
void InsertRear(LNode* &HL, const ElemType &item)
{
LNode *newptr;
newptr = new LNode; //为保存新元素分配动态结点
if(newptr == NULL)
{
cerr<<"Memory allocation failare!"<<endl;
exit(1);
}
newptr->data = item;
newptr->next = NULL;
if(HL == NULL)
HL = newptr;
else
{
LNode *p = HL;
while(p->next != NULL) //从表头开始遍历到最后一个结点为止
p = p->next;
p->next = newptr; //把新结点链接到表尾
}
}
//向单链表的表头插入一个元素
void InsertFront(LNode* &HL, const ElemType &item)
{
LNode *newptr;
newptr = new LNode;
if(newptr == NULL)
{
cerr<<"Memory allocation failare!"<<endl;
exit(1);
}
newptr->data = item;
newptr->next = HL;
HL = newptr;
}
//向单链表中满足条件的位置插入一个元素
void Insert(LNode* &HL, const ElemType &item)
{
LNode *newptr;
newptr = new LNode;
if(newptr == NULL)
{
cerr<<"Memory allocation failare!"<<endl;
exit(1);
}
newptr->data = item;
LNode *cp,*ap; //ap:ahead pointer前驱结点
cp = HL;
ap = NULL;
while(cp != NULL)
{
if(item < cp->data)
break;
else
{
ap = cp;
cp = cp->next;
}
}
if(ap == NULL)
{
newptr->next = HL;
HL = newptr;
}
else
{
newptr->next = cp;
ap->next = newptr;
}
}
//从单链表中删除表头元素
ElemType DeleteFront(LNode* &HL)
{
if(HL == NULL)
{
cerr<<"Deleting from an empty list!"<<endl;
exit(1);
}
LNode *p = HL;
HL = HL->next;
ElemType temp = p->data;
delete p;
return temp;
}
//从单链表中删除等于给定值的第一个元素
int Delete(LNode* &HL, const ElemType &item)
{
if(HL == NULL)
{
cerr<<"HL is NULL"<<endl;
exit(1);
}
LNode *ap,*cp;
ap = NULL;
cp = HL;
while(cp != NULL)
{
if(item == cp->data)
break;
else
{
ap = cp;
cp = cp->next;
}
}
if(cp == NULL)
{
cerr<<"Deleted element is not exist!"<<endl;
return 0;
}
if(ap == NULL)
HL = HL->next;
else
ap->next = cp->next;
delete cp;
return 1;
}
//单链表排序
/*
假定待排序的n个数据存在于一维数组a[n]中,当利用单链表进行排序时,
从空的单链表开始,每次调用Insert算法向单链表中插入数组中的一个元素
*/
void LinkSort(ElemType a[], int n)
{
LNode *head = NULL;
int i;
for(i = 0; i < n; i++)
{
Insert(head,a[i]);
}
LNode *p = head;
i = 0;
while(p != NULL)
{
a[i++] = p->data;
p = p->next;
}
ClearList(head);
}
.cpp文件:
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
struct LNode
{
ElemType data;
LNode *next;
};
#include "LinearList.h"
int main()
{
LNode *head;
InitList(head);
for(int i = 0; i < 20; i++)
{
int j = rand() % 10;
InsertRear(head,j);
}
//输出遍历单链表
TraverseList(head);
//从单链表中删除与键盘输入的值相等的所有结点
cout<<"输入一个0~9之间的整数:";
int temp,flag = 0;
while(flag == 0)
{
cin>>temp;
while(Delete(head,temp))
{
flag = 1;
}
if(flag == 1)
cout<<"已删除完毕!"<<endl;
else
cout<<"输入数据不正确,请重新输入一个0~9之间的整数:";
}
//输出遍历单链表
TraverseList(head);
//输出单链表长度
cout<<ListSize(head)<<endl;
return 0;
}