#include <stdio.h>
#include <stdlib.h>
#include"list.h"
#include<string.h>
void print_list(List *list);
void doUnion(List* listA,List* listB);
void deDuplicate(List *list);
void doIntersection(List* listA,List* listB);
void doDiffrence(List* listA,List* listB);
int find_list(List *list,void *data);
int list_menu(void) {
int i;
do {
printf("\n=======Menu=======\n");
printf("1. Insert nodeA\n");
printf("2. Insert nodeB\n");
printf("3. print nodeA\n");
printf("4. print nodeB\n");
printf("5. doUnion\n");
printf("6. doIntersection\n");
printf("7. doDiffrence\n");
printf("0. Quit\n");
printf("Input Operation : ");
scanf("%d", &i);
} while(i<0 || i>8);
return i;
}
void start(List* listA,List* listB) {
int i;
void *data;
char temp[100];
char * str;
while((i=list_menu())!=0) {
switch(i) {
case 1 :
printf(">Input data : ");
fflush(stdin);
gets(temp);
str = (char *)malloc(sizeof(temp)+1);
strcpy(str,temp);
list_ins_next(listA, NULL, str);
break;
case 2 :
printf(">Input data : ");
fflush(stdin);
gets(temp);
str = (char *)malloc(sizeof(temp)+1);
strcpy(str,temp);
list_ins_next(listB, NULL, str);
break;
case 3 :
print_list(listA);
break;
case 4 :
print_list(listB);
break;
case 5:
doUnion(listA,listB);
break;
case 6:
doIntersection(listA,listB);
break;
case 7:
doDiffrence(listA,listB);
break;
}
}
exit(0);
}
int is_check(char* temp)
{
int i;
for(i=0;i<strlen(temp);i++)
if(temp[i]<'0' ||temp[i]>'9')
{
return 1;
}
return 0;
}
void print_list(List *list)
{
void *data;
char temp[100];
ListElmt *element;
element=list->head;
if(element==NULL) {
printf("There is not data\n");
return;
}
while(1) {
strcpy(temp,(char *)(element->data));
if(is_check(temp))
printf("%s ", (char *)(element->data) );
else
printf("%d ",atoi((char *)(element->data) ));
if(list_is_tail(element))
break;
else
element=list_next(element);
}
}
void doUnion(List* listA,List* listB)
{
List listC;
list_init(&listC, free);
char tempA[100],tempB[100];
ListElmt *elementA,*elementB;
elementA=listA->head;
elementB=listB->head;
if(elementA==NULL) {
printf("A is not data\n");
return;
}
if(elementB==NULL) {
printf("B is not data\n");
return;
}
while(1) {
strcpy(tempA,(char *)(elementA->data));
if(!find_list(&listC,tempA)||(find_list(&listC,tempA)==-1))
list_ins_next(&listC, NULL, elementA->data);
while(1) {
strcpy(tempB,(char *)(elementB->data));
if(strcmp(tempA,tempB))
if(!find_list(&listC,tempB))
list_ins_next(&listC, NULL, elementB->data);
if(list_is_tail(elementB))
break;
else
elementB=list_next(elementB);
}
elementB=listB->head;
if(list_is_tail(elementA))
break;
else
elementA=list_next(elementA);
}
printf("\nUnion >> ");
print_list(&listC);
printf("\n");
}
void doIntersection(List* listA,List* listB)
{
List listC;
list_init(&listC, free);
char tempA[100],tempB[100];
ListElmt *elementA,*elementB;
elementA=listA->head;
elementB=listB->head;
if(elementA==NULL) {
printf("A is not data\n");
return;
}
if(elementB==NULL) {
printf("B is not data\n");
return;
}
while(1) {
strcpy(tempA,(char *)(elementA->data));
while(1) {
strcpy(tempB,(char *)(elementB->data));
if(!strcmp(tempA,tempB))
if(!find_list(&listC,tempB)||(find_list(&listC,tempB)==-1))
list_ins_next(&listC, NULL, elementB->data);
if(list_is_tail(elementB))
break;
else
elementB=list_next(elementB);
}
elementB=listB->head;
if(list_is_tail(elementA))
break;
else
elementA=list_next(elementA);
}
printf("\nIntersection >> ");
print_list(&listC);
printf("\n");
}
void doDiffrence(List* listA,List* listB)
{
List listC;
list_init(&listC, free);
int flag=0;
char tempA[100],tempB[100];
ListElmt *elementA,*elementB;
elementA=listA->head;
elementB=listB->head;
if(elementA==NULL) {
printf("A is not data\n");
return;
}
if(elementB==NULL) {
printf("B is not data\n");
return;
}
while(1) {
strcpy(tempA,(char *)(elementA->data));
while(1) {
strcpy(tempB,(char *)(elementB->data));
if(!strcmp(tempA,tempB))
{
flag=1;
break;
}
if(list_is_tail(elementB))
break;
else
elementB=list_next(elementB);
}
if(flag==0)
if(!find_list(&listC,tempA)||(find_list(&listC,tempA)==-1))
list_ins_next(&listC, NULL, elementA->data);
flag=0;
elementB=listB->head;
if(list_is_tail(elementA))
break;
else
elementA=list_next(elementA);
}
printf("\nDiffrence >> ");
print_list(&listC);
printf("\n");
}
int find_list(List *list,void *data){//있을시 return 1, 없을시 return 0
char temp[100];
ListElmt *element;
element=list->head;
if(element==NULL)
return -1;
while(1) {
strcpy(temp,(char *)(data));
if(is_check(temp))
{
if(strcmp((char *)(data),(char *)(element->data))==0 )
{
return 1;
}
else
{
if(list_is_tail(element))
{
return 0;
}
element=list_next(element);
}
}
else
{
if(atoi((char *)(data))==atoi((char *)(element->data)) )
{
return 1;
}
else
{
if(list_is_tail(element))
{
return 0;
}
element=list_next(element);
}
}
}
}
int main(void) {
List listA,listB;
list_init(&listA, free);
list_init(&listB, free);
start(&listA,&listB);
system("pause");
}