单链表的多文件实现

单链表:

利用new动态申请和指针来实现动态存取,再加上指针域和数据域的运用.

头文件:linklist.h

<span style="font-size:18px;">#ifndef A
#define A
template<class Datatype>
struct Node
{
	Datatype data;
	Node<Datatype>*next;
};
template<class Datatype>
class link_list
{	
   public:
		link_list();//初始化链表 
		link_list(Datatype a[],int n);//输入
		~link_list();//释放对象和new申请的内存空间
		void search1(int n);
		void search2(Datatype x);//按值查找                       
		void insert(Datatype x,int i);//插入
		void Delete1 (Datatype x);//按值删除
		void Delete2(int i);//按位删除
		void  printlist();//输入
    private:
		Node<Datatype>*first;
};
#endif</span>



实现文件:sx.CPP

<span style="font-size:18px;">#include"linklist.h"


template<class Datatype>
link_list<Datatype>::link_list()//初始化链表 
{
	first=new Node<Datatype>;///模板用new申请空间是需加上<Datatype>
	first->next=NULL;
}

template<class Datatype>
link_list<Datatype>::link_list(Datatype a[],int n)//尾插法输入///尾插法为顺序插入.头插法为逆序插入
{
  	first=new Node<Datatype>;
	Node<Datatype>*p,*s;
	p=first;
	for(int i=0;i<n;i++)
	{
		s=new Node<Datatype>;
		s->data=a[i];
		p->next=s;
		p=s;
	}
	p->next=NULL;
}

template<class Datatype>
 link_list<Datatype>:: ~link_list()//释放对象和new申请的内存空间
 {
	 while(first!=NULL)
	 {
   Node<Datatype>*p=first;//必须暂至被释放空间
   first=first->next;
   delete p;
	 }
 }

 template<class Datatype>
void link_list<Datatype>::search1(int n)//按位查找
 {
	 Node<Datatype>* p;
	 p=first->next;int count=1;//必须用p代替first;因为头结点要一直为first,为下面的程序做准备
	 while(p!=NULL && count<n)
     {
         p=p->next;
		 count++;
	 }
	 if(p==NULL)
		 cout<<"未找到第"<<n<<"个元素";
	 else
		 cout<<"第"<<n<<"个元素为"<<p->data<<endl;
 }

template<class Datatype>
void link_list<Datatype>::search2(Datatype x)//按值查找
{
      Node<Datatype>* p;
	 p=first->next;  int count=1;
	 while(p!=NULL && p->data!=x)
	 {
		 p=p->next;
		 count++;
	 }
     if(p==NULL)
		 cout<<"未找到元素"<<x;
	 else
		 cout<<x<<"为"<<"第"<<count<<"个元素"<<endl;
}

template<class Datatype>
void link_list<Datatype>::insert(Datatype x,int n)//插入到第n个元素位置
{
     Node<Datatype>* p;
	 p=first;int count=0;//p指向first,n有可能为1,空结点对应cout=0'
	 while(p!=NULL && count<n-1)
     {
         p=p->next;//第n个结点,即
		 count++;
	 }
	 if(p==NULL)
	 {
		 if(n==++count)
		 {
			 Node<Datatype>*s=new Node<Datatype>;
			 s->data=x;
			 s->next=NULL;
			 p->next=s;
			 cout<<x<<"插入到第"<<n<<"个结点成功"<<endl;
		 }
		 else
		 { cout<<"插入失败"<<endl;}

	 }
	else
	{
		Node<Datatype>*s=new Node<Datatype>;
	    s->data=x;
		s->next=p->next;
		p->next=s;
	}	cout<<x<<"插入到第"<<n<<"个结点成功"<<endl;
 }
template<class Datatype>
void link_list<Datatype>::Delete1 (Datatype x)//按值删除
{
     Node<Datatype>*s,*p;
	 p=first->next; 
	 while(p!=NULL && p->data!=x)
	 {
		 s=p;
		 p=p->next;
	 }
     if(p==NULL)
	 { cout<<"没有要删除的值"<<endl;}
	 else
	 {
		 s->next=p->next;
		 
		 cout<<x<<"所在的结点已被删除"<<endl;
	 }
}
template<class Datatype>
void link_list<Datatype>::Delete2(int n)//按位删除
{

     Node<Datatype>* p;
	 p=first;int count=0;
	 while(p!=NULL && count<n-1)
     {
         p=p->next;
		 count++;
	 }
	 if(p==NULL||p->next==NULL){cout<<"未找到第"<<n<<"个结点"<<endl;}//假若他本身是NULL;
	 else
	{
		     p->next=p->next->next;
			 cout<<"删除第"<<n<<"个元素结点成功"<<endl;
	 }
}
template<class Datatype>
void  link_list<Datatype>::printlist()//输出
{
     Node<Datatype>* p;
	 p=first->next;  
	 while(p!=NULL)
	 {
		 cout<<p->data<<'\t';
		 p=p->next;
	 }
	 cout<<endl;
}</span>
main cpp

<span style="font-size:18px;">#include<iostream>
using namespace std;
#include"linklist.h"
#include"sx.cpp"        
int main()        
{
	
	int n=5,a[5];
	cout<<"请输入5个整数:"<<'\t';
	for(int i=0;i<5;i++)
		cin>>a[i];
    link_list<int> g1;  
	link_list<int> g2(a,n);

	cout<<"查找第4个元素-->"<<'\t';
         g2.search1(4);

		 cout<<"输出所有元素-->"<<'\t';
		 g2.printlist();

	cout<<"查找元素9-->"<<'\t';
		 g2.search2(9);

    cout<<"在第4个位置中插入元素6-->"<<'\t';
		 g2.insert(6,4);

		 cout<<"输出所有元素-->"<<'\t';
		 g2.printlist();

	 cout<<"删除元素11-->"<<'\t';
	    g2.Delete1 (11);

		cout<<"输出所有元素-->"<<'\t';
		 g2.printlist();

		cout<<"删除第5个元素-->"<<'\t';
		 g2.Delete2(5);

    cout<<"输出所有元素-->"<<'\t';
		 g2.printlist();
		return 0;
}
</span>
调试结果:


总结: 复习了多文件结构,初步掌握了单链表的实现.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值