NWPU DS 头歌1-3 顺序表的删除

啊后天就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建一个标记数组好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值