用链表写数学交集并集

好久不见      


/*******************************************************

间:2017年6月29日-2017年6月30日
者:零起点
能:1.合并数组的相同元素
2.计算 交
3.计算 并
*******************************************************/
/*所需要的库文件*/
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
/*字符常量——宏常量*/
#define The_window_name  "集合系统  1.0"    /*窗 口 名 字*/
#define Window_width 600 /*窗 口 宽   */
#define window_high  600 /*窗 口 高 */
#define MaxLen       100 /*最大数据数*/
/*自定义结构体*/
typedef struct AsseMble
{
int data; /*数据*/
struct AsseMble * PAsseMble; /*指针域*/
}ASSEMBLE,*PASSEMBLE; /*ASSEMBLE==struct AsseMble        
PASSEMBLE==struct AsseMble *              */
/*自定义函数*/
PASSEMBLE create_List(void); /*创建数据链*/
int data_number(PASSEMBLE Data); /*统计数据的长度*/
void Organizing_the_Data(PASSEMBLE Data); /*整理数据(防止数据重复)*/
void Seqencing_list(PASSEMBLE Data); /*排序链表*/
void delete_node(PASSEMBLE data, int *num); /*删除节点*/
void insert_list(PASSEMBLE data, int *num); /*追加数据*/
void  Output_Data(PASSEMBLE Data); /*输出数据*/
void function(PASSEMBLE, PASSEMBLE); /*工具箱*/
PASSEMBLE Union_Algorithm(PASSEMBLE data1, PASSEMBLE data2); /*并集算法*/
PASSEMBLE Intersection_Algorithm(PASSEMBLE data1, PASSEMBLE data2);    /*交集算法*/
int main(void)
{


SetConsoleTitle(The_window_name); /*窗口的名称*/
system("mode con  cols=70 lines=30"); /*设置窗口的缓冲区的大小       目的去掉滚动条*/
SetWindowPos(FindWindow(NULL, The_window_name), /*获取窗口句柄*/
HWND_TOPMOST, /*设置窗口的非顶层窗口之上    类似于 QQ的登入界面*/
(GetSystemMetrics(SM_CXSCREEN) - Window_width) / 2, (GetSystemMetrics(SM_CYSCREEN) - window_high) / 2, /*窗口居中显示在屏幕上*/
Window_width, window_high, SWP_SHOWWINDOW); /*窗口大小          显示窗口*/
printf("请输入集合A的值\n");
PASSEMBLE Data1_list = create_List(); /*创建链表数据并赋值*/
printf("正在整理集合A的值\n"); /*提示用户*/
Sleep(2000); /*延时2秒*/
Organizing_the_Data(Data1_list); /*整理数据(防止数据重复)*/
printf("最后集合A的值:"); /*提示用户*/
Output_Data(Data1_list); /*输出整理后的数据*/
Sleep(2000); /*延时2秒*/
printf("请输入集合B的值\n"); /*提示用户*/
PASSEMBLE Data2_list = create_List(); /*创建链表数据并赋值*/
printf("正在整理集合B的值\n");
Sleep(2000);
Organizing_the_Data(Data2_list);
printf("最后集合B的值:");
Output_Data(Data2_list);
Sleep(2000);
system("cls"); /*清屏*/
function(Data1_list,Data2_list); /*进入正式界面并传递值*/
system("pause");
return 0;
}


PASSEMBLE Union_Algorithm(PASSEMBLE data1, PASSEMBLE data2)
{
PASSEMBLE Temporary_chain_list1 = data1->PAsseMble; /*创建临时变量去遍历数据*/
while (Temporary_chain_list1) {
PASSEMBLE Temporary_chain_list2 = data2->PAsseMble; /*创建临时变量去遍历数据*/
while (Temporary_chain_list2) {
if (Temporary_chain_list1->data == Temporary_chain_list2->data) { /*数据相同时*/
delete_node(data2, Temporary_chain_list2->data); /*删除data2 的数据*/
break;
}
else {
Temporary_chain_list2 = Temporary_chain_list2->PAsseMble; /*移动数据*/
}
}
Temporary_chain_list1 = Temporary_chain_list1->PAsseMble; /*移动数据   移动节点*/
}
PASSEMBLE Temporary_chain_list2 = data2->PAsseMble; /*创建临时变量去遍历数据*/
while (Temporary_chain_list2) {
insert_list(data1, Temporary_chain_list2->data); /*追加到data1里面*/
Temporary_chain_list2 = Temporary_chain_list2->PAsseMble; /*移动数据   移动节点*/
}
return data1; /*返回data1的数据*/
}


PASSEMBLE Intersection_Algorithm(PASSEMBLE data1, PASSEMBLE data2)
{
PASSEMBLE Temporary_node=(PASSEMBLE)malloc(sizeof(ASSEMBLE)); /*创建一个空链表  保存相同的数据*/
Temporary_node->PAsseMble = NULL; /*创建无效节点*/
PASSEMBLE Temporary_chain_list1 = data1->PAsseMble; /*创建临时遍历 变量   保存 data1的数据*/
while (Temporary_chain_list1) {
PASSEMBLE Temporary_chain_list2 = data2->PAsseMble; /*创建临时遍历 变量    保存 data2的数据*/
while (Temporary_chain_list2) {
if (Temporary_chain_list1->data == Temporary_chain_list2->data) { /*如果相等追加到*/
insert_list(Temporary_node, Temporary_chain_list2->data); /*追加到  链表Temporary_node里面*/
break; /*结束循环*/
}
Temporary_chain_list2 = Temporary_chain_list2->PAsseMble; /*移动节点*/
}
Temporary_chain_list1 = Temporary_chain_list1->PAsseMble; /*移动节点*/
}
return Temporary_node; /*返回数据*/
}


void function(PASSEMBLE  Data1, PASSEMBLE Data2)
{
int number; /*先定义一个变量用来用户选择功能用*/
PASSEMBLE The_data_set; /*保存得到的并集数据*/
PASSEMBLE Intersection_data; /*保存得到的交集数据*/
COORD pos = { 25,10 };    /* 光标的起始位(第1列,第3行) 0是第1列 2是第3行*/
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); /*定位输出数据*/
printf("=============菜单=============\n"); /*提示用户*/
pos.X = 30;
pos.Y = 11;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
printf("1.交集");
pos.Y = 12;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
printf("2.并集 ");
pos.X = 25;
pos.Y = 13;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
printf("==============================\n"); /*同上*/
A:
printf("请输入你想要的功能:"); /*提示用户*/
scanf("%d", &number);
switch (number)
{
case 1:
Intersection_data = Intersection_Algorithm(Data1, Data2); /*通过函数去实现*/
Seqencing_list(Intersection_data); /*排序*/
system("cls"); /*清屏*/
printf("交集为:"); /*提示用户*/
Output_Data(Intersection_data); /*输出数据*/
break;
case 2:
The_data_set = Union_Algorithm(Data1, Data2); /*通过函数去实现*/
Seqencing_list(The_data_set); /*排序*/
system("cls"); /*清屏*/
printf("并集为:"); /*提示用户*/
Output_Data(The_data_set); /*输出数据*/
default:
goto A; /*跳转语句*/
break;
}
}
PASSEMBLE create_List(void)
{
int Length = 0; /*定义一个保存的参数长度*/
A:
printf("请输入集合的个数:"); /*提示用户信息*/
scanf("%d", &Length); /*输入将数据保存到Length里面*/
rewind(stdin);
if (Length > MaxLen) {
printf("最大长度为100");
goto A;
}



PASSEMBLE Data = (PASSEMBLE)malloc(sizeof(ASSEMBLE)); /*动态分配内存*/
if (Data == NULL) { /*判断分配内存是否成功*/
printf("分配内存失败!\n"); /*提示用户信息*/
Sleep(5000); /*延时5秒*/
exit(-1); /*结束程序*/
}
PASSEMBLE Save_Data = Data; /*定义一个保存数据的变量 将data 的地址赋值于它*/
Save_Data->PAsseMble = NULL; /*将指针域赋值为空*/
for (int i = 0; i < Length; ++i) /*将数据保存到链表之中*/
{
printf("请输入第%d个元素的值:", i + 1);
PASSEMBLE Zero_Data = (PASSEMBLE)malloc(sizeof(ASSEMBLE)); /*零时变量用于接受值*/
if (Zero_Data == NULL) /*判断分配内存是否成功*/
{
printf("分配零时内存失败!\n"); /*提示用户信息*/
Sleep(5000); /*延时5秒*/
exit(-1); /*结束程序*/
}
scanf("%d", &Zero_Data->data); /*输入值*/
rewind(stdin); /*清理缓冲区*/
Save_Data->PAsseMble = Zero_Data; /*将数据传递给它*/
Zero_Data->PAsseMble = NULL; /*将Zero_Data的指针域 赋值为空指针*/
Save_Data = Zero_Data; /*将数据传递给Save_Data*/
}
return Data; /*将集合返回主函数*/
}


int data_number(PASSEMBLE Data)
{
int Length = 0; /*统计个数的变量*/
PASSEMBLE Zero_Data = Data->PAsseMble; /*把首地址付给临时变量*/
while (Zero_Data != NULL) /*判断是否有值*/
{
++Length; /*累加数据*/
Zero_Data = Zero_Data->PAsseMble; /*移动到下一个数据*/
}
return Length; /*返回长度*/
}


void Organizing_the_Data(PASSEMBLE Data)
{
Seqencing_list(Data); /*排序*/
int * t[MaxLen]; /*临时变量用来存放一样的值*/
int *Temporary_array[MaxLen]; /*保存链表的数据*/
int pos = -1, pos2 = -1; /*小标*/
PASSEMBLE Current_Data= Data->PAsseMble; /*临时变量 用来遍历*/
while (Current_Data) /*判断是否有数据*/
{
Temporary_array[++pos] = Current_Data->data; /*赋值*/
Current_Data = Current_Data->PAsseMble; /*移动节点*/
}
/*遍历数据提出一样的数据*/
for (int i = 0; i <= pos; ++i) {
for (int j = i+1; j <= pos; ++j) {
if (Temporary_array[i] == Temporary_array[j]) {
t[++pos2] = Temporary_array[j];
++i;
}
else {
break;
}
}
}
/*删除数据*/
for (int i = 0; i <= pos2; ++i)
{
delete_node(Data, t[i]);      
}
return;
}


void Seqencing_list(PASSEMBLE Data)
{
PASSEMBLE Current_Data, Mobile_Data; /*第一个变量是定位  二个是移动位置*/
Current_Data = Data->PAsseMble; /*把第一个数据赋值于它*/
while (Current_Data) /*判断是否有数据*/
{
Mobile_Data = Current_Data->PAsseMble; /*把下一个数据赋值与它*/
while (Mobile_Data) /*判断是否有数据*/
{
if (Current_Data->data < Mobile_Data->data) /*比较数据大小*/
{
int replace = Current_Data->data; /*交换数据*/
Current_Data->data = Mobile_Data->data;
Mobile_Data->data = replace;
}
Mobile_Data = Mobile_Data->PAsseMble; /*移动到下一个数据 */
}
Current_Data = Current_Data->PAsseMble; /*移动到下一个数据 */
}
return; /*告诉编译器此函数结束*/
}




void delete_node(PASSEMBLE data, int *num)
{
PASSEMBLE elem = data; /*将数据赋值于elem*/
PASSEMBLE temp = NULL; /*将它赋予空节点*/
while (elem){ /*判断链表是否有数据*/
temp = elem; /*将被查找的数据保存到temp 里面*/
elem = elem->PAsseMble; /*移动数据*/
if (elem == NULL) { /*如果移动到尾节点表示 此链表无数据了*/
printf("删除失败!!\n"); /*提示用户*/
return; /*告诉编译器此函数结束*/
}else if (elem->data == num) { /*找到数据*/
temp->PAsseMble = elem->PAsseMble; /*删除节点*/
free(elem); /*释放内存*/
return; /*告诉编译器此函数结束*/
}
}
}


void insert_list(PASSEMBLE data, int * num)
{
PASSEMBLE Private_Node = data; /*创建临时变量  去遍历数据*/
PASSEMBLE Temporary_node = (PASSEMBLE)malloc(sizeof(ASSEMBLE)); /*创建临时节点*/
while (Private_Node->PAsseMble){ /*判断是否有数据*/
Private_Node = Private_Node->PAsseMble; /*移动数据   移动节点*/
}
Temporary_node->data = num; /*将数据临时保存到节点里面*/
Temporary_node->PAsseMble = NULL; /*创建一个无效节点*/
Private_Node->PAsseMble = Temporary_node; /*追加到data里面*/
return; /*告诉编译器此函数结束*/
}


void Output_Data(PASSEMBLE Data)
{
PASSEMBLE Zero_Data = Data->PAsseMble; /*把首地址付给临时变量*/
while (Zero_Data){ /*判断是否有值*/
printf("%d ", Zero_Data->data); /*输出数据*/
Zero_Data = Zero_Data->PAsseMble; /*移动到下一个数据*/
}
printf("\n");
return; /*告诉编译器此函数结束*/
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值