《数据结构》线性表:链式存储结构实现示例代码二(插入、删除、
发布时间:2021-05-23 23:15:05 所属栏目:安全 来源:网络整理
导读:? 本例,以班级学生成绩为例,实现顺序表的链式存储结构的操作功能实现。 #includeiostream //引用输入输出流库函数的头文件/*************************************//***** 声明模板类 *****//***** 可以单独放在一个头文件中 *****//*******************
|
? 本例,以班级学生成绩为例,实现顺序表的链式存储结构的操作功能实现。 #include<iostream> //引用输入输出流库函数的头文件
/*************************************/
/***** 声明模板类 *****/
/***** 可以单独放在一个头文件中 *****/
/*************************************/
template <class DataType>
struct Node
{
DataType data;
Node<DataType> *next;
};
template <class DataType>
class LinkList
{
public:
LinkList( ); //构造函数,含头结点的空链表
LinkList(DataType a[ ],int n); //构造函数,建立有n个元素的单链表
~LinkList( ); //析构函数
int Locate(DataType x); //按值查找。在单链表中查找值为x的元素序号
void Insert(int i,DataType x); //插入操作,第i个位置插入元素值为x的结点
DataType Delete(int i); //删除操作,在单链表中删除第i个结点
void PrintList( ); //遍历操作,按序号依次输出各元素
private:
Node<DataType> *first; //单链表的头指针
};
/********************************/
/***** 定义模板类操作函数 *****/
/***** 可以单独放在源文件中 *****/
/********************************/
template <class DataType>
LinkList<DataType> :: LinkList( )
{
first = new Node<DataType>; //生成头结点
first->next = NULL; //头结点的指针域置空
}
template <class DataType>
LinkList<DataType> :: LinkList(DataType a[ ],int n)
{
Node<DataType> *r,*s;
first = new Node<DataType>; //生成头结点
r = first; //尾指针初始化
for (int i = 0; i < n; i++)
{
s = new Node<DataType>; s->data = a[i]; //为每个数组元素建立一个结点
r->next = s; r = s; //将结点s插入到终端结点之后
}
r->next = NULL; //单链表建立完毕,将终端结点的指针域置空
}
template <class DataType>
LinkList<DataType> :: ~LinkList( )
{
Node<DataType> *q;
while (first != NULL) //释放单链表的每一个结点的存储空间
{
q = first; //暂存被释放结点
first = first->next; // first指向被释放结点的下一个结点
delete q;
}
}
template <class DataType>
void LinkList<DataType> :: Insert(int i,DataType x)
{
Node<DataType> *p = first,*s;
int count = 0; //工作指针p应指向头结点
while (p != NULL && count < i - 1) //查找第i - 1个结点
{
p = p->next; //工作指针p后移
count++;
}
if (p == NULL) throw "位置"; //没有找到第i - 1个结点
else {
s = new Node<DataType>; s->data = x; //申请一个结点s,其数据域为x
s->next = p->next; p->next = s; //将结点s插入到结点p之后
}
}
template <class DataType>
DataType LinkList<DataType> :: Delete(int i)
{
Node<DataType> *p,*q;
DataType x;
int count = 0;
p = first; //注意工作指针p要指向头结点
while (p != NULL && count < i - 1) //查找第i-1个结点
{
p = p->next;
count++;
}
if (p == NULL || p->next == NULL) //结点p不存在或p的后继结点不存在
throw "位置";
else {
q = p->next; x = q->data; //暂存被删结点
p->next = q->next; //摘链
delete q;
return x;
}
}
template <class DataType>
int LinkList<DataType> :: Locate(DataType x)
{
Node<DataType> *p = first->next;
int count = 1; //工作指针p和累加器count初始化
while (p != NULL)
{
if (p->data == x) return count; //查找成功,结束函数并返回序号
p = p->next;
count++;
}
return 0; //退出循环表明查找失败
}
template <class DataType>
void LinkList<DataType> :: PrintList( )
{
Node<DataType> *p = first->next; //工作指针p初始化
while (p != NULL)
{
cout << p->data<<" ";
p = p->next; //工作指针p后移
}
cout<<endl;
}
using namespace std;
/********************************/
/***** C++ 主函数 *****/
/***** 选定5个学生成绩 *****/
/********************************/
void main( )
{
int Score[5]={99,93,89,76,88};
LinkList<int> ScoreList(Score,5); //会执行带参构造函数
cout<<"链表数据为:"<<endl;
cout<<"执行插入操作前数据为:"<<endl;
ScoreList.PrintList( ); //显示链表中所有元素
try
{
ScoreList.Insert(2,65);
}
catch (char *s)
{
cout<<s<<endl;
}
cout<<"执行插入操作后数据为:"<<endl;
ScoreList.PrintList( ); //显示链表中所有元素
cout<<"值为76的元素位置为:";
cout<<ScoreList.Locate(76)<<endl; //查找成绩76,并返回在单链表中位置
cout<<"执行删除操作前数据为:"<<endl;
ScoreList.PrintList( ); //显示链表中所有元素
try
{
ScoreList.Delete(3); //删除第三个成绩
}
catch (char *s)
{
cout<<s<<endl;
}
cout<<"执行删除操作后数据为:"<<endl;
ScoreList.PrintList( ); //显示链表中所有元素
}
大家分析一下程序运行结果吧。可以尝试将其改成其它具体数据类型。比如说,将学生信息加上学号等信息。
(编辑:荆州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

