/*
要求:用向量作存储结构,设计以算法仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算
向量即STL中的vector 动态数组
时间原因这里我只弄了一个线性表来循环移动算法在下面注释部分 需要像第一题多组输入的时候只需要将整个实现部分放在一个循环中实现即可
*/
#include <iostream>
#include <vector>
using namespace std ;
#include "windows.h"
struct Node //节点数据
{
int data;
};
void main()
{
vector<Node> List; //向量的定义
int size ;//接收输入的大小
cout<<"请输入表中初始数据的个数:"<<endl ;
cin>>size ;
Node *pArray=NULL ;//接受输入的数据
pArray=new Node[size] ;
for(int n=0;n<size;n++)
{
cout<<"请输入第"<<n+1<<"个节点的数据,一次输入一个回车结束输入:"<<endl ;
cin>>pArray[n].data ;
List.push_back(pArray[n]) ; //插入数据
}
vector<Node>::iterator p=List.begin() ;//返回迭代器 我们可以通过迭代器访问vector
system("cls");//清除屏幕
cout<<"初始表中数据如下:"<<endl;
for(n=0;n<size;n++) //通过迭代器输入表中数据
cout<<p[n].data<<" ";
cout<<endl ;
cout<<"数据输入完成请输入要向右移动的位置k:"<<endl ;
int move ; //要移动的位置
cin>>move ;
move=move%size ; //取模
Node tem ;
List.insert(p,move,tem) ; //在前面插入5个临时节点
p=List.begin(); //迭代到第一个节点
////////////////////////////////////////算法实现部分
size=List.size();int m=0;
for(n=size-move ,m=0;n<size;n++,m++) //对插入的节点进行赋值
p[m]=p[n];
for(n=0;n<move;n++)
List.pop_back() ;//pop出尾部元素
///////////////////////////////////
p=List.begin() ;
cout<<"右移后元素位置:"<<endl;
for(n=0;n<size;n++)
cout<<p[n].data<<" ";
cout<<endl;
}
/*
3.已知A【n】中的元素为整形。设计算法将其调整为左右两部分。左边所有元素为奇数,右边所有元素为偶数,
操作例子
组数 2
第一组 5(个数) 1 2 3 4 5
结果 1 3 5 2 4 然后根据提示继续输入下一组
*/
#include<iostream>
using namespace std;
#define MAX_SIZE 100
void SetArray(int arr[],int length) ;//算法实现函数
void main()
{
cout<<"\t\t\t操作例子 "<<endl<<"\t\t\t组数 2-->回车 "<<endl<<"\t\t\t第一组 5 1 2 3 4 5 -->回车结束"<<endl;
cout<<"\t\t\t结果输出 1 3 5 2 4 -->显示结果然后继续输入下组"<<endl ;
int *pArray=NULL;//动态数组指针
int nCount=0;//每行数组的个数
int group=0;
cout<<"请输入组数:"<<endl;
cin>>group;
for(int i=0;i<group;i++)
{
cout<<"请输入"<<"第"<<i+1<<"组的个数以及数据例如: 5 1 2 3 4 5"<<endl ;
cin>>nCount; //输入个数
pArray=new int[nCount] ;
for(int n=0;n<nCount;n++)
cin>>pArray[n];
SetArray(pArray,nCount); //调用设置函数 改变奇数偶数位置
for(n=0;n<nCount;n++)
cout<<pArray[n]<<" ";
cout<<endl ;
delete []pArray ; //释放堆中内存
}
}
void SetArray(int arr[],int length) //算法实现函数
{
char buf1[MAX_SIZE] ;
char buf2[MAX_SIZE] ;
memset(buf1,'*',MAX_SIZE); //存放奇数
memset(buf2,'*',MAX_SIZE);//存放偶数
buf2[MAX_SIZE-1]='\0';
buf1[MAX_SIZE-1]='\0'; //防止越界
for(int n=0,m=0,i=0;n<length;n++)
{
if(arr[n]%2==0)
{
buf2[m]='0'+arr[n]; //保存偶数asc码
m++ ;
}
else
{
buf1[i]='0'+arr[n] ;//保存奇数asc码
i++;
}
}
for(n=0,m=0,i=0;n<length;n++)
{
if(buf1[m]!='*')
{
arr[n]=buf1[m]-'0' ;
m++;
}
else
{
arr[n]=buf2[i]-'0' ;
i++;
}
}
}
/*
,设计以算法,逆置带头结点的动态链表L,
先创建 链表然后 进行反序
*/
#include <iostream>
using namespace std ;
typedef struct Node //链表节点
{
int data ;
struct Node*next ;
}*Head,*LinkNode;
Head head;//头结点
int length=0 ;
Head CreatLinkList() ; //自定义带头链表创建函数
void Reserve(Head head) ; //反序算法的实现 其实是实现数据的反序
void Show(Head head) ;//显示函数
void main()
{
int group ;
cout<<"请输入要反序的链表组数"<<endl ;
cin>>group ;
Head *pLink=new Head[group]; //保存链表头
cout<<"输入链表的数据,数据之间空格分开,以66666结束每组输入例如: 1 2 3 4 5 66666->回车"<<endl;
for(int n=0;n<group;n++)
{
head=CreatLinkList();//创建链表
Reserve(head) ;
pLink[n]=head ;
length =0;
}
cout<<"反序后:"<<endl;
cout<<"<------------------------->"<<endl ;
for( n=0;n<group;n++)
Show(pLink[n]);
cout<<"<------------------------->"<<endl ;
}
void Reserve(Head head) //反序算法的实现 其实是实现数据的反序
{
int count=length/2 ; //比较次数
LinkNode p1=head,p2=head ;
int tem ;
for(int n=0;n<count;n++)
{
for(int m=0;m<length-n-1;m++)
p2=p2->next ;
tem=p1->data ;
p1->data=p2->data ;
p2->data=tem ;
p1=p1->next ;
p2=head ;
}
}
void Show(Head head) //显示函数
{
while(head!=NULL)
{
cout<<head->data<<" ";
head=head->next;
}
cout<<endl ;
}
Head CreatLinkList() //自定义带头链表创建函数
{
LinkNode p1=NULL,p2=NULL,head =NULL ;
p1=new Node ;
head=p1 ;
p2=p1 ;
length++;
cin>>p1->data ;
if(p1->data==66666)
{
delete p1 ; p1=NULL ; p2=NULL;
length--;
return NULL ;
}
while(p1->data!=66666)
{
p2=p1 ;
p1=new Node ;
length++;
cin>>p1->data ;
if(p1->data==66666)
{
delete p1 ; p1=NULL ; p2->next=NULL;
length--;
return head ;
}
p2->next=p1 ;
}
return head ;
}
/*
单链表以非递减有序排列,设计算法实现在单链表中删去值相同的多余结点,
算法实现 就是用2个循环遍历链表 算法实现在下注释部分
*/
#include <iostream>
using namespace std ;
typedef struct Node //链表节点
{
int data ;
struct Node*next ;
}*Head,*LinkNode;
Head head ;//头结点
Head CreatLinkList() ;//自定义带头链表创建函数
void Delete(Head head) ; //删除重复的节点算法实现部分。。。。
void Show(Head head) ;//显示函数
void main()
{
head=CreatLinkList() ;
system("cls");
cout<<"表中数据如下:"<<endl;
Show(head) ;
Delete(head) ; //删除重复节点
cout<<"删除重复节点后的链表:"<<endl;
Show(head) ;
}
Head CreatLinkList() //自定义带头链表创建函数
{
LinkNode p1=NULL,p2=NULL,head =NULL ;
p1=new Node ;
head=p1 ;
p2=p1 ;
cout<<"请输入链表节点数据,数据间空格分开 输入66666结束输入 例如 1 2 3 4 5 66666"<<endl;
cin>>p1->data ;
if(p1->data==66666)
{
delete p1 ; p1=NULL ; p2=NULL;
return NULL ;
}
while(p1->data!=66666)
{
p2=p1 ;
p1=new Node ;
cin>>p1->data ;
if(p1->data==66666)
{
delete p1 ; p1=NULL ; p2->next=NULL;
return head ;
}
p2->next=p1 ;
}
return head ;
}
/////////////////////////////////////////////////////////////////////////////////
void Delete(Head head) //删除重复的节点算法实现部分。。。。
{
Head p1=head,p2=head ;
LinkNode tem=NULL ; //临时节点指针
while(p1!=NULL)
{
while(p2->next!=NULL) //当p2的next到达尾部的时候后就要推出否则 下面p2->next->next会崩溃
{
if(p2->next->data==p1->data)
{
tem=p2->next ;
p2->next=p2->next->next ;
delete tem ;
continue ;
}
else
p2=p2->next ;
}
p1=p1->next;
p2=p1 ;
}
}
///////////////////////////////////////////////////////////////////////////////////
void Show(Head head) //显示函数
{
while(head!=NULL)
{
cout<<head->data<<" ";
head=head->next;
}
cout<<endl ;
}