本文主要是介绍全国软件专业人才开发与设计赛题之中等题“统计省份人员信息”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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所有,转载请注明!
这篇关于全国软件专业人才开发与设计赛题之中等题“统计省份人员信息”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!