求助!请问如何对链表中的数据节点分类并排序(已解决,代码在里面)
大家好,我是C的初学者,以前几乎没编过什么程序。最近,老师让我做一个包交换接收端的软件模拟,一开始不知该怎么做,希望大家能帮忙,结果六天过去了也无人问津,是不是这个问题太基础了,大家都不愿回帖,呵呵。
后来,我有花了5天把它调好了,。编的可能有很多费语句,还可以再改,不过总算能运行了,现在我把它贴出来,希望能给跟我一样有问题的初学者看看,呵呵。
题目要求:
现在有一个数据流(自己把它做成一个文件存在磁盘上,再调到内存了),里面有来自三个方向的9个数据包,每个方向来的都是一个完整的文本文件(北京4个,上海3个,广州2个),而且顺序是乱的,现在编程将这个数据流分类,排序,然后顺序输出。
注:一个包包括报头和报文,最后要将三个方向来的三个文本输出,写到三个文件里。
报头格式(char型):一个包的开始是一个空格加KKKK,源地址(2byte),目的地址(2byte,目前固定为XA),日期(080515),总数(2byte),次序(2byte)。
报文:固定为10byte。
程序代码:# include
# include
# include
# define LEN sizeof(struct node)
struct node
{ char Source_addr[2],Destinition_addr[2],Date[6],Data[10];
int Number,sequence;
struct node * next;
} ;
struct node * head=NULL;
struct node * headers[]={NULL,NULL,NULL};
char compare[3][3]={"BJ","SH","GZ"};
/*建立了一个头节点,作为链表的开始*/
struct node * Read_func(struct node * p1,struct node * p2,struct node * head)
{
int accountK=0,accountE=0,i=0;
char ch='0',CH_INT1='0',CH_INT2='0';
FILE * fp;
if ((fp=fopen("stream1.c","r"))==NULL)
{
printf("cannot open this file\n");
}
else printf("open is complete!\n");
do
{
ch=fgetc(fp);
putchar(ch);
if (ch==' ') /* 从文件读第一个字符*/
{
if((ch=fgetc(fp))=='K')
{
accountK=1;
for (i=0;i<3;i++)
{
if((ch=fgetc(fp))=='K')
accountK++;
else accountK=accountK;
}
}
else if ((ch=fgetc(fp))=='E')
{
accountE=1;
for (i=0;i<3;i++)
{
if((ch=fgetc(fp))=='E')
accountE++;
else accountE=accountE;
}
if(accountE>2)break;
}
else
{
printf("error!\nno begin sign\n");
break;
}
}
else
{
printf("error!\nThe file cannot be read\n");
break;
}
/*判断是开始kkkk还是结束eeee,若为开始则将数据读入节点*/
if (accountK>=3)
{
printf("reading start.\n");
ch=fgetc(fp);
for (i=0;i<2;i++)
{
ch=fgetc(fp);
p1->Source_addr[i]=ch;
}
ch=fgetc(fp);
for (i=0;i<2;i++)
{
ch=fgetc(fp);
p1->Destinition_addr[i]=ch;
}
ch=fgetc(fp);
ch=fgetc(fp);
CH_INT1=ch;
ch=fgetc(fp);
CH_INT2=ch;
p1->Number=((CH_INT1-48)*10+(CH_INT2-48));
ch=fgetc(fp);
ch=fgetc(fp);
CH_INT1=ch;
ch=fgetc(fp);
CH_INT2=ch;
p1->sequence=((CH_INT1-48)*10+(CH_INT2-48));
ch=fgetc(fp);
for (i=0;i<6;i++)
{
ch=fgetc(fp);
p1->Date[i]=ch;
}
ch=fgetc(fp);
for(i=0;i<10;i++)
{
ch=fgetc(fp);
p1->Data[i]=ch;
}
/*已读完一个节点,再创建一个新节点,并形成一个链表*/
p2=(struct node * )malloc(LEN);
p1->next=p2;
p1=p2;
}
else
printf("the file is broken\n");
}
while(accountE<2);
fclose(fp);
printf("reading is complete\n");
p1->next=NULL;
return(head);
}
/**********************************数据读取完毕,形成一个10的节点的链表******************************/
void catgeriz_func(struct node * head)
{
struct node * ph1=NULL,* ph2=NULL,* ph3=NULL,* p1=NULL,* p2=NULL;
int account,j;
for(j=0;j<3;j++)
{
p1=p2=head;
account=0;
printf("categrize start\n");
do
{ /*判断第一个点是不是匹配的点*/
if((head->Source_addr[0]==compare[j][0])&&(head->Source_addr[1]==compare[j][1]))
{
if(headers[j]==NULL)
{
p2=p2->next;
headers[j]=p1;
ph1=headers[j];
head=p2;
account++;
p1=p1->next;
{if((p2->next==NULL)||(p1->next==NULL))break;}
}
else
{
p2=p2->next;
ph1->next=p1;
head=p2;
account++;
ph1=ph1->next;
p1=p1->next;
}
}
/*如果不是head指的那个节点且headers[j]为空时,则p2=p2->next,再判断*/
else if((headers[j]==NULL)&&((p2->next!=NULL)||(p1->next!=NULL)))
{
p2=p2->next;
while(!((p2->Source_addr[0]==compare[j][0])&&(p2->Source_addr[1]==compare[j][1])))
{
p2=p2->next;
p1=p1->next;
{if((p2->next==NULL)||(p1->next==NULL))break;}
}
{if((p2->next==NULL)||(p1->next==NULL))break;}
headers[j]=p2;
ph1=headers[j];
p1->next=p2->next;
account++;
}
/*如果*/
else if((headers[j]!=NULL)&&((p2->next!=NULL)||(p1->next!=NULL)))
{ p2=p2->next;
while(!((p2->Source_addr[0]==compare[j][0])&&(p2->Source_addr[1]==compare[j][1])))
{
p2=p2->next;
p1=p1->next;
{if((p2->next==NULL)||(p1->next==NULL))break;}
}
ph1->next=p2;
p1->next=p2->next;
account++;
ph1=ph1->next;
}
else break;
}
while(accountNumber);
printf("categerizing is complete!\n");
}
}
/***************************分类完成,下面分别顺序输出***********************************************************/
void sequence_func(struct node * headers[])
{
struct node * ph1=NULL;
FILE * fp1[3];
if((fp1[0]=fopen("BJ.c","w"))==NULL)
{
printf("cannot open BJ.C\n");
}
if((fp1[0]=fopen("BJ.c","a"))==NULL)
{
printf("cannot write to BJ.C\n");
}
if((fp1[1]=fopen("SH.c","w"))==NULL)
{
printf("cannot open SH.C\n");
}
if((fp1[1]=fopen("SH.c","a"))==NULL)
{
printf("cannot write to SH.C\n");
}
if((fp1[2]=fopen("GZ.c","w"))==NULL)
{
printf("cannot open GZ.C\n");
}
if((fp1[2]=fopen("GZ.c","a"))==NULL)
{
printf("cannot write to GZ.C\n");
}
int i,j,k;
for(j=0;j<3;j++)
{
if(headers[j]!=NULL)
{
ph1=headers[j];
for(i=1;i<=(ph1->Number);i++)
{
ph1=headers[j];
while(((ph1->sequence)!=i)&&(ph1->next!=NULL))
{
ph1=ph1->next;
}
for(k=0;k<10;k++)
{
fputc(ph1->Data[k],fp1[j]);
putchar(ph1->Data[k]);
}
}
/*当ph1->order=1时,将ph1->data写入fp1[j]*/
}
else printf("no data come from %c%c\n",compare[j][0],compare[j][1]);
fclose(fp1[j]);
}
}
void main()
{ struct node * p1=NULL,* p2=NULL;
p1=(struct node * )malloc(LEN);
head=p1;
Read_func(p1,p2,head);
catgeriz_func(head);
sequence_func(headers);
}
[[it] 本帖最后由 suse51 于 2008-5-31 17:54 编辑 [/it]]