数据结构学习记录-两个数组的合并

原创 2012年03月24日 22:30:52

头文件的自己先定义,便于以后调用

定义为t11.h

#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h"  //atoi(),exit();
#include"io.h"      //eof()
#include"math.h"


#define  TRUE  1
#define  FALSE  0
#define  OK   1
#define  ERROR 0

typedef int Status;
typedef int Boolean;

 

基于数据类型 我定义的时结构体

 struct SqList1
 {
   int *elem;   // 存放动态开辟的空间的首地址
   int length;   //  记录表的长度
 };

 

然后我想到定义一个实现函数的文件定义为cpp格式

void Create(SqList1 &L,char th)

 printf("输入%c数组的大小:",th);
 scanf("%d",&L.length);
 L.elem=(int*)malloc(L.length*sizeof(int));
 if(!L.elem)
 {
  printf("分配失败!!");
  exit(1);
 }
 printf("输入这%d个数:\n",L.length);
 for(int*i=L.elem;i<=L.elem+L.length-1;i++)
  scanf("%d",i);
 printf("这%d个数是:\n",L.length);
 for(int j=0;j<=L.length-1;j++)
  printf("%-4d",*(L.elem+j));
 printf("\n");


}
void print()
{

 printf("\t\t输入数据,可以随便输入,可以有多个相同的数!\n\t\t结果以降序输出!无相同项!!!~~~~~~\n");
 
 printf("\n");
}
void paixu(SqList1 &A,int p,int q,int r)  //  排序,进行一次排序,将一个数组分成两部分
{
 SqList1 W;
 W.elem=(int*)malloc(r*sizeof(int));
 int s=p-1;
 int t=q;
 int k=p-1;
 while(s<=q-1 && t<r)
 {
  if(*(A.elem+s) > *(A.elem+t))
  
   *(W.elem+k++)=*(A.elem+s++);
  
  else
   *(W.elem+k++)=*(A.elem+t++);
 }
 if(s == q)
 {
  for(int j=t;j<r;j++)
  
            *(W.elem+k++)=*(A.elem+j);
  
 }
 else
 {
  for(int j=s;j<q;j++)
   *(W.elem+k++)=*(A.elem+j);
 }

 for(int j=p-1;j<r;j++)
  *(A.elem+j)=*(W.elem+j);
}

void  wanpaixu(SqList1 &A)
{
 int t=1;
 while(t<A.length)
 {
  int s=t;
      t=2*s;
  int i=0;
  while(i+t<=A.length)
  {
            paixu(A,i+1,i+s,i+t);
      i=i+t;
  }
  if(i+s<A.length)             //  合并的中间值,比如合并完8个数组,而数组的长度为9个,
  
  paixu(A,i+1,i+s,A.length);  //这是中间值是4,i+s表示将第8个数组位置作为中间值


 }
 
}

void merge(SqList1 A,SqList1 B,SqList1 &C)
{
     printf("想知道答案吗??(Y/y):\n");
  C.length=A.length+B.length;              // 注意需将C中得长度初始化  
     C.elem=(int*)malloc(C.length*sizeof(int));
 
  if(!C.elem)
  {
   printf("分配内存失败!!");
   exit(-1);
  }
  char ch;
  getchar();
  ch=getchar();
  while('Y' == ch || 'y' == ch)
  {
  int i=0,j=0,k=0;
     while(i<=A.length-1 && j<=B.length-1)
  {
   while(*(A.elem+i) == *(A.elem+i+1))   //  经过排列一个数组里的相同的数连续存储,如果相同位置向后移一位,直到两位数不相等
    i++;
   while(*(B.elem+j) == *(B.elem+j+1))
    j++;
        if(*(A.elem+i)>=*(B.elem+j))         // 将大数存入C中
   
   
   if(*(A.elem+i) == *(B.elem+j))
    j++;
       *(C.elem+k++)=*(A.elem+i++);
  }
  else
  
            *(C.elem+k++)=*(B.elem+j++);

  
  }

  if(i == A.length)
  {
   while(j<=B.length-1)         //  余下来的数可能还是相同  相同就向后移动,直到两个不同的
   {
    while(*(B.elem+j) == *(B.elem+j+1))
           j++;
       *(C.elem+k++)=*(B.elem+j); 
    j++;
   }
  }
  else
  {
   while(i<=A.length-1)
   {
       while(*(A.elem+i) == *(A.elem+i+1))
     i++;
  
    *(C.elem+k++)=*(A.elem+i);
    i++;
   }
  }
  
     printf("数据为(按降序排列):\n");
   for(int s=0;s<k;s++)
    printf("%-3d",*(C.elem+s));
       printf("\n");
        ch='n';
  }

}

 

之后的主函数就方便调用了 定义主函数main_4

函数为:

#include"t11.h"
#include"t22.h"
#include"list.cpp"

void main()
{
 SqList1 X,Y,Z;
 print();

 
 Create(X,'A');
 Create(Y,'B');
 wanpaixu(X);
 wanpaixu(Y);
// print(X);
// print(Y);
 merge(X,Y,Z);
   
 
    getchar();
 getchar();

}
这就是自己学数据结构的自己设计的第一个程序,因为爱她,所以自己有很大的兴趣,作为自己一个好的开始吧!!!不停的学习,才会进步,才会优秀。。。。。 留住最真的。。。2012.3.3日写。。~~~~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《数据结构学习与实验指导》2-11:两个有序链表序列的合并

实验内容:已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集,新非降序链表S3。 输入说明:输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示结尾(-1不属于序列)。...

数据结构学习记录-两个链表相加之函数指针的运用

一个一元多项式相加,蕴涵的知识和编程心得 先定义头文件t11.h #include"stdio.h" #include"string.h" #include"ctype.h" #includ...

数据结构 数组操作 稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。

不解释,请看注释,代码如下: #include #include #include #include #include using namespace std; #define MAX 12500 ...

【数据结构】栈面试题--一个数组实现两个栈

一个数组实现两个栈,有以下几种方法: 1.数组的奇数位置存储一个栈的元素,偶数位置存储另一个栈的元素; 2.两个栈分别从数组的中间向两头增长; 3.两个栈分别从数组的两头开始增长。 从...

数据结构与算法——在一个数组中实现两个堆栈(C语言)

要求在一个数组中实现两个堆栈。函数接口定义:Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ...

数据结构--一个数组实现两个栈

用一个数组实现两个栈,通常我们会想到以下几种方案: 1.奇偶栈,即就是将数组的偶数位置看作一个栈的存储空间,将奇数位置看作另一个栈的存储空间。 2.从中间分别向两边展开,即就是将数组的中间位置看作...

数据结构 — 1. 两个非递减有序单链表合并为非递增有序单链表

题目描述: 两个非递减有序单链表合并为非递增有序单链表,不能增加新结点,可以增加新指针,不能利用循环链表,不能用顺序表,只能利用单链表本身的结点,通过改变指针的指向来获得结果。 #include #...

数据结构—链表— 两个有序链表序列的合并

02-线性结构1 两个有序链表序列的合并   (15分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义: List Merge( List...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)