第六周总结

模板(了解)
模板函数:在重载函数过程中,功能相似但形参或返回值不同时,通过使用模板定义一个具有通用功能的函数,同时支持不同的参数和返回值。(利用已知函数进行函数的重载)
模板类:当类包含不确定的成员变量,或成员函数的返回类型、形参的类型不确定时,用模板类来解决。
格式:模板类名<模板参数> 对象名1,对象名2,……对象名(需在类前声明加上模板标志)

线性表
逻辑结构:任意一对相邻的数据元素之间存在序偶关系,且称ai-1为ai的前驱,ai为ai-1的后继。其中a1无前驱,an无后继,除此之外每个元素有且仅有一个前驱和一个后继。

顺序表:线性表的顺序存储结构,用一段连续的地址依次存储线性表的数据元素(一维数组)

基本操作:
1、初始化:设置length为0.
2、建立顺序表:

template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
    if(n>MaxSize) throw "wrong parameter";
    for(int i=0;i<n;i++)
        data[i]=a[i];
    length=n;
}

3、销毁数据表:析构函数
4、判空:判断length是否为0
5、求顺序表长度:返回length的值
6、历遍:按下标依次输出各元素

template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
    for(int i=0;i<length;i++)
        cout<<data[i]<<"\t";
    cout<<endl;
}

7、按位查找:

template <class DataType>
DataType SeqList<DataType>::Get(int i)
{
    if(i<1 && i>length) throw "wrong Location";
    else return data[i-1];
}

8、按值查找:

template <class DataType>
int SeqList<DataType>::Locate(DataType x)
{
    for(int i=0;i<length;i++)
        if(data[i]==x) return i+1;
    return 0;
}

9、插入:

template <class DataType>
void SeqList<DataType>::Insert(int i,DataType x)
{
    if(length>=MaxSize) throw "Overflow";
    if(i<1 || i>length+1) throw "Location";
    for(int j=length;j>=i;j--)
        data[j]=data[j-1];
    data[i-1]=x;
    length++;
}

10、删除:

template <class DataType>
DataType SeqList<DataType>::Delete(int i)
{
    int x;
    if(length==0) throw "Underflow";
    if(i<1 || i>length) throw "Location";
    x = data[i-1];
    for(int j=i;j<length;j++)
        data[j-1] = data[j];
    length--;
    return x;
}

11、输出:

template <class DataType>
void SeqList<DataType>::PrintList()
{
    for(int i=0;i<length;i++)
        cout<<data[i]<<endl;
}

例子:键盘输入10个数据元素,利用顺序表的基本操作,删除表中的最大和最小的数据元素。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int MaxSize = 100;
template <class DataType>
class SeqList
{
public:
    SeqList(){length=0;}
    SeqList(DataType a[],int n);
    ~SeqList(){}
    int Length(){return length;}
    DataType Get(int i);
    int Locate(DataType x);
    void Insert(int i,DataType x);
    DataType Delete(int i);
    void PrintList();
private:
    DataType data[MaxSize];
    int length;
};

template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
    if(n>MaxSize) throw "wrong parameter";
    for(int i=0;i<n;i++)
        data[i]=a[i];
    length=n;
}

template <class DataType>
DataType SeqList<DataType>::Get(int i)
{
    if(i<1 && i>length) throw "wrong Location";
    else return data[i-1];
}

template <class DataType>
int SeqList<DataType>::Locate(DataType x)
{
    for(int i=0;i<length;i++)
        if(data[i]==x) return i+1;
    return 0;
}

template <class DataType>
void SeqList<DataType>::Insert(int i,DataType x)
{
    if(length>=MaxSize) throw "Overflow";
    if(i<1 || i>length+1) throw "Location";
    for(int j=length;j>=i;j--)
        data[j]=data[j-1];
    data[i-1]=x;
    length++;
}

template <class DataType>
DataType SeqList<DataType>::Delete(int i)
{
    int x;
    if(length==0) throw "Underflow";
    if(i<1 || i>length) throw "Location";
    x = data[i-1];
    for(int j=i;j<length;j++)
        data[j-1] = data[j];
    length--;
    return x;
}

template <class DataType>
void SeqList<DataType>::PrintList()
{
    for(int i=0;i<length;i++)
        cout<<data[i]<<endl;
}

int main()
{
    SeqList<int> p;
    int minn=INF,maxn=0,x;
    for(int i=1;i<=10;i++)
    {
        cin>>x;
        minn=min(x,minn);
        maxn=max(x,maxn);
        p.Insert(i,x);
    }
    int weizhi=p.Locate(maxn);
    p.Delete(weizhi);
    weizhi=p.Locate(minn);
    p.Delete(weizhi);
    p.PrintList();
    return 0;
}

链表:
概念:用一组任意的存储单元存储线性表的数据元素(地址可以是连续的,也可以是不连续的),包括数据域和指针域,数据域存数据,指针域指示其后继的信息。
结点结构:

template <typename DataType>
struct Node{
DataType data;        //数据域
Node<DataType> *next  //指针域

单链表实现:

template <typename DataType>
struct Node
{
	DataType data;               //数据域
    Node<DataType> *next;       //指针域
};
template <typename DataType>
class LinkList
{
public:
	LinkList( );                      //无参构造函数,建立只有头结点的空链表
	LinkList(DataType a[ ], int n);       //有参构造函数,建立有n个元素的单链表
	~LinkList( );                     //析构函数
	int Length( );                     //求单链表的长度
	int Empety();
	DataType Get(int i);               //按位查找。查找第i个结点的元素值
	int Locate(DataType x);            //按值查找。查找值为x的元素序号
	void Insert(int i, DataType x);       //插入操作,第i个位置插入值为x的结点
	DataType Delete(int i);            //删除操作,删除第i个结点
	void PrintList( );                  //遍历操作,按序号依次输出各元素
private:
	Node<DataType> *first;           //单链表的头指针
};

基本操作:
1、初始化:

template <typename DataType>
LinkList<DataType> :: LinkList( )
{
	first = new Node<DataType>;              //生成头结点
  	first->next = nullptr;                      //头结点的指针域置空
}

2、判空:判断单链表是否只有头结点,即first->next是否为空

template <typename DataType>
int LinkList<DataType> :: Empety()
{
	if(first->next == nullptr)
		return 1;
	else 
		return 0;
}

3、遍历

template <typename DataType>
void LinkList<DataType> :: PrintList( )
{
	Node<DataType> *p = first->next;                //工作指针p初始化
  	while (p != nullptr)
  	{
    	cout << p->data << "\t";
    	p = p->next;                 //工作指针p后移,注意不能写作p++
  	}
}

4、求单链表长度:

template <typename DataType>
int LinkList<DataType> :: Length( )
{
   	Node<DataType> *p = first->next;   //工作指针p初始化为开始接点
   	int count = 0;                    //累加器count初始化
   	while (p != nullptr)
   	{
    	p = p->next;
    	count++;
   	}
    return count;              //注意count的初始化和返回值之间的关系
}

5、按位查找:

template <typename DataType>  
DataType LinkList<DataType> :: Get(int i) 
{
	Node<DataType> *p = first->next;    //工作指针p初始化
	int count = 1;                     //累加器count初始化
  	while (p != nullptr && count < i)    
  	{
		p = p->next;                   //工作指针p后移
		count++;
	}
	if (p == nullptr) throw "位置";
	else return p->data;
}

6、按值查找:

template <typename DataType>  
int LinkList<DataType> :: Locate(DataType x) 
{
	Node<DataType> *p = first->next;   //工作指针p初始化
  	int count = 1;                     //累加器count初始化
  	while (p != nullptr)    
  	{
  		if (p->data == x) return count;     //查找成功,结束函数并返回序号
  		p = p->next;                   
  		count++;
  	}
  	return 0;                        //退出循环表明查找失败
}

7、插入:

template <typename DataType>  
void LinkList<DataType> :: Insert(int i, DataType x)
{
	Node<DataType> *p = first, *s = nullptr ;        //工作指针p初始化
	int count = 0;               
    while (p != nullptr && count < i - 1)            //查找第i – 1个结点
    {
    	p = p->next;                              //工作指针p后移
      	count++;
    }
    if (p == nullptr) throw "位置";        //没有找到第i – 1个结点
    else { 
      	s = new Node<DataType>; s->data = x;      //申请结点s,数据域为x
      	s->next = p->next; p->next = s;     //将结点s插入到结点p之后
    }
 }

8、构造函数-建立单链表:

template <typename DataType>  //头插法
LinkList<DataType> :: LinkList(DataType a[ ], int n)
{
	first = new Node<DataType>; first->next = nullptr;     //初始化一个空链表
	for (int i = 0; i < n; i++)
	{ 
		Node<DataType> *s;
		s = new Node<DataType>; s->data = a[i];    
 		s->next = first->next; first->next = s;    //将结点s插入到头结点之后
	}
}

9、删除:

template <typename DataType>  
DataType LinkList<DataType> :: Delete(int i)
{
	DataType x;
  	Node<DataType> *p = first, *q = nullptr;        //工作指针p指向头结点
  	int count = 0;               
  	while (p != nullptr && count < i - 1)           //查找第i-1个结点
  	{
    	p = p->next;
    	count++;
  	}
  	if (p == nullptr || p->next == nullptr)  //结点p不存在或p的后继结点不存在
  		throw "位置"; 
  	else {
   		q = p->next; x = q->data;         //暂存被删结点
   		p->next = q->next;              //摘链
   		delete q; 
   		return x;
  	}
}

10:销毁单链表:

template <typename DataType>  
DataType LinkList<DataType> :: ~Linklist()
{
	Node<DataType> *p=first;
	while(first!=nullptr) //释放每一个结点的存储空间
	{
		first=first->next; //first指向被释放结点的下一个结点
		delete p;
		p=first; //工作指针p后移
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值