用c语言 编制一个能演示执行集合的交、并和差运算的程序。 【任务要求】 1)集合元素用小写英文字母,执行各种操作应以对话方式执行。 算法要点:利用单链表表示集合;有增删功能,对话用中文表示
时间: 2024-04-29 17:21:29 浏览: 17
好的,我来编写这个程序。首先,我们需要定义一个结构体来表示集合中的每个元素,包括元素值和指向下一个元素的指针。代码如下:
```c
typedef struct Node {
char data;
struct Node* next;
} Node;
```
接下来,我们定义一个结构体来表示集合,包括指向第一个元素的指针和集合大小。代码如下:
```c
typedef struct Set {
int size;
Node* head;
} Set;
```
现在我们可以开始编写各种操作了。首先是创建集合的函数,代码如下:
```c
Set* createSet() {
Set* set = (Set*)malloc(sizeof(Set));
set->size = 0;
set->head = NULL;
return set;
}
```
接下来是添加元素的函数,代码如下:
```c
void addElement(Set* set, char data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if (set->head == NULL) {
set->head = node;
} else {
Node* current = set->head;
while (current->next != NULL) {
if (current->data == data) {
printf("该元素已存在于集合中\n");
return;
}
current = current->next;
}
if (current->data == data) {
printf("该元素已存在于集合中\n");
return;
}
current->next = node;
}
set->size++;
printf("%c 已成功添加到集合中\n", data);
}
```
然后是删除元素的函数,代码如下:
```c
void removeElement(Set* set, char data) {
if (set->head == NULL) {
printf("集合为空,无法删除元素\n");
return;
}
Node* current = set->head;
Node* previous = NULL;
while (current != NULL) {
if (current->data == data) {
if (previous == NULL) {
set->head = current->next;
} else {
previous->next = current->next;
}
free(current);
set->size--;
printf("%c 已成功从集合中删除\n", data);
return;
}
previous = current;
current = current->next;
}
printf("%c 不在集合中,无法删除\n", data);
}
```
接下来是求交集的函数,代码如下:
```c
Set* intersection(Set* set1, Set* set2) {
Set* result = createSet();
Node* current1 = set1->head;
while (current1 != NULL) {
Node* current2 = set2->head;
while (current2 != NULL) {
if (current1->data == current2->data) {
addElement(result, current1->data);
break;
}
current2 = current2->next;
}
current1 = current1->next;
}
return result;
}
```
然后是求并集的函数,代码如下:
```c
Set* unionSet(Set* set1, Set* set2) {
Set* result = createSet();
Node* current1 = set1->head;
while (current1 != NULL) {
addElement(result, current1->data);
current1 = current1->next;
}
Node* current2 = set2->head;
while (current2 != NULL) {
addElement(result, current2->data);
current2 = current2->next;
}
return result;
}
```
最后是求差集的函数,代码如下:
```c
Set* difference(Set* set1, Set* set2) {
Set* result = createSet();
Node* current1 = set1->head;
while (current1 != NULL) {
Node* current2 = set2->head;
while (current2 != NULL) {
if (current1->data == current2->data) {
break;
}
current2 = current2->next;
}
if (current2 == NULL) {
addElement(result, current1->data);
}
current1 = current1->next;
}
return result;
}
```
现在我们可以编写一个主函数来进行对话式操作了。代码如下:
```c
int main() {
Set* set1 = createSet();
Set* set2 = createSet();
printf("请输入第一个集合的元素,以空格分隔(例如:a b c)\n");
char input[256];
fgets(input, 256, stdin);
char* token = strtok(input, " ");
while (token != NULL) {
addElement(set1, token[0]);
token = strtok(NULL, " ");
}
printf("第一个集合:");
printSet(set1);
printf("请输入第二个集合的元素,以空格分隔(例如:a b c)\n");
fgets(input, 256, stdin);
token = strtok(input, " ");
while (token != NULL) {
addElement(set2, token[0]);
token = strtok(NULL, " ");
}
printf("第二个集合:");
printSet(set2);
while (1) {
printf("请选择要执行的操作:\n");
printf("1. 求交集\n");
printf("2. 求并集\n");
printf("3. 求差集\n");
printf("4. 添加元素到第一个集合\n");
printf("5. 添加元素到第二个集合\n");
printf("6. 从第一个集合删除元素\n");
printf("7. 从第二个集合删除元素\n");
printf("8. 退出程序\n");
int choice;
scanf("%d", &choice);
getchar();
switch (choice) {
case 1: {
Set* result = intersection(set1, set2);
printf("交集结果:");
printSet(result);
break;
}
case 2: {
Set* result = unionSet(set1, set2);
printf("并集结果:");
printSet(result);
break;
}
case 3: {
Set* result = difference(set1, set2);
printf("差集结果:");
printSet(result);
break;
}
case 4: {
printf("请输入要添加到第一个集合的元素\n");
char data = getchar();
getchar();
addElement(set1, data);
printf("第一个集合:");
printSet(set1);
break;
}
case 5: {
printf("请输入要添加到第二个集合的元素\n");
char data = getchar();
getchar();
addElement(set2, data);
printf("第二个集合:");
printSet(set2);
break;
}
case 6: {
printf("请输入要从第一个集合删除的元素\n");
char data = getchar();
getchar();
removeElement(set1, data);
printf("第一个集合:");
printSet(set1);
break;
}
case 7: {
printf("请输入要从第二个集合删除的元素\n");
char data = getchar();
getchar();
removeElement(set2, data);
printf("第二个集合:");
printSet(set2);
break;
}
case 8: {
printf("程序已退出\n");
return 0;
}
default: {
printf("无效的选择,请重新输入\n");
break;
}
}
}
}
```
最后,我们需要编写一个函数来打印集合,代码如下:
```c
void printSet(Set* set) {
if (set->size == 0) {
printf("空集\n");
} else {
printf("{ ");
Node* current = set->head;
while (current != NULL) {
printf("%c ", current->data);
current = current->next;
}
printf("}\n");
}
}
```
好的,程序编写完成了。运行程序,您可以按照对话提示来操作集合的交、并和差运算。