| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 878 人关注过本帖
标题:求助!请问如何对链表中的数据节点分类并排序(已解决,代码在里面)
只看楼主 加入收藏
suse51
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-16
收藏
 问题点数:0 回复次数:2 
求助!请问如何对链表中的数据节点分类并排序(已解决,代码在里面)
大家好,我是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]]
搜索更多相关主题的帖子: 链表 节点 数据 分类 
2008-05-24 10:45
suse51
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-16
收藏
得分:0 
我已经编出来了
2008-05-31 10:03
suse51
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-16
收藏
得分:0 
不好意思,上次给的程序错了,现在已改正
2008-05-31 17:55
快速回复:求助!请问如何对链表中的数据节点分类并排序(已解决,代码在里面)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022680 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved