加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

《数据结构》线性表:链式存储结构实现示例代码二(插入、删除、

发布时间:2021-05-23 08:41:32 所属栏目:安全 来源:网络整理
导读:? 本例,以班级学生成绩为例,实现顺序表的链式存储结构的操作功能实现。 #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( );                  //显示链表中所有元素
}
大家分析一下程序运行结果吧。可以尝试将其改成其它具体数据类型。比如说,将学生信息加上学号等信息。

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!