降低时间复杂度以空间换时间
若一个程序有二重循环时,我们可以把他拆成两个循环以达到降低时间复杂度的效果,这是以空间换时间的一种办法,所以空间复杂度会上升。这是一个简易学校的存储所有学生信息的管理表,我接下来就说一种删除函数 说明 怎么一时间换空间。
struct student
{
int num;//学号
char a[];//姓名
struct student *next;//指针
}student;
struct class
{
int no;//班号
struct student *stu;//班级指向学生的指针
struct class *across;//班级指向班级的指针
}class;
void Deletestudent(class **head,int n,int m)
{
int classflag=0;//建立一个班级的标志 这是时间换空间的重点操作
class *p=*head;//建立班级指针
while(p!=NULL)//遍历班级
{
if(p->no==n)
{
clsaaflag=1;//找到学生所在的班级,改变flag
break;//跳出此循环
}
p=p->across;
}
if(classflag==0)
{
printf("没有找到班级");
return;
}
student *pre=p->stu;//接下来是遍历学生链表找到要删学生
student *pr=p->stu;
int studentflag=0;
while(pr!=NULL)//进入下一个循环,本来这个循环是要嵌套在
{ //上个循环内部 但因为flag和break而跳出了
if(pr->num==m)//上个循环,单独写这个循环,这样时间
{ //复杂度降低了,达到以空间换时间
studentflag=1;
break;//找到需删学生的学号 跳出循环
}
pre=pr;
pr=pr->next;//指针前移
}
if(!studentflag)
{
printf("没有找到次学生");
return;
}
if(p->next==pr)
{
p->next=pr->stu;//删除学生
}
else
{
pre->next=pr->stu;//删除学生
}
free(pr);//释放pr
}