链表

#include<iostream>
using namespace std;
typedef struct linkNode{
	int data ;
	linkNode *next;
}*link,Node;
class LinkList{
	public:
		LinkList(){
		this->head =linkInit();
		}
		link linkInit();//初始化链表 
		void headInsert();//头插法 
		void tailInsert();//尾插法 
		void insert(int x);//尾部插入一个结点 
		int isEmpty();//判空 
		int deleteMax();//删除最大值
		void deleteRepeat();//删除重复值 
		void print(link head);//打印链表  
		void Reverse();//链表逆置  
		link linkCopy();//拷贝链表 
		link getHead();//获取头指针 
		void LinkSort();//排序 
		void searchLastk(int k);//查找倒数第k个元素(一次遍历)
		int getLength();
//		link oddEvenList();
	private:
	link head;	
}; 
int LinkList::getLength(){
	int length = 0;
	while(head->next!=NULL)  {
		head = head->next;
		length++;
	}
	return length;
}
link LinkList::getHead(){
	return this->head;
}

link  LinkList::linkInit(){ //初始化链表 
	head = new linkNode;
	head->data = -1;
	head->next = NULL; 
	return head;
}
void  LinkList::headInsert(){ //头插法 
	
	int x;
	cin>>x;
	while(x!=9999){
		link p = new linkNode;
		p->data = x;
		p->next = head->next ;
		head->next = p;
		cin>>x;
		 
	}	 

}
void  LinkList::tailInsert(){ //尾插法 
	int x;
	link tail = head;
	cin>>x;
	while(x!=9999){
		while(tail->next!=NULL)
		tail = tail->next;
		
	
	if(tail->next==NULL){
		link p =new linkNode;
		p->data = x;
		p->next = NULL;
		tail->next = p;
		tail = p;
	}
	cin>>x; 
	}
} 
void LinkList::insert(int x){ //尾部插入一个结点 
	link tail = head;
	while(tail->next!=NULL)
		tail = tail->next;
	link s = new Node;
	tail->next = s;
	s->data = x;
	s->next = NULL;
	cout<<"插入"<<x<<endl;

} 
	
int  LinkList::isEmpty(){ //判空 
	if(head->next==NULL) return 1;
	else return  0;

}

 int  LinkList::deleteMax(){ //删除最大值 
 	int temp ;
 	link p =head->next,pre=head,premax=head,max = head->next;
 	temp = p->data; //同时偏移指针pre、p   记录最大值位置指针max,记录最大值前一个结点位置指针premax 
 	while(p!=NULL){
 		
 		if(max->data<p->data){ //找到更大结点  
 			max = p;  //将max指向该节点 
 			premax = pre;//premax指向该节点前驱结点pre 
 			temp = max->data;
		 }
		pre = p;//pre偏移 
 		p = p->next;//p偏移 
	 }
	 	premax->next = max->next;
	 	delete(max); 
	 	cout<<"删除的最大值为:"<<temp<<endl;
 	return temp;
 }
 	void LinkList::deleteRepeat(){//删除连续重复结点 
 		link pre = head->next;
 		link p = pre->next;
 		while(p!=NULL){
 			if(pre->data!=p->data) {
 				pre = p;
 				p = p->next;
			 }
			else{
				while(p->next->data==pre->data)
				p = p->next;
				pre->next = p->next;
				p = p->next;
				cout<<"删除连续重复结点"<<pre->data<<endl;
			}
			
		 } 
	 } 
 void LinkList::Reverse(){ //原地逆置链表 
 	cout<<"链表开始逆置"<<endl; 
 	link pre = NULL, p = head->next, r;
 	while(p!=NULL){ //当p所指结点不为空 
 		r = p->next;//将p所指下一结点暂存 
 		p->next = pre;//将p所指结点的指针域指向前一结点 
 		pre = p;//pre指针后移 
 		p = r;//p指针后移 
	 }
	 head->next = pre;
 }
 void  LinkList::print(link head){
 	
 	link p = head->next;//注意!!不能直接移动head ,会改变head指向,影响后续调用 
 	while(NULL!=p){
 		cout<<p->data<<" ";
 		p = p->next;
	 }
	 cout<<endl;
 } 
 link LinkList::linkCopy(){ //尾插法拷贝链表 
 	link cphead = new Node;
 	link p = head->next;
 	link r = cphead;
 	while(p!=NULL){
 		link s = new Node;
 		s->data = p->data;
 		r->next = s;
 		r = s;
		p = p->next;
	 }
	 r->next = NULL; 
	 cout<<"copyList"<<endl;
	 return cphead;
 } 
void LinkList::LinkSort(){//链表排序  (类似直接插入排序) 
	link pre = head,p = head->next,r = p->next;//pre用于搜寻插入位置 
	p->next = NULL;
	p=r;
	while(p!=NULL){
		pre = head ;//每次搜寻从头开始 
		r = p->next;
		while(pre->next!=NULL&&pre->next->data<p->data) pre = pre->next;
		p->next = pre->next;
		pre->next = p;
		p = r;
	} 
	cout<<"链表排序:" <<endl;
}
void LinkList::searchLastk(int k){//查找倒数第k个元素
	link p,q;
	p = head->next;q = head->next;
	int move = k-1;
	if(k<=0||k>this->getLength()) {
		cout<<"查找位置不合法"<<endl; 
		return;
	} 
	while(move--!=0) p = p->next;
	while(p->next!=NULL){
		p = p->next;
		q = q->next;
	}
	cout<<"查找倒数第"<<k<<"个元素为:"<<q->data<<endl;
} 

int main(){
	
	
	LinkList L ;
	L.tailInsert();
	L.print(L.getHead());
	int i = L.deleteMax();
	L.print(L.getHead());
	L.Reverse();
	L.print(L.getHead());
	link cphead = L.linkCopy();
	L.print(cphead);
	L.insert(100);
	L.print(L.getHead());
	L.deleteRepeat(); 
	L.print(L.getHead());
	L.LinkSort();
	L.print(L.getHead());
	L.searchLastk(5);

	
	return 0;
} 
 
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值