头文件的自己先定义,便于以后调用
定义为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日写。。~~~~~