今天给同学写5个数据结构算法的题...感觉很有价值的几个题..感兴趣的坐下。。...

本文详细介绍了六种算法与数据结构的实现,包括判断顺序表是否对称、线性表中结点循环右移、数组调整奇偶数位置、动态链表逆置、单链表中删去重复节点以及两个有序线性表归并为降序排列表。每种算法都附有代码实现,旨在提高数据处理效率与优化数据结构。
1.判断一个顺序表是否对称
2用向量作存储结构,设计以算法仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算
3.已知A【n】中的元素为整形。设计算法将其调整为左右两部分。左边所有元素为奇数,右边所有元素为偶数,
4,设计以算法,逆置带头结点的动态链表L,
5单链表以非递减有序排列,设计算法实现在单链表中删去值相同的多余结点,
6假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,是编写算法将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表的结点空间存放C
我写的代码如下
1 、
/*
要求 :判断一个顺序表是否对称
*/
#include <iostream>
using namespace std ;
#define MAX_SIZE 200
template <class T>
bool IsSymmetrical(T List[],int length); //利用模板可以比较任意类型的顺序表
void main()
{
int group= 0;
bool *pGroup=NULL;//保存的是比较的结果
int *pNum =NULL; //这里以整形顺序表为例
int nCount=0 ;//每组数据的个数
//cout<<"请输入要比较几组数据:"<<endl ;
cin>>group;
pGroup=new bool[group] ; //动态分配数组内存保存对称比较结果
for(int n=0;n<group;n++) //循环四次每一次是一个比较结果
{
cin>>nCount ;
pNum=new int[nCount] ; //动态为每行数据分配内存
for(int m=0;m<nCount;m++) //为刚分配好的数组进行赋值
cin>>pNum[m];
pGroup[n]=IsSymmetrical(pNum,nCount) ; //直接将函数返回结果的bool值保存在动态分配的数组中
delete []pNum ;// 第一组内存使用完毕释放掉 防止内存泄露
}
for(n=0;n<group;n++) //输出是否对称Y N
{
if(pGroup[n])
cout<<"Y"<<endl ;
else
cout<<"N"<<endl ;
}
delete []pGroup ; //最后再次释放堆内存
}
template <class T>
bool IsSymmetrical(T List[],int length) //利用模板可以比较任意类型的顺序表
{
int l=0;
for(int n=0;n<=length-1;n++)
if(List[n]==List[length-1-n])
l++ ;
if(l==length)
return true ;
return false ;
}
2、

/*
要求:用向量作存储结构,设计以算法仅用一个辅助结点,实现将线性表中的结点循环右移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、

/*
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++;
}
}
}

4、

/*
,设计以算法,逆置带头结点的动态链表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 ;
}

5、

/*
单链表以非递减有序排列,设计算法实现在单链表中删去值相同的多余结点,
算法实现 就是用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 ;
}

6、
/*
6假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,
是编写算法将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表的结点空间存放C
<---------在输入数据的时候一定要按递增输入数据 ------>
*/
#include <iostream>
using namespace std ;
typedef struct Node //链表节点
{
int data ;
struct Node*next ;
}*Head,*LinkNode;
LinkNode A =NULL;//表1
LinkNode B =NULL;//表2
LinkNode C=NULL; //表3
int GetMax(Head head); //返回链表中的最大数据
Head CreatLinkList() ;//自定义带头链表创建函数
Head CombineLinkList(Head A,Head B) ; //合并算法的实现部分
void Show(Head head) ;//显示函数
void main()
{
cout<<"表A:"<<endl;
A=CreatLinkList(); //创建表A
cout<<"表B:"<<endl;
B=CreatLinkList(); //创建表B
C=CombineLinkList(A,B) ;
Show(C);
}
Head CombineLinkList(Head A,Head B) //合并算法的实现部分
{

LinkNode tem=A ;
while(tem->next!=NULL)
{
tem=tem->next;
}
tem->next=B ;
C=A ;//A B 表连接起来 然后 降序排序
LinkNode p1=C;
LinkNode p2=C->next;
int inter=C->data ;//用于交换的临时变量
while(p1->next!=NULL)
{
while(p2!=NULL)
{
if(p2->data>p1->data) //交换数据
{
inter=p1->data ;
p1->data=p2->data;
p2->data=inter ;
}
p2=p2->next ;
}
p1=p1->next;
p2=p1->next;
}
return C;
}
void Show(Head head) //显示链表函数
{
while(head!=NULL)
{
cout<<head->data<<" ";
head=head->next;
}
cout<<endl ;
}
int GetMax(Head head) //返回链表中的最大数据
{
while(head->next!=NULL)
head=head->next ;
return head->data;
}
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 ;
}
一: 内容:1、设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试设计一算法,将x插入到线性表的适当置上,以保持线性表的有序性。 2、用向量作存储结构,试设计一个算法一个辅助结点实现线性表中的结点循环右移k的运算。 3、用向量作存储结构,试设计一个算法一个辅助结点实现线性表逆置的运算。 要求:了解线性表的逻辑结构特征,熟练掌握线性表顺序存储结构的描述方法,及在其上实现各种基本运算的方法。 二:内容:1、已知带头结点的动态单链表L中的结点是按整数值递增排序的,试算法将值为x的结点插入到表L中,使L仍然有序。 2、设计一算法,逆置带头结点的动态链表L。要求利用原表的结点空间,并要求用尽可能少的时间完成。 3、假设有两个按元素值递增有序的线性表A和B,均以单链表作存储结构,试编算法将A表和B表归并成一个按元素值递减有序的线性表C,并要求利用原表的空间存放C。 要求:熟练掌握线性表的单链式链接存储结构及在其上实现线性表的各种基本运算的方法。 三:内容:1、假设在长度大于1的单循环链表中,既无头结点也无头指针。s为指向某个结点的指针,试编算法删除结点*s的直接前驱结点。 2、已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母、数字和其它字符),设计算法构造三个以循环链表示的线性表,使每一个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的空间。(头结点可以另辟空间) 3、有一双链表,每个结点中除有prior、data和next域外,还有一访问频度域freq,在链表被启用前,其值均初始化为零。每当在链表上进行一次LOCATE(L,x)运算,元素值为x的结点中freq域的值增1,并使此链表中结点保持按freq递减的顺序排列,以便使频繁访问的结点总是靠近表头。设计满足上述要求的LOCATE算法。 要求:熟练掌握线性表循环链式和双链式链接存储结构及在其上实现线性表的各种基本运算的方法。 四:内容:1、设单链表中存放着n个字符,设计算法,判断该字符串中是否有中心对称关系。例如:xyzzyx、xyzyx都算是中心对称的字符串。 2、设计算法判断一个算术表达式的圆括号是否配对。(提示:对表达式进行扫描,遇‘(’进栈,遇‘)’退掉栈顶的‘(’,表达式被扫描完毕,栈为空) 3、假设以带头结点循环链表表示队列,并只设一个指针指向队尾,编相应的置队空、入队和出队算法。 要求:掌握栈和队列的数据结构的特点;熟练掌握在两种存储结构上实现栈和队列的基本运算;学会利用栈和队列解决一些实际问。 五:内容:1、若X和Y是用结点大小为1的单链表表示的串,设计算法找出X中第一个不在Y中出现的字符。 2、设计一算法,在顺序串上实现串的比较运算strcmp(S,T)。 3、若S和T是用结点大小为1的单链表存储的两个串,设计算法将S中首次T匹配的子串逆置。 要求:熟练掌握串的顺序和链接存储结构的实现方法;熟练掌握在两种存储结构上实现串的各种运算。 六:内容:1、以二叉链表作存储结构,设计求二叉树高度的算法。 2、一棵n个结点的完全二叉树用向量作存储结构,用非递归算法实现对该二叉树进行前序遍历。 3、以二叉链表作存储结构,编非递归的前序、中序、后序遍历算法。 要求:熟悉二叉树的各种存储结构的特点及适用范围;掌握建立二叉树的存储结构的方法;熟练掌握二叉树的前序、中序、后序遍历的递归及非递归算法;灵活运用递归的遍历算法实现二叉树的其它各种运算。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值