学习随记十——分别用vector数组和链表创建自调整表

分别用vector数组和链表创建自调整表

  1. 使用vector数组的算法:
    先根据输入的元素动态创建一个vector数组,然后在其中查找元素若找到记录下标,然后删除这个单元
    ,再新建一个和原数组大小相等的数组,将找到的元素作为新数组的首个元素再将原数组整体拷贝给新数组的除首单元的单元即可

  2. 使用链表的算法:
    先根据输入的元素动态的创建一个链表,然后在其中查找元素,若找到则假设储存的数据与待查找元素相同结点为p,使p的前一个结点指向p的下一个结点,p指向头结点指向的结点,再使头结点指向p即可

  3. 整体代码:

#include<iostream>
#include<vector>
#include<algorithm>			 
using namespace std;
typedef struct Listnode{
	int data;
	struct Listnode* next;
}Listnode;
void Createvector(vector<int>&);
//功能:根据输入的数据创建vector<int>数组,参数:vector<int>类引用	
void Createlist(Listnode*);		//根据输入元素动态创建一个链表		
void Find(vector<int>&,int);	//如果在数组中找到了要查找的元素将其放在首位,其他元素相对位置不变 
void Find(Listnode*,int);		//类似 
int main(void){
	vector<int>vi;
	Listnode *headnode=new Listnode;	//头结点 
	Listnode *p;
	int x;
	headnode->next=nullptr;
	Createvector(vi);
	cout<<"请输入你要查找的元素"<<endl;
	cin>>x;
	Find(vi,x);
	for(int i=0;i<vi.size();i++)cout<<vi[i]<<endl;
	Createlist(headnode);
	Find(headnode,x);
	p=headnode->next;
	while(p!=nullptr){
		cout<<p->data<<endl;
		p=p->next; 
	}
	return 0;
}
void Createvector(vector<int>&vi){
	int x;
	cout<<"请输入整数,输入其他数据即可停止输入"<<endl;
	while(cin>>x){
		vi.push_back(x);	//将元素存入vector<int>数组中 
	}
	cin.clear();			//恢复输入 
	cin.ignore();
} 
void Createlist(Listnode*head){
	int x;
	Listnode*r;
	cout<<"请输入整数,输入其他数据即可停止输入"<<endl;
	while(cin>>x){
		Listnode *p=new Listnode;
		p->data=x;
		p->next=nullptr;
		if(head->next==nullptr){
			head->next=p;
		}else{
			r->next=p;
		}
		r=p;
	}
	cin.clear();
	cin.ignore();
}void Find(vector<int>&vi,int x){
	int i=1,temp=0,p=-1,length=vi.size();	//p用来记录查找的元素在数组中的位置 
	while(vi[i-1]!=x&&i<length){
		if(vi[i]==x)p=i;
		i++; 
	}
	if(p!=-1){
		vector<int>vtemp(length);
		vtemp[0]=x;		//将x赋给第一个位置 
		vi.erase(vi.begin()+p);		//删除x在数组中的单元 
		copy(vi.begin(),vi.end(),vtemp.begin()+1);
		vi.push_back(0);	//恢复原数组被删除的单元 
		copy(vtemp.begin(),vtemp.end(),vi.begin());
	}else
	cout<<"no this number"<<endl;
}
void Find(Listnode*head,int x){
	Listnode* p=head->next,*s;
	while(p->data!=x&&p!=nullptr){
		s=p;			//保存p的地址 
		p=p->next;		//使p指向p的下一个结点 
		if(p->data==x){
			s->next=p->next;	//使原来的p指向它的下一个结点的指针域指向的地址 
			p->next=head->next;//使原来的p指向的下一个结点指向第一个结点 
			head->next=p; 	   //使头结点指向p,p成为第一个结点 
		} 
	}
}

4.输出示例:

请输入整数,输入其他数据即可停止输入
1
2
3
4
5
6
7
q
请输入你要查找的元素
3
3
1
2
4
5
6
7
请输入整数,输入其他数据即可停止输入
1
2
3
4
5
6
7
q
3
1
2
4
5
6
7
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值