用链表实现
#include<string.h>
#include<stdlib.h>
void process(char* const str) { //把输入的字符串前面多余部分给“掐”掉
int i, j;
char* p;
for (i = 0; str[i] != ' '; i++);
for (j = i; j > i - 17; j--) {
if (str[j] == '\\') {
p = str + j + 1;
int k;
for (k = 0; p[k]; k++) {
str[k] = p[k];
}
str[k] = 0;
return;
}
}
p = str + i - 16;
int k;
for (k = 0; p[k]; k++) {
str[k] = p[k];
}
str[k] = 0;
}
typedef struct mlog_ {//记录错误信息、数量、next
char mis[22];
int n;
struct mlog_* next;
}mlog;
void add(mlog* head, mlog* node) {//读取一条错误信息到链表,有重复的合并,没重复的添加
mlog* p = head;
while (p->next != NULL) {
if (strcmp(p->mis, node->mis) == 0) {
p->n++;
return;
}
p = p->next;
}
if (strcmp(p->mis, node->mis) == 0) {
p->n++;
return;
}
p->next = node;
}
void print(mlog* head) {//打印最近8个
int i = 0;
mlog* p = head;
while (p->next) {
i++;
p = p->next;
}
while (i-->8) {
head = head->next;
}
while (head=head->next) {
printf("%s %d\n", head->mis, head->n);
}
}
int main() {
char str[102];
mlog* head = (mlog*)malloc(sizeof(mlog));
head->next = NULL;
while (fgets(str, 102, stdin)) {
process(str);
mlog* node = (mlog*)malloc(sizeof(mlog));
int i;
for (i = 0; str[i] != '\n'; i++) {
node->mis[i] = str[i];
}
node->mis[i] = 0;
node->n = 1;
node->next = NULL;
add(head, node);
}
print(head);
}