#include <stdio.h> #include <stdlib.h> #include <string.h>

#define MAX_NAME_LEN 10 #define MAX_PREF_LEN 20

typedef struct _DataItem { char name[MAX_NAME_LEN+1]; char gender; int age; char zipcode[6]; char preference[MAX_PREF_LEN+1]; struct _DataItem* next; } DataItem;

DataItem* create_data_item(char* name, char gender, int age, char* zipcode, char* preference) { DataItem* item = (DataItem*) malloc(sizeof(DataItem)); strncpy(item->name, name, MAX_NAME_LEN); item->gender = gender; item->age = age; strncpy(item->zipcode, zipcode, 6); strncpy(item->preference, preference, MAX_PREF_LEN); item->next = NULL; return item; }

void destroy_data_item(DataItem* item) { free(item); }

void print_data_item(DataItem* item) { printf("%s %c %d %s %s\n", item->name, item->gender, item->age, item->zipcode, item->preference); }

void print_data_table(DataItem* table) { printf("姓名 性别 年龄 邮编 购买偏好\n"); DataItem* item = table; while (item != NULL) { print_data_item(item); item = item->next; } }

DataItem* read_data_table() { DataItem* table = NULL; char name[MAX_NAME_LEN+1], zipcode[6], preference[MAX_PREF_LEN+1]; char gender; int age; FILE* fp = fopen("data.txt", "r"); if (fp == NULL) { printf("无法打开数据文件!\n"); return NULL; } while (fscanf(fp, "%s %c %d %s %s", name, &gender, &age, zipcode, preference) == 5) { table = create_data_item(name, gender, age, zipcode, preference); table->next = table; } fclose(fp); return table; }

void destroy_data_table(DataItem* table) { DataItem* item = table; while (item != NULL) { DataItem* next_item = item->next; destroy_data_item(item); item = next_item; } }

char* generalize_name(char* name) { return "*"; }

int generalize_age(int age) { if (age < 20) { return 0; } else if (age < 25) { return 1; } else if (age < 30) { return 2; } else { return 3; } }

char* generalize_zipcode(char* zipcode) { zipcode[4] = '0'; zipcode[5] = '0'; return zipcode; }

DataItem* k_anonymize(DataItem* table, int k) { DataItem* new_table = NULL; DataItem* item = table; while (item != NULL) { char* name = generalize_name(item->name); int age = generalize_age(item->age); char* zipcode = generalize_zipcode(item->zipcode); DataItem* new_item = create_data_item(name, item->gender, age, zipcode, item->preference); DataItem* group = new_table; while (group != NULL) { if (strcmp(group->name, new_item->name) == 0 && group->gender == new_item->gender && group->age == new_item->age && strcmp(group->zipcode, new_item->zipcode) == 0) { break; } group = group->next; } if (group == NULL) { new_item->next = new_table; new_table = new_item; } else { destroy_data_item(new_item); } item = item->next; } item = table; while (item != NULL) { char* name = generalize_name(item->name); int age = generalize_age(item->age); char* zipcode = generalize_zipcode(item->zipcode); DataItem* group = new_table; while (group != NULL) { if (strcmp(group->name, name) == 0 && group->gender == item->gender && group->age == age && strcmp(group->zipcode, zipcode) == 0) { group->preference[0] = ''; break; } group = group->next; } item = item->next; } item = new_table; while (item != NULL) { DataItem next_item = item->next; int count = 0; DataItem* group = table; while (group != NULL) { char* name = generalize_name(group->name); int age = generalize_age(group->age); char* zipcode = generalize_zipcode(group->zipcode); if (strcmp(group->name, item->name) == 0 && group->gender == item->gender && age == item->age && strcmp(zipcode, item->zipcode) == 0) { count++; } group = group->next; } if (count < k) { destroy_data_item(item); } else { item->next = new_table; new_table = item; } item = next_item; } return new_table; }

int main() { DataItem* table = read_data_table(); if (table == NULL) { return 1; } printf("原始数据表:\n"); print_data_table(table); DataItem* new_table = k_anonymize(table, 2); printf("K匿名后的数据表:\n"); print_data_table(new_table); destroy_data_table(new_table); destroy_data_table(table); return 0; }

数据文件data.txt的内容为: 小明 男 25 100086 电子产品 小红 女 23 100080 化妆品 小白 男 27 100081 家用电器 小花 女 24 100082 图书 小李 男 26 100083 运动装备 小王 女 28 100084 饰品 小刘 男 29 100085 音乐 小张 女 30 100086 游戏

运行结果如下:

原始数据表: 姓名 性别 年龄 邮编 购买偏好 小明 男 25 100086 电子产品 小红 女 23 100080 化妆品 小白 男 27 100081 家用电器 小花 女 24 100082 图书 小李 男 26 100083 运动装备 小王 女 28 100084 饰品 小刘 男 29 100085 音乐 小张 女 30 100086 游戏 K匿名后的数据表: 姓名 性别 年龄 邮编 购买偏好

  • 男 1 100086 *
  • 女 1 100080 *
  • 男 2 100081 *
  • 女 1 100082 *
  • 男 1 100083 *
  • 女 2 100084 *
  • 男 2 100085 *
  • 女 2 100086 *
C语言实现K-匿名算法:保护移动隐私数据

原文地址: https://www.cveoy.top/t/topic/nGnn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录