全国软件专业人才开发与设计赛题之中等题“统计省份人员信息”

2.2基于人员名单:

李爱华,北京

张立,吉林
吴祖含,上海
张颖,河北
李文虎,北京
许林,湖南
赵平复,河北
唐笑,北京
刘小明,河北

董其云,北京

统计其信息,输出格式如下:

北京

李爱华

李文虎 

唐笑 

董其云

河北

1

……

其中省份不用考虑顺序,人员之间不用考虑顺序。

 参考程序:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 
  5 FILE *stream;
  6 FILE *streamOut;
  7 
  8 
  9 //构造存储结构
 10 struct Node{
 11     char Pro[20];//存储省份
 12     char Name[50];//存储名字
 13     int counts;
 14     Node* nextPro;//下一省份结点
 15     Node* nextName;//下一人员结点
 16 };
 17 
 18 Node root;//根结点
 19 
 20 //添加新的省份到链表中
 21 void addPro(Node* node)
 22 {
 23     Node* tNode=root.nextPro;
 24     root.nextPro=node;
 25     node->nextPro=tNode;//插入结点
 26 }
 27 
 28 //插入proNode结点后名字
 29 //pronode中的省份跟新插入结点的省份相同
 30 void addName(Node* proNode,Node* node)
 31 {
 32     Node* pNode=proNode->nextName;
 33     proNode->nextName=node;
 34     node->nextName=pNode;
 35     proNode->counts++;
 36 }
 37 
 38 //添加一个结点,根据判断是否之前出现过,进行插入或者新建的工作
 39 //需要调用addName()和addPro()两个函数
 40 void addNode(Node* node)
 41 {
 42     if(root.nextPro==NULL)//首次加入
 43     {
 44         root.nextPro=node;
 45     }
 46     else
 47     {
 48         //循环找到相同的省份头结点
 49         Node* cuNode=root.nextPro;
 50         while(cuNode!=NULL && strcmp(cuNode->Pro,node->Pro)!=0)
 51         {
 52             cuNode=cuNode->nextPro;
 53         }
 54         if(cuNode==NULL)//没有找到相同省份的结点出现
 55         {
 56             addPro(node);
 57         }
 58         else
 59         {
 60             addName(cuNode,node);
 61         }
 62     }
 63 }
 64 
 65 //对同级的结果进行格式化的输出
 66 void outputFile()
 67 {
 68     if ((streamOut = fopen( "人员名单2.txt""w" )) != NULL)
 69     {
 70         Node* pNode=root.nextPro;
 71         while(pNode!=NULL)
 72         {
 73             fprintf(streamOut,"%s",pNode->Pro);
 74             fprintf(streamOut,"%d\n",pNode->counts);
 75             for(Node* t=pNode;t!=NULL;t=t->nextName)
 76             {
 77                 fprintf(streamOut,"%s\n",t->Name);
 78                 if(t->nextName==NULL)
 79                     fprintf(streamOut,"\n");
 80             }
 81             pNode=pNode->nextPro;
 82         }
 83         fclose( streamOut );
 84     }
 85 }
 86 
 87 
 88 void releaseNode()
 89 {
 90 
 91     Node* tNode=root.nextPro;
 92     Node* toDel;
 93     while(tNode!=NULL)
 94     {
 95         Node* delN=tNode->nextName;
 96         while(delN!=NULL)
 97         {
 98             Node* de=delN;
 99             delN=delN->nextName;
100             free(de);
101         }
102         toDel=tNode;
103         tNode=tNode->nextPro;
104         free(toDel);
105     }
106 }
107 int main()
108 {
109     
110     char line[100];
111     int position;
112 
113     //初始化
114     root.nextPro=NULL;
115     root.nextName=NULL;
116 
117     if( (stream = fopen( "人员名单.txt""r" )) != NULL )
118     {
119         //printf("打开成功\n");
120         while(fgets( line, 100, stream ) != NULL)
121         {
122             int len=strlen(line);
123             //printf("%d\n",len);
124             if(feof(stream))
125             {
126                 line[len]='\n';
127                 line[len+1]='\0';
128                 len=strlen(line);
129                 //printf("%d\n",len);
130             }
131             
132             position=strcspn(line,",");
133             if(position!=0)//分隔成功
134             {
135                 line[position]='\0';
136                 Node* node=(Node*)malloc(sizeof(Node));
137                 //清空数据
138                 //memset(node->Pro,0,sizeof(node->Pro));
139                 //memset(node->Name,0,sizeof(node->Name));
140                 node->nextPro=NULL;
141                 node->nextName=NULL;
142                 node->counts=1;
143                 strcpy(node->Name,line);
144                 strcpy(node->Pro,&line[position+1]);
145                 addNode(node);
146             }
147             //printf( "%s", line);
148         }
149         outputFile();
150         releaseNode();
151         fclose( stream );
152         
153     }
154     return 1;
155 }
156 

版权声明版权归作者WeiSteven所有,转载请注明! 

原文地址:https://www.cnblogs.com/weisteve/p/1804907.html