啊后天就ddl了还叫我去喝酒,让我小酌我哪能不去。
我自己的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int data[100];
int last;
}list;
int delet(list* L3, list* L);
int search(list* L1, list* L2, list* L);
int main()
{
list* L = (list*)malloc(sizeof(list));
int m , n, p;
list* A = (list*)malloc(sizeof(list));
list* B = (list*)malloc(sizeof(list));
list* C = (list*)malloc(sizeof(list));
A->last = 0;
B->last = 0;
C->last = 0;
L->last = 0;
scanf("%d %d %d", &m, &n, &p);
for (int i = 0; i < m; i++)
{
scanf("%d", &A->data[i]);
A->last++;
}
for (int i = 0; i < n; i++)
{
scanf("%d", &B->data[i]);
B->last++;
}
for (int i = 0; i < p; i++)
{
scanf("%d", &C->data[i]);
C->last++;
}
search(B, C, L);
delet(A, L);
for (int i = 0; i < (A->last)-1; i++)
{
printf("%d ", A->data[i]);
}
printf("%d", A->data[A->last]);
}
int search(list* L1, list* L2, list* L)
{
int k = 0;
for (int i = 0; i < L1->last; i++)
{
for (int j = 0; j < L2->last; j++)
{
if (L1->data[i] == L2->data[j])
{
L->data[k] = L1->data[i];
k++;
L->last++;
}
}
}
return 0;
}
int delet(list* L3, list* L)
{
for (int i = 0; i < L3->last; i++)
{
for (int j = 0; j < L->last; j++)
{
if (L3->data[i] == L->data[j])
{
int m = i;
while (m < L3->last)
{
L3->data[m] = L3->data[m+1];
m++;
L3->last--;
}
}
}
}
return 0;
}
交给chat修改后:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data[100];
int last;
} list;
int delet(list* L3, list* L);
int search(list* L1, list* L2, list* L);
int main() {
list* L = (list*)malloc(sizeof(list));
int m, n, p;
list* A = (list*)malloc(sizeof(list));
list* B = (list*)malloc(sizeof(list));
list* C = (list*)malloc(sizeof(list));
A->last = 0;
B->last = 0;
C->last = 0;
L->last = 0;
scanf("%d %d %d", &m, &n, &p);
for (int i = 0; i < m; i++) {
scanf("%d", &A->data[i]);
A->last++;
}
for (int i = 0; i < n; i++) {
scanf("%d", &B->data[i]);
B->last++;
}
for (int i = 0; i < p; i++) {
scanf("%d", &C->data[i]);
C->last++;
}
search(B, C, L);
delet(A, L);
for (int i = 0; i < A->last - 1; i++) {
printf("%d ", A->data[i]);
}
printf("%d\n", A->data[A->last - 1]);
// 释放动态分配的内存
free(A);
free(B);
free(C);
free(L);
return 0;
}
int search(list* L1, list* L2, list* L) {
int k = 0;
for (int i = 0; i < L1->last; i++) {
for (int j = 0; j < L2->last; j++) {
if (L1->data[i] == L2->data[j]) {
L->data[k] = L1->data[i];
k++;
L->last++;
break; // 找到相同元素后跳出内层循环
}
}
}
return 0;
}
int delet(list* L3, list* L) {
int* delete_flag = (int*)calloc(L3->last, sizeof(int)); // 标记哪些元素需要删除
for (int i = 0; i < L3->last; i++) {
for (int j = 0; j < L->last; j++) {
if (L3->data[i] == L->data[j]) {
delete_flag[i] = 1; // 标记为需要删除
break; // 找到相同元素后跳出内层循环
}
}
}
int k = 0;
for (int i = 0; i < L3->last; i++) {
if (!delete_flag[i]) { // 如果不需要删除,则保留元素
L3->data[k++] = L3->data[i];
}
}
L3->last = k; // 更新最后一个元素的索引
free(delete_flag); // 释放标记数组的内存
return 0;
}
其实我觉得我能独立写出这么一长段算是大进步了哈哈哈。总结一下失误:
int search(list* L1, list* L2, list* L) {
int k = 0;
for (int i = 0; i < L1->last; i++) {
for (int j = 0; j < L2->last; j++) {
if (L1->data[i] == L2->data[j]) {
L->data[k] = L1->data[i];
k++;
L->last++;
break; // 找到相同元素后跳出内层循环
}
}
}
return 0;
}
1.在找两个列表的相同元素时,遇到一个相同元素即可跳出循环没必要一直走下去;
int delet(list* L3, list* L) {
int* delete_flag = (int*)calloc(L3->last, sizeof(int)); // 标记哪些元素需要删除
for (int i = 0; i < L3->last; i++) {
for (int j = 0; j < L->last; j++) {
if (L3->data[i] == L->data[j]) {
delete_flag[i] = 1; // 标记为需要删除
break; // 找到相同元素后跳出内层循环
}
}
}
int k = 0;
for (int i = 0; i < L3->last; i++) {
if (!delete_flag[i]) { // 如果不需要删除,则保留元素
L3->data[k++] = L3->data[i];
}
}
L3->last = k; // 更新最后一个元素的索引
free(delete_flag); // 释放标记数组的内存
return 0;
}
2.其实这里我不太懂为什么我原来的查找到相同就直接删除会有什么问题,但是chat说“在delet函数中,当删除元素后,应该将 L3->last减1,而不应该在内层循环中递减,因为这会导致多个元素被跳过。你可以使用一个标记数组来标记哪些元素需要删除,然后再统一删除。”不是很懂。
那就学着gpt建一个标记数组好了。