C++的单链表实现

简易的单链表实现

头文件:

#include<iostream>
using namespace std;
typedef int ElementType;

class LinkList

{

private:

 class Node

 {

 public:

 ElementType data;

 Node * next;

 Node():next(0) {}//默认构造函数

 Node(ElementType dataValue):data(dataValue), next(0){}//显值构造函数

 };

public:

 typedef Node * NodePointer;

 LinkList();   //构造函数

 LinkList(const LinkList & origList);//复制构造函数

 ~LinkList();  //析构函数

 void release();

 const LinkList & operator=(const LinkList & rightSide); //赋值运算符重载

 bool empty();  //链表判空

 void insert(ElementType dataVal, int index); //在链表指定位置插入节点

 void erase(int index);  //删除链表中指定位置的节点

 NodePointer search(ElementType dataVal); //查找链表中指定值的节点

 void display(ostream & out) const;//输出链表节点值

 int nodeCount();   //计算节点个数

 void reverse();      //链表反转,即尾结点变为链表第一个节点

 bool ascendingOrder();  //判断链表是否为升序排列

 void ListMerge(LinkList & templist);//链表B合并到链表A末尾

 void MergeList(LinkList & listA,LinkList & listB);//链表A和链表B合并到链表C上

 ElementType get(NodePointer temp); 

private:

 NodePointer first; //指向第一个节点的指针

 int mySize; //节点的数目

 friend ostream& operator<<(ostream& out, const LinkList& List);

friend istream& operator>>(istream& in, LinkList& List);
};

源文件:

#include<iostream>
#include"LinkList.h"
using namespace std;
ostream & operator<<(ostream & out, const LinkList& List){
	//插入运算符重载(可选做)
	LinkList::NodePointer ptr=List.first;
	while(ptr!=0){
		out<<ptr->data<<' ';
		ptr=ptr->next;
	}
	out<<endl;
	return out;
}
istream & operator>>(istream & in, LinkList &List){
	//提取运算符重载(可选做)
	ElementType x,y;//x为输入的节点个数,y为输入的值
	cout<<"请输入节点个数"<<endl;
	in>>x;
	for(int i=0;i<x;i++){
		cout<<"请输入"<<i+1<<"的值"<<endl;
		in>>y;
		List.insert(y,i);
	}
	return in;
}
LinkList::LinkList(){
	mySize = 0;
	first = 0;
}
LinkList::LinkList(const LinkList& origList){
	if(origList.mySize == 0){
		first = 0;
		mySize = 0;
		return;
	}
	this->mySize = origList.mySize;
	NodePointer ptr =  new Node(origList.first->data);
	first=ptr;
	int index=0;
	for(ptr = origList.first->next;ptr!=0;ptr=ptr->next){
		index++;
		this->insert(ptr->data,index);
	}
}
LinkList::~LinkList(){
	this->release();
}
void LinkList::release(){
		NodePointer p =first;
	while(first!=0){
		p=first;
		first=first->next;
		delete p;
	}
}
const LinkList& LinkList::operator=(const LinkList& rightSide){
	int index=0;
	if(rightSide.mySize == 0){
		first=0;
		mySize=0;
		return *this;
	}
	NodePointer ptr = new Node(rightSide.first->data);
	this->first=ptr;
	this->mySize=rightSide.mySize;
	for(ptr = rightSide.first->next;ptr!=0;ptr=ptr->next){
		index++;
		this->insert(ptr->data,index);
	}
	return *this;
}
bool LinkList::empty(){
	if(mySize) return 1;
	else return 0;
}
void LinkList::insert(ElementType dataVal,int index){
	NodePointer ptr=new Node(dataVal);
	if(index>mySize+1){
		cout<<"LinkList out of list"<<endl;
	}else if(index==0){
		mySize++;
		first=ptr;
	}else if(index==mySize){
		mySize++;
		NodePointer ptr2=first;
		while(ptr2->next!=0){
			ptr2=ptr2->next;
		}
		ptr->next=ptr2->next;
		ptr2->next=ptr;
	}//在中间插入
	else{
		int size=0;
		NodePointer ptr2=first;
		while(size!=index-1){
			size++;
			ptr2=ptr2->next;
		}
		ptr->next=ptr2->next;
		ptr2->next=ptr;
	}
}
void LinkList::erase(int index){
	NodePointer predptr = first;
	if(first!=0){
		cout<<"LinkList empty"<<endl;
		return;
	}
	if(index >mySize){
		cout<<"LinkList out of list"<<endl;
		return;
	}
	if(index == 0){
		NodePointer ptr=first;
		first = first->next;
		mySize--;
		delete ptr;
	}else{
		int index2=0;
		for(predptr=first;predptr!=0;predptr=predptr->next){
			index2++;
			if(index2 ==index){
				mySize--;
				NodePointer ptr =predptr->next;
				predptr->next=ptr->next;
				delete ptr;
			}
		}
	}
}
LinkList::NodePointer LinkList::search(ElementType dataVal){
	NodePointer ptr=first;
	while(ptr!=0){
		if(ptr->data==dataVal) return ptr;
	}
}
void LinkList::display(ostream& out) const{
	for(NodePointer ptr=first;ptr!=0;ptr=ptr->next){
		out<<ptr->data<<" ";
	}
	out<<endl;
}
int LinkList::nodeCount(){
	return mySize;
}
void LinkList::reverse(){
	LinkList list;
	list.mySize=mySize;//遍历
	NodePointer ptr=first,p2;
	while(ptr->next!=0){
		p2=new Node(ptr->data);
		p2->next=list.first;
		list.first=p2;
		ptr=ptr->next;
	}
	p2=new Node(ptr->data);
	p2->next=list.first;
	list.first=p2;
	(*this).release();
	*this=list;
}
bool LinkList::ascendingOrder(){
	NodePointer fptr=first,sptr=fptr->next;
	bool flag=1;
	while(sptr!=0){
		if(fptr->data>sptr->data){
			flag=0;
			return flag;
		}
		fptr=fptr->next;
		sptr=sptr->next;
	}
	return flag;
}
void LinkList::ListMerge(LinkList& templist){
	if(first==0){
		new(this) LinkList(templist);
	}else{
		NodePointer p2=this->first;
		while(p2->next!=0){
			p2=p2->next;
		}
		LinkList* p=new LinkList(templist);
		mySize+=templist.mySize;
		p2->next=p->first;
	}
}
void LinkList::MergeList(LinkList& A,LinkList& B){
	this->ListMerge(A);
	this->ListMerge(B);
}
ElementType LinkList::get(NodePointer temp){
	return temp->data;
}
int main(){
	LinkList ListA;
	ListA.insert(0, 0);
	ListA.insert(10, 1);
	ListA.insert(20, 2);
	ListA.insert(30, 3);
	cout << "display测试  " << endl;
	ListA.display(cout);
	ListA.insert(25, 3);
	cout << "插入测试" << '\n' << ListA << endl;
	if (ListA.empty()) cout << "链表非空" << endl;
	else cout << "链表为空" << endl;
	ListA.erase(1);
	cout << "删除测试" << '\n' << ListA << endl;
	cout << "节点个数  " << ListA.nodeCount() << endl;
	ListA.reverse();
	cout << "反转测试  " << ListA << endl;
	if (ListA.ascendingOrder()) cout << "升序" << endl;
	else cout << "非升序" << endl;
	cout << "查找指定值测试" << '\n' << ListA.get(ListA.search(30)) << endl;
	LinkList ListB;
	cin >> ListB;
	ListA.ListMerge(ListB);
	cout << "合并测试  " << ListA << endl;
	LinkList ListC;
	cin >> ListC;
	ListA.MergeList(ListC, ListB);
	cout << "3个合并测试  " << ListA << endl;

	return 0;

 


截止2022/10/14,该代码段的

计算链表节点数 有误

链表合并 有误

后续进行修复

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值