gpt4 book ai didi

c - 指向另一个结构中的结构的双指针

转载 作者:行者123 更新时间:2023-11-30 14:32:24 25 4
gpt4 key购买 nike

我是一年级学生,我正在开始学习 C 语言的编程冒险。我被分配了一个我不知道该怎么做的作业。在这个程序中,我需要使用 malloc、void 函数、指针和结构。

这是作业:

1.创建预定数量的图形。使用malloc为这些图形分配内存。

2.添加新图形。

3.去除随机人物。

4.为随机图形添加一个点。

5.从图形中删除随机点。

6.显示所有数字。如果图形有 1 个点,则打印“it is a point”。如果图形有 2 个点,则打印“it is a line”。如果图形有 3 个点,则打印“它是一个三角形”等

程序需要由以下几行组成(但您可以添加一些内容)。

struct Point 
{
int x, y;
};

struct Figura
{
unsigned short size;
struct Point **p;
};

这是我的不合逻辑的代码,采用了奇怪的方法。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include <time.h>
#include <string.h>

#define SIZE 20

struct Point{
int x;
int y;
};


struct figure{
unsigned short size;
struct Point **p;//I have no idea how to work with this.
char figure[SIZE];
};

void create_space_for_points(struct Point ***point,int beginning_quanity);

void create_space_for_figures(struct figure ***figure,int beginning_quanity);

void ceating_base_of_figures(struct Point **point,struct figure **figure,int beginning_quanity,int *quanity,int *sum_of_points);

void adding_figure(struct Point ***point,struct figure ***figure,int *quanity,int *sum_of_points);

void showing_figures(struct figure **figure,int quanity);








int main()
{

struct figure **figure;
struct Point **point;
int beginning_quanity;
int *quanity=0;
int *sum_of_points=0;



printf("How many figures do you want to create?: ");
scanf("%d",&beginning_quanity);

//At this stage I am creating separate space for point and figures.
create_space_for_points(&point,beginning_quanity);
create_space_for_figures(&figure,beginning_quanity);


ceating_base_of_figures(point,figure,beginning_quanity,&quanity,&sum_of_points);//At this stage sometime it doesn't work. Maybe because of the memory.
adding_figure(&point,&figure,&quanity,&sum_of_points);//new figure is added at the end of list.
showing_figures(figure,quanity);







return 0;
}
//I am sure I made a mistake with memory allocation but I don't know where.
void create_space_for_points(struct Point ***point,int beginning_quanity){

struct Point **temp1=(struct Point**)malloc(beginning_quanity*sizeof(struct Point))

for(int i=0;i<beginning_quanity;i++)
temp1[i]=(struct Point*)malloc(beginning_quanity*sizeof(struct Point));


*point=temp1;



}

void create_space_for_figures(struct figure ***figure,int beginning_quanity){

struct figure **temp=(struct figure**)malloc(beginning_quanity*sizeof(struct figure));

for(int i=0;i<beginning_quanity;i++)
temp[i]=(struct figure*)malloc(sizeof(struct figure));


*figure=temp;
}

void ceating_base_of_figures(struct Point **point,struct figure **figure,int beginning_quanity,int *quanity,int *sum_of_points){
int number_of_points=0,i;


srand(time(NULL));
char word[SIZE];
for( i=0;i<beginning_quanity;i++){
char figures[SIZE];
for(int j=0;j<rand()%5+1;j++){
point[j]->x=rand()%10;
point[j]->y=rand()%10;
//printf("%d %d\n",punkt[j]->x,punkt[j]->y);
number_of_points++;
}


printf("-------Number of points-------\n%d",number_of_points);
if(number_of_points==1){
printf("----point----\n");
strcpy(word,"point");
strcpy(figure[i]->figure,word);

}
if(number_of_points==2){
printf("----line----\n");
strcpy(word,"line");
strcpy(figure[i]->figure,word);
}
if(number_of_points==3){
printf("----triangle----\n");
strcpy(word,"triangle");
strcpy(figure[i]->figure,word);
}
if(number_of_points==4){
printf("----square----\n");
strcpy(word,"square");
strcpy(figure[i]->figure,word);
}
if(number_of_points==5){
printf("----pentagon----");
strcpy(word,"pentagon");
strcpy(figure[i]->figure,word);
}

printf("\n");
*quanity=beginning_quanity;
sum_of_points+=number_of_points;
number_of_points=0;
}
printf("Number of figures: %d\n",*quanity);
}




void adding_figure(struct Point ***point,struct figure ***figure,int *quanity,int *sum_of_points){
int number_of_points;
char word[SIZE];
printf("How many points should a new figure have: ");
scanf("%d",&number_of_points);




int new_size=*quanity+1;

struct figure **temp=(struct figure **)malloc((new_size)*sizeof(struct figure*));

for(int i=0;i<*quanity;i++)
temp[i]=(*figure)[i];

temp[*quanity]=(struct figure*)malloc(sizeof(struct figure));





if(number_of_points==1){

strcpy(word,"point");
strcpy(temp[*quanity]->figure,word);

}
if(number_of_points==2){
strcpy(word,"line");
strcpy(temp[*quanity]->figure,word);
}
if(number_of_points==3){
strcpy(word,"triangle");
strcpy(temp[*quanity]->figure,word);
}
if(number_of_points==4){
strcpy(word,"square");
strcpy(temp[*quanity]->figure,word);
}
if(number_of_points==5){
strcpy(word,"pentagon");
strcpy(temp[*quanity]->figure,word);
}


free(*figure);
*figure=temp;
++(*quanity);
printf("\n");
printf("new number of figures: %d\n",*quanity);
number_of_points=0;



}
void showing_figures(struct figure **figure,int quanity){

for(int i=0;i<quanity;i++)
printf("----%s----\n",figure[i]->figure);


}

我被困在删除图形上,我什至不确定我是否正确使用了结构,而且我完全不知道如何向图形添加随机点或删除随机点。

最佳答案

如果您确定 struct Point **p; 不是拼写错误并且应该是 struct Point* 并且这就是整个赋值文本,其意图也许Point对象不属于Figura,并且它只是引用/指向一些单独拥有的点*。我会向你的老师寻求澄清。

在这种情况下,您只需将 Point* 视为您的“值”,并将 Figura 视为基本动态数组。

#include  <stdio.h>
#include <stdlib.h>

struct Point
{
int x, y;
};
struct Figura
{
unsigned short size;
struct Point **p;
};

// Note, you should also write a free function so that any Figura you create don't end up leaking memory!
void figura_init(struct Figura *f)
{
f->size = 0;
f->p = NULL;
}
// Point *p must be allocated elsewhere (stack, global, malloc, whatever)
// and must not be deleted before being removed from the Figura (or Figura itself deleted)
void figura_add_point(struct Figura *f, struct Point *p)
{
// Note not checking for duplicates
f->p = realloc(f->p, sizeof(struct Point*) * (f->size + 1)); // Expand array
f->p[f->size] = p; // Store p
++f->size;
}
void figura_remove_point(struct Figura *f, struct Point *p)
{
for (unsigned short i = 0; i < f->size; ++i)
{
if (f->p[i] == p)
{
// Not storing any specific order, so can remove an item by overwriting it with the last
f->p[i] = f->p[f->size - 1];
--f->size;
// Note, could free unused memory
return;
}
}
}

int main()
{
struct Point some_points[] = {{0,0}, {10,5}, {15,20}, {1, 4}, {5, 40}};
struct Figura fig;
figura_init(&fig);
figura_add_point(&fig, &some_points[1]);
figura_add_point(&fig, &some_points[3]);
figura_add_point(&fig, &some_points[4]);
for (unsigned short i = 0; i < fig.size; ++i)
{
printf("%d %d\n", fig.p[i]->x, fig.p[i]->y);
}
figura_remove_point(&fig, &some_points[3]);
printf("After remove.\n");
for (unsigned short i = 0; i < fig.size; ++i)
{
printf("%d %d\n", fig.p[i]->x, fig.p[i]->y);
}
}

关于c - 指向另一个结构中的结构的双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59822383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com