#include<iostream> #include<stdio.h> using namespace std; struct node { int content = 0; node* next = NULL; }; void input(node* head) { node* p; p = head; int a; while (1) { cin >> a; if (a == -1) return; node* q = new node; q->content = a; q->next = NULL; p->next = q; p = q; } } int main() { node* c = new node; c->next = NULL; input(c); node* e = new node; e->next = NULL; input(e); int f[100]={0}, g[100]={0}, h[100] = {0}; int i=0,k=0; while (c != NULL) { f[i] = c->content; c = c->next; i++; } int l = i; while (e != NULL) { g[k] = e->content; e = e->next; k++; } int t = k; int w = 0; //交集 for (int m = 0; m < t; m++) for (int n = 0; n < l; l++) { if (g[m] == f[n]) { h[w] = f[n]; w++; } else { h[w] = f[n]; h[w + 1] = g[m]; w = w + 2; } } for (int i = 0; i <= w; i++) cout << h[i] << endl; int r[100] = { 0 },y=0; //并集 for (int m = 0; m < t; m++) for (int n = 0; n < l; l++) { if (g[m] == f[n]) { r[y] = f[n]; y++; } } for (int i = 0; i <= y; i++) cout << r[i] << endl; int u[100] = { 0 },o=0; //差集 for (int m = 0; m < t; m++) for (int n = 0; n < l; l++) { if (g[m] == f[n]); else { u[o] = g[m]; u[o + 1] = f[n]; o= o + 2; } } for (int i = 0; i <= o; i++) cout << u[i] << endl; return 0; }
时间: 2024-01-22 19:01:38 浏览: 67
这段代码的功能是实现两个单链表的并集、交集和差集运算。其中,输入的单链表需要手动输入,以-1作为结束符。代码中使用数组来存储集合元素,分别用f、g、h、r、u表示不同的集合。具体实现过程如下:
1. 创建两个单链表c和e,并分别手动输入元素,用input函数实现。
2. 遍历链表c,将链表元素存储到数组f中,同时记录元素个数l。
3. 遍历链表e,将链表元素存储到数组g中,同时记录元素个数t。
4. 计算并集:对于f和g中的每个元素,如果它在另一个数组中出现过,则将其存储到数组r中。
5. 计算交集和差集:对于f和g中的每个元素,分别在另一个数组中查找是否存在。如果存在,则将其存储到数组h中(交集);如果不存在,则将其存储到数组u中(差集)。
6. 最后,遍历数组h、r、u,并输出其中的元素。
需要注意的是,代码中存在一些问题,例如交集和差集计算时的循环条件中,变量l和o应该是m和n的上限,而不是自身。另外,数组下标也存在越界的风险,应该在定义数组时指定足够的空间,或者使用动态数组。
相关问题
#include <iostream> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* insert(ListNode* head, int x) { ListNode* prev = NULL; ListNode* curr = head; while (curr != NULL && curr->val <= x) { prev = curr; curr = curr->next; } ListNode* node = new ListNode(x); if (prev == NULL) { node->next = head; return node; } else { node->next = prev->next; prev->next = node; return head; } } void printList(ListNode* head) { while (head != NULL) { cout << head->val << " "; head = head->next; } cout << endl; } int main() { int n, x; cin >> n; ListNode* head = NULL; for (int i = 0; i < n; i++) { int val; cin >> val; head = insert(head, val); } cin >> x; head = insert(head, x); printList(head); return 0; } 用c语言实现
以下是使用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode* next;
};
struct ListNode* insert(struct ListNode* head, int x) {
struct ListNode* prev = NULL;
struct ListNode* curr = head;
while (curr != NULL && curr->val <= x) {
prev = curr;
curr = curr->next;
}
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = x;
if (prev == NULL) {
node->next = head;
return node;
} else {
node->next = prev->next;
prev->next = node;
return head;
}
}
void printList(struct ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
int n, x;
scanf("%d", &n);
struct ListNode* head = NULL;
for (int i = 0; i < n; i++) {
int val;
scanf("%d", &val);
head = insert(head, val);
}
scanf("%d", &x);
head = insert(head, x);
printList(head);
return 0;
}
```
这个C语言版本的代码与C++版本的代码非常相似,只是语法和一些细节上有所不同。
#include"stdio.h" #include <iostream> #include <malloc.h> #include<windows.h> using namespace std; typedef struct employee { int no; char name[10]; int depno; float salary; } Worker; typedef struct node { Worker data; struct node *next; } WorkerList; static void destroy_employee( WorkerList *&L) { WorkerList *pre = L; WorkerList *p = pre->next; while(p != NULL) { free(pre); pre = p; p = p->next; } free(pre); } static void delete_all( WorkerList *&L) { FILE *fp = NULL; fp = fopen("emp.dat", "wb"); if(fp == NULL) { cout<<"不能打开职工文件\n\n\n"; return; } fclose(fp); destroy_employee(L); L = ( WorkerList *)malloc(sizeof( WorkerList)); L->next = NULL; cout<<"职工数据清除完毕\n\n\n"; } static void read_file( WorkerList *&L) { FILE *fp; Worker emp; WorkerList *p; WorkerList *r; int n = 0; L = ( WorkerList *)malloc(sizeof( WorkerList)); r = L; if((fp = fopen("emp.dat", "rb")) == NULL) { if((fp = fopen("emp.dat", "wb")) == NULL) { cout<<"不能创建emp.dat文件\n\n\n"; } } else { while(fread(&emp, sizeof( Worker), 1, fp) == 1) { p = ( WorkerList *)malloc(sizeof( WorkerList)); p->data = emp; r->next = p; r = p; n++; } } r->next = NULL; cout<<"职工单链表L建立完毕,有"<<n<<"个记录\n"; fclose(fp); } static void display_employee( WorkerList *L) { WorkerList *p = L->next; if(p == NULL) { cout<<"没有任何职工记录\n"; } else { cout<<" 职工号 姓名 部门号 薪水\n"; printf(" ----------------------------------------------\n"); while(p != NULL) { printf(" %3d %10s %-8d %7.2f\n", p->data.no, p->data.name, p->data.depno, p->data.salary); p = p->next; } cout<<" ------------------------把这段代码用自然语言描述
这段代码是一个职工管理系统,使用了链表来存储职工的信息。其中定义了一个职工结构体,包括职工号、姓名、部门号和薪水。另外还定义了一个链表结构体,包括职工信息和指向下一个节点的指针。代码中实现了一些功能,如清除所有职工信息、读取职工信息文件、显示职工信息等。其中,读取职工信息文件的函数会遍历文件中的每一个职工信息,将其存储在链表中,并计算出链表中职工信息的数量。最后,显示职工信息的函数会将链表中的职工信息逐一输出。
阅读全文