01/10/2018, 08:26

Cấp phát động cho mảng 1 chiều

#include <stdio.h>
#include <stdlib.h>
void nhapmang (int a[],int n);
void xuatmang (int a[],int n);
void xoa(int a[],int &n,int vt);
main()
{
	int n,vt,x;
	int *a;
	do
	{
		printf("Nhap so phan tu n:");
		scanf("%d",&n);
		if(n<0)
			printf("Nhap n >0
");
	}while (n<0);
	a=(int *)malloc(n*sizeof(int));
	printf("	NhapMang
");
	nhapmang(a,n);
	printf("	XuatMang
");
	xuatmang(a,n);
	printf("
Nhap vt can xoa:");scanf("%d",&vt);
	xoa(a,n,vt);
	printf("	XuatMang
");
	xuatmang(a,n);
	printf("
%5d",a[4]);
	free(a);
}
void nhapmang (int a[],int n)
{
	for(int i=0;i<n;i++)
		{
			printf("a%d=",i);
			scanf("%d",&a[i]);
		}
}
void xuatmang (int a[],int n)
{
	for(int i=0;i<n;i++)
		printf("%5d",a[i]);
}
void xoa(int a[],int &n,int vt)
{
	for(int i=vt;i<n-1;i++)
		a[i]=a[i+1];
	realloc(a, (n-1) * sizeof(int));
	n--;	
}

Hàm xóa phần tử mảng của mình , mặc dù đã realloc nhưng vẫn ko thế xóa vị trí của mảng

Người bí ẩn viết 10:35 ngày 01/10/2018
void xoa(int a[],int &n,int vt)
{
	for(int i=vt;i&lt;n-1;i++)
		a[i]=a[i+1];
	realloc(a, (n-1) * sizeof(int));
	n--;	
}

Khi bạn realloc lại 1 con trỏ hay 1 mảng thông qua hàm thì bạn phải tăng level của nó lên hoặc để tham chiếu cho nó, chứ chỉ để mỗi tham chiếu cho biến n thì đâu ăn nhằm gì. n không phải là kích thước của mảng đâu nhé, nó chỉ là con số tượng trưng cho kích thước của mảng thôi, nên tăng/giảm n không đồng nghĩa với việc kích thước của mảng sẽ tăng/giảm.
Nhưng bạn đang code C thì không nên dùng tham chiếu, thay vào đó là dùng con trỏ:

void xoa(int **a,int *n,int vt)
{
	for(int i = vt; i < n-1; ++i)
		(*a)[i] = (*a)[i+1];
	realloc(*a, (*n - 1) * sizeof(int));
	--(*n);
}

Còn thuật toán dùng trong code bạn tự kiểm tra nhé.

rogp10 viết 10:40 ngày 01/10/2018

Cái này khá nguy hiểm vì khi a là mảng tĩnh mà bạn realloc thì… vì viết như vậy người ta vẫn feed mảng tĩnh vào đc.

An viết 10:31 ngày 01/10/2018

Cái này mình cấp phát mảng động mà cậu

rogp10 viết 10:36 ngày 01/10/2018

Nó tạo ra một ràng buộc là phải dùng mảng động mới đúng, trong khi xóa (kiểu dời chỗ) đâu có cần

Bài liên quan
0