我遇到过必须实现队列类型数据结构的情况。就像这样:
(1)假设有一个数组数据[50] = {1,2,3,4,5,6};
(2)int Front必须指向第一个索引,而int必须指向必须指向最后一个索引。
(3)现在我必须添加这个数组的第一个和第二个元素。假设我这样做(i + 2 = 3)并且这个3将最后设置为后+ 1(数据[后+ 1]),现在当第二次执行时,我们不必考虑前两个元素(它们已经添加),所以在这种情况下我们可以做数据[front + 2]。 但是请注意这里,因为这个+2将仅在第一次完成,之后它将只是+1(因为我们只添加了一个元素,并且我们第一次添加了2个元素) 。添加时得到的元素必须像“3”那样到达索引的最后一个,最后会像{1,2,3,4,5,6,3}一样。
(4)所以我们必须考虑到
(4.a)每次加法后后加1。
(4.b)Front的增量为1(接受我们添加两个元素的第一个添加)。
(5)我这样做的想法如下:
#include <stdio.h>
#define MAX 50
int data[MAX];
int rear = - 1;
int front = - 1;
void main()
{
int rear=6, front=0;
data[size]={1,2,3,4,5,6};
int count=size;
//First do addition of the first two elements
data[rear]= data[0]+data[1];
for(i=front; i<size*2-1 ; i++) //we are doing data*2-1 because we know the final obtained on doing all the addition until there is 1 element will have the size (size*2-1).
{
do
{
//here we do addition data[rear+1]=data[front]+data[rear];
// rear++;
count--;
}while (count>1);
}
for(i=0; i<size*2-1 ; i++)
{
printf("%d ", data[i]); //Now this must print "1,2,3,4,5,6,3,6,9,12,21" (addition of element at front and rear)
}
}
**我的疑问是如何通过两次第一次加法增加Front,并在第一次加法后增加一次,这样第一次总是指向要添加的元素(增加并不困难,我已经这样做了)。 请帮我前面增加,算法和代码将非常感谢。
答案 0 :(得分:1)
int max = 50;
int index = 0;
int endIndex = 5; //You can compute the length. I will just hard code
int list[max] = {1,2,3,4,5,6};
int front = list[index];
int rear = list[endIndex];
while (index!= endIndex)
{
if (index==0)
{
index++;
list[endIndex+index] = front+list[index];
rear = list[endIndex+index];
index++;
front = list[index];
}
else
{
list[rear+1] = front + rear;
index++;
front = list[index];
rear = list[endIndex+index];
}
}
这应该做你想要的。我没有测试它,但我相信这就是你所描述的。
答案 1 :(得分:1)
最后我设法解决了这个问题,我将其他人的代码留在这里(如果他们将来使用它):
#include <stdio.h>
void main()
{
int max = 50;
int index = 0,Front=0,Rear,min,min2,location,i,location2,flag[30],check=0,j;
int data[50] = {1,2,3,4};
Rear=3;
//Rear=size-1
for(i=0; i<=Rear;i++)
{
flag[i]=0;
//printf("");
}
int count=Rear;
do
{
//printf("check5 \n ");
if(Front==0)
{
printf("check1 \n ");
Rear++;
data[Rear]=data[Front] +data[1];
flag[Front]=1;
flag[Rear]=0;
flag[1]=1;
printf("datafront: %d\n ", data[Front]);
printf("*****************dataRear: %d\n ", data[Rear]);
printf("Front : %d\n ", Front);
printf("Rear : %d \n", Rear);
//printf("flagRear: %d\n ", flag[Front]);
Front=Front+2;
//Rear++;
}
if(data[Front]==data[Rear] && flag[Rear] ==0 && flag[Front]==0 )
{
printf("check3 \n ");
printf("Front : %d\n ", Front);
// Rear++;
printf("Rear : %d \n", Rear);
printf("dataFront1: %d\n ", data[Front]);
printf("dataRear1: %d\n ", data[Rear]);
data[Rear+1]= data[Front] +data[Rear];
printf("************dataRear[Rear+1]: %d\n ", data[Rear+1]);
flag[Front]=1;
flag[Rear]=1;
flag[Rear+1]=0;
printf("check Front front : %d\n", Front);
for(j=Front+1;j<=Rear;j++)
{
if(flag[j]==0)
{
Front=j;
break;
}
}
// Front++;
Rear++;
}
if(data[Front]<data[Rear] && flag[Rear] ==0 && flag[Front]==0)
{
printf("check4 \n ");
printf("Front : %d\n ", Front);
printf("Rear : %d \n", Rear);
printf("dataFront1: %d\n ", data[Front]);
printf("dataRear1: %d\n ", data[Rear]);
printf("Flagcheck data[6].flag : %d \n",flag[6]);
int start= Front+2;
min= data[Front];
for(j=Front+1;j<=Rear;j++)
{
if(flag[j]==0)
{
min2=data[j];
location2=j;
printf("j = %d \n",j);
break;
}
}
location=Front;
for(i=start;i<=Rear;i++)
{
if (data[i] <min && flag[i]==0)
{
min=data[i];
location=i;
min2=min;
}
if (data[i]<min2&& flag[i]==0)
{
min2=data[i];
location2=i;
}
}
data[Rear+1]= min2+min;
printf("min= %d\n", min);
printf("min2= %d\n", min2);
printf("location= %d\n", location);
printf("location2= %d\n", location2);
printf(" ***********data[Rear+1] = %d\n", data[Rear+1]);
flag[location2]=1;
flag[location]=1;
flag[Rear+1]=0;
for(j=location+1;j<=Rear;j++)
{
if(flag[j]==0)
{
Front=j;
break;
}
}
Rear=Rear+1;
printf("Front : %d\n ", Front);
printf("Rear : %d \n", Rear);
}
//printf("\n");
//printf("Front : %d\n ", data[Front]);
//printf("Rear : %d \n", data[Rear]);
count--;
} while(Front!=Rear && count>0);
for (i=0;i<15;i++)
{
printf(" %d ", data[i]);
}
//char path[100]={'\0'};
//traverse_tree(data, 10,path);
printf("\n");
}
////