c语言将数据排序并放入链表,求助!请问如何对链表中的数据节点分类并排序(已解决,代码在里面)...

这篇博客介绍了一位C语言初学者如何根据题目要求,从数据流中解析出包含源地址、目标地址等信息的数据包,通过链表结构进行分类和排序。博主分享了详细代码,实现了对来自不同方向数据包的识别、分类和按顺序输出到对应文件的过程。
摘要由CSDN通过智能技术生成

求助!请问如何对链表中的数据节点分类并排序(已解决,代码在里面)

大家好,我是C的初学者,以前几乎没编过什么程序。最近,老师让我做一个包交换接收端的软件模拟,一开始不知该怎么做,希望大家能帮忙,结果六天过去了也无人问津,是不是这个问题太基础了,大家都不愿回帖,呵呵。

后来,我有花了5天把它调好了,。编的可能有很多费语句,还可以再改,不过总算能运行了,现在我把它贴出来,希望能给跟我一样有问题的初学者看看,呵呵。

题目要求:

现在有一个数据流(自己把它做成一个文件存在磁盘上,再调到内存了),里面有来自三个方向的9个数据包,每个方向来的都是一个完整的文本文件(北京4个,上海3个,广州2个),而且顺序是乱的,现在编程将这个数据流分类,排序,然后顺序输出。

注:一个包包括报头和报文,最后要将三个方向来的三个文本输出,写到三个文件里。

报头格式(char型):一个包的开始是一个空格加KKKK,源地址(2byte),目的地址(2byte,目前固定为XA),日期(080515),总数(2byte),次序(2byte)。

报文:固定为10byte。

21c92f7342edc52acb5684b0b88bdcec.png程序代码:# 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]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值