全国软件专业人才开发与设计赛题之中等题“统计省份人员信息”
2.2基于人员名单:
李爱华,北京
张立,吉林吴祖含,上海
张颖,河北
李文虎,北京
许林,湖南
赵平复,河北
唐笑,北京
刘小明,河北
董其云,北京
统计其信息,输出格式如下:
北京
4
李爱华
李文虎
唐笑
董其云
河北
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
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所有,转载请注明!
作者:W.M.steve
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。