关于车皮排序问题,看到的统统进来
这是个关于车皮排序的问题我的程序如下:#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<stdlib.h>
#define LENTH sizeof(struct link)
#define N 100
#define NULL 0
typedef struct link //定义一个链表
{
int date;
link *next;
}link;
link *createlink() //建立一个链表
{
link *top=0; //top指向栈顶
link *p;
if(!(p=(link *)malloc(LENTH)))
{
exit(0);
}
else
{
top=p;
top->date=0;
}
return top;
}
link *add(link *c,int j) //增加栈链表
{
link *p,*top;
top=c+j;
if(!(p=(link *)malloc(LENTH)))
{
exit(0);
}
else
{
p->next=top;
top=p;
}
return top;
}
void readfile(int *m,int *n,int *a,FILE *fp) //读取输入数据文件
{
int i;
char huancun;
fscanf(fp,"%d %d",&m,&n); //m放车皮数据的个数,n放栈个数
for(i=0;i<*n;i++)
{
a[i]=fgetc(fp); //用a数组存放车皮的数据,huancun用来过滤数据之间的空格
huancun=fgetc(fp);
}
}
void outnosolution(FILE *fp2)
{
fscanf(fp2,"NO Solution");
}
void chuli(int a[],int i,link *first,int *n,int b[],FILE *fp2)
{
void outnosolution(FILE *fp2);
void output(int i,int end,FILE *fp2);
link *p,*q;
int k=0;
int outnum=0; //outnum表示存放输出数据数据的序号
q=first; //first指向第一个栈的地址
if(a[i]==1) //如果a[i]是1则放到输出数组中
{
b[outnum++]=a[i];
output(0,*(n)+1,fp2);
}
else
{
while((a[i]>(q++)->date)&&((q-first)<*(n)+1)) //如果a[i]不是1且当a[i]比该栈的栈顶元素大时,依次对每个栈引入第一个数
{
if((q++)->date==0)
{
q->date=a[i];
output(0,q-first,fp2);
break;
}
}
if(q->date!=a[i])
{
if(a[i]==b[k]+1)
{
output(0,*(n)+1,fp2);
k++;
}
else
{
outnosolution(fp2); //在输出数据文件中读入NO SOLUTION
exit(0);
}
}
p=add(q,q-first); //尾插入一个空间到当前栈
p->date=a[i];
p->next=q;
q=p;
output(0,q-first,fp2);
}
}
void output(int i,int end,FILE *fp2) //对数据进行输出到文件处理,end是数据移动的目标栈或数组的序号
{
fprintf(fp2,"%d->%d\n",i,end);
}
void dwl(int *n,link *c,FILE *fp2) //对栈的数据开始进行转移到输出数组
{
link *q; //c指向第一个栈的地址
q=c;
for(;(q-c)<*(n)+1;q++) //逐个对栈数据进行转移
{
while(q->date!=0) //在输出数据文件中读入转移的过程
{
output(q-c,*(n)+1,fp2);
q=q->next;
}
}
}
int main()
{
int a[N]={0}; //用于存放输入数据
int b[N]={0}; //用于存放输出数据
int i,j=0,k=0,q=1;
int *m=0,*n=0;
link *c=0,*first;
FILE *fp1;
FILE *fp2;
fp1=fopen("E:\\测试输入数据.txt","r");
if(fp1==NULL) //打开测试输入数据文件,并把数据的首地址赋值给fp1
{
printf("cannot open the file\n");
exit(0);
}
fp2=fopen("E:\\测试输出数据.txt","r");
if(fp2==NULL) //打开测试输出数据文件,并把数据的首地址赋值给fp2
{
printf("cannot open the file\n");
exit(0);
}
readfile(m,n,a,fp1);
for(;(c-first)<*n;c++)
{
c=createlink(); //用来存储每个数组栈的栈顶地址
if(q--) //用first指向第一个栈
{
first=c;
}
}
for(i=0;i<N;i++)
{
chuli(a,i,first,n,b,fp2); //对数组a的数据进行排序输出处理
}
dwl(n,c,fp2); //开始对栈里的数据进行处理
fclose(fp1);
fclose(fp2);
return 0;
}
哪个大侠帮忙看下 并在我的基础上改正下或者把你自己的代码发上来让我参考下 以下是车皮问题的文件不知道这个问题的可以下载看下
011rail.pdf
(40.04 KB)
[ 本帖最后由 清风拂晓 于 2010-11-5 21:37 编辑 ]