求助!请问如何对链表中的数据节点分类并排序(已解决,代码在里面)
大家好,我是C的初学者,以前几乎没编过什么程序。最近,老师让我做一个包交换接收端的软件模拟,一开始不知该怎么做,希望大家能帮忙,结果六天过去了也无人问津,是不是这个问题太基础了,大家都不愿回帖,呵呵。后来,我有花了5天把它调好了,。编的可能有很多费语句,还可以再改,不过总算能运行了,现在我把它贴出来,希望能给跟我一样有问题的初学者看看,呵呵。
题目要求:
现在有一个数据流(自己把它做成一个文件存在磁盘上,再调到内存了),里面有来自三个方向的9个数据包,每个方向来的都是一个完整的文本文件(北京4个,上海3个,广州2个),而且顺序是乱的,现在编程将这个数据流分类,排序,然后顺序输出。
注:一个包包括报头和报文,最后要将三个方向来的三个文本输出,写到三个文件里。
报头格式(char型):一个包的开始是一个空格加KKKK,源地址(2byte),目的地址(2byte,目前固定为XA),日期(080515),总数(2byte),次序(2byte)。
报文:固定为10byte。
程序代码:
# include <stdlib.h> # include <stdio.h> # include <string.h> # 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(account<headers[j]->Number); 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]]