关闭

[置顶] 数据结构学习记录-两个数组的合并

532人阅读 评论(0) 收藏 举报

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

定义为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日写。。~~~~~

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:113422次
    • 积分:1488
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:8篇
    • 译文:0篇
    • 评论:131条
    最新评论