我有一个嵌套的结构,"内部结构"是与成员的日期结构;日,月和年。结构包含在动态数组中。我想遍历结构并找到哪个结构具有最早的日期。我是编程新手,不太清楚如何处理这个问题。请帮忙。谢谢!
#include <stdio.h>
#include <stdlib.h>
//define structure to store students birth date
struct date
{
int month;
int day;
int year;
};
//define structure to store student info and date structure for birth date
struct studentInfo
{
int iD;
struct date birthDate;
int phone;
};
int main(void)
{
//declare and initialize variables
int recNum = 0; //number of records
struct studentInfo * records = NULL; //struct pointer, array
//request user input and store in recNum for record amount
printf("\nHow many students do you need to enter records for?:");
scanf ("%d",&recNum);
//dynamically allocate memory
records = (struct studentInfo*)malloc((sizeof(struct studentInfo)*recNum));
//loop through records and request/store values from user
int count;
int studentNum=1;
for(count=0;count<recNum;count++)
{
printf("Please enter the following for student number %d\n",studentNum);
//request and store student ID
printf("Student ID#:");
scanf ("%d",&records[count].iD);
//request and store student phone number
printf("Student phone# (numbers only, 10 digits):");
scanf ("%d",&records[count].phone);
//error checking, check if phone number is 10 digits
int phoneCount = 0;
int phoneCopy = records[count].phone;
while(phoneCopy != 0)
{
phoneCopy /= 10;
phoneCount++;
}
if (phoneCount != 10)
{
printf("The number you have entered is not 10 digits, please re-enter:");
scanf ("%d",&records[count].phone);
}
//request and store student birthdate
printf("Student birthday (mm/dd/yyyy):");
scanf("%d/%d/%d",&records[count].birthDate.month,&records[count].birthDate.day,
&records[count].birthDate.year);
//test stuff
printf("Student number %d has an ID of %d and a phone number of %d\n", studentNum,
records[count].iD, records[count].phone);
studentNum++;
}
return 0;
}
答案 0 :(得分:0)
#define NUMCMP(x,y) (((x) < (y)) ? -1 : ((x) > (y)) ? 1 : 0)
int compar_student_byDate(const struct studentInfo *student1, const struct studentInfo *student2){
struct date date1 = student1->birthDate;
struct date date2 = student2->birthDate;
int tmp;
if((tmp=NUMCMP(date1.year, date2.year))==0){
if((tmp=NUMCMP(date1.month, date2.month))==0)
return NUMCMP(date1.day, date2.day);
else
return tmp;
} else
return tmp;
}
struct studentInfo *oldest(struct studentInfo *records, int recNum){
struct studentInfo *old = records;
int i;
for(i = 1;i<recNum;++i){
if(compar_student_byDate(old, &records[i])>0)
old = &records[i];
}
return old;
}
at main
struct studentInfo *old_student = oldest(records, recNum);
答案 1 :(得分:-1)
好的,首先我应该告诉你,这是一个可以有许多正确答案的问题。
您可以代替创建结构数组studentInfo
,创建树,每当您将新节点插入树中时,将根节点保留为许多其他解决方案中最早的节点。无论如何,对于你的简单案例,一个简单的解决方案可以如下
步骤0.您想找到
studentInfo *oldest = records;
步骤1.遍历数组
studentInfo *traveler;
for(traveler = records; i<recNum; i++, traveler++)
步骤2.比较最老的和旅行者的日期。
if(oldest->birthDate.year > traveler->birthDate.year &&
oldest->birthDate.month > traveler->birthDate.month &&
oldest->birthDate.day > traveler->birthDate.day)
步骤3.更新每次找到
时找到的最旧记录oldest = traveler;
完成迭代后,最旧的记录应该是您要查找的记录。