今天给同学写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 ;
}

 

 

 

 

时间: 2024-12-26 21:19:14

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

c#-请问C#中如何写出插入数据算法?

问题描述 请问C#中如何写出插入数据算法? 不需要排序,只要在数组中插入数据,并使所有后续数值后移.这种算法该怎么写? 解决方案 那别用数组了,用链表结构,类里面有自己类型的对象,指向下一个,上一个,链表算法搜一下吧,c#版的很多 解决方案二: C#里本身就有现成的LinkedList<T>可以满足你的需要 解决方案三: linkedlist链表插入数据效率比较高,网上有很多代码,不过,还是建议楼主先了解一下链表再用,以后有时间看一下数据结构 解决方案四: 另外,可能java版本的比较多,你应

《C语言点滴》一1.4 程序=数据结构+算法

1.4 程序=数据结构+算法 C语言点滴 程序员首先要有自己的想法,而写程序只是为了实现自己的想法而已. 而程序员的想法就是用数据结构+算法来描述的.如果程序是一个人,正确的数据结构就像是强壮的体格,高效的算法就像是高尚的性格,而语言,只是一件外衣而已.不同的场景,你会穿不同的外衣,而且外衣可能还有一定的流行趋势,但这些真的不重要. 纠结于语言的程序员,就像是只关注外衣是否漂亮的小姑娘.凡是能够流传千古的作品,你会发现都是不穿衣服的,如图1-10所示的罗丹的思想者:更有甚者,不仅衣服没有了,就连

C语言判断临界矩阵表示的图是否存在回路?请问代码怎么写,是数据结构里面的?

问题描述 C语言判断临界矩阵表示的图是否存在回路?请问代码怎么写,是数据结构里面的? C语言判断临界矩阵表示的图是否存在回路?请问代码怎么写,是数据结构里面的? 解决方案 递归遍历,把找到的节点标记出来,如果遇到遍历的节点已经被标记,就说明有回路.

指针-哪里有问题?求解答,数据结构算法的问题

问题描述 哪里有问题?求解答,数据结构算法的问题 /* 设计一个算法,将两个非递减的链表合并成一个非递增的有序链表 要求使用原来的存储空间,不开辟新的空间,表中允许有重复的数据./ / 我的思路是: 使用L1的头结点作为新表L3的头结点,然后让L1头结点的指针域置空, 从L1和L2中选择较大的结点,使用头插法插入到L3的后面, 为什么运行不了?求大神解答! */ void Combine(LinkList &L1,LinkList &L2,LinkList &L3){ struct

数据结构 算法 c语言 二叉排序树

问题描述 数据结构 算法 c语言 二叉排序树 RT 注意关键字X所代表的含义 解决方案 你的图片应该没有传上来,看不见你的问题啊

test-这是我写的快速排序的算法,为什么编译时出错并提示“swap函数应输入两个参数,却提供了3个”啊

问题描述 这是我写的快速排序的算法,为什么编译时出错并提示"swap函数应输入两个参数,却提供了3个"啊 求助!这是我写的快速排序的算法,为什么编译时出错并提示"swap函数应输入两个参数,却提供了3个"啊~~谢谢大家啦! #include using namespace std; inline int findpivot(int arr[],int i,int j){ return (i+j)/2; } inline int partition(int arr[]

线性表-数据结构 算法如何编译运行··跪求各位路过的大神帮帮忙啊

问题描述 数据结构 算法如何编译运行··跪求各位路过的大神帮帮忙啊 #include #include #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType;//顺序表测试用 const int MaxSize=100; //100只是示例性的数据,可以根据实际问题具体定义 const int Increasement=10; typedef struct{ ElemType *elem; int length

数据结构算法设计: 请设计一个算法,统计一个循环单链表L中的结点个数。

问题描述 数据结构算法设计: 请设计一个算法,统计一个循环单链表L中的结点个数. 算法设计: 请设计一个算法,统计一个循环单链表L中的结点个数. 解决方案 int n = 0; while (L != NULL) { L = L->next; n++; } 解决方案二: /* counts the nodes in the list / int fuc(struct list head) { void *tmp; int i; if(!head) return -1; for(i = 1, tm

递归算法-数据结构 算法 递归

问题描述 数据结构 算法 递归 编写一个递归算法,删除二叉树中所有叶子结点. 解决方案 void foo(Node * node) { if (node->left != null) { if (node->left->left == null && node->left->right == null) { delete(node->left); node->left = null; } else { foo(node->left); } }