数据结构复习材料.docx
- 文档编号:6000609
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:47
- 大小:26.51KB
数据结构复习材料.docx
《数据结构复习材料.docx》由会员分享,可在线阅读,更多相关《数据结构复习材料.docx(47页珍藏版)》请在冰豆网上搜索。
数据结构复习材料
数据结构复习材料
1、利用结构体类型编制程序,实现输入10个驾校学员的姓名,身份证号码,科目一,科目二,科目三,教练编号,然后计算驾校科目一,科目二和科目三在通过情况
#include
typedefstructDrivingStudent
{
charname[20];
charIDCard[20];
intscore[3];
intCoachID;
}DrivingSTU;
doublePassrate(DrivingSTUstu[],intnum,intn)
{
inti,x=0,y=0;
for(i=0;i { if(stu[i].score[n]>=0) { y++; if(n==0) { if(stu[i].score[n]>=90) x++; } else { if(stu[i].score[n]>=80) x++; } } } return1.0*x/y; } doubleCoachRate(DrivingSTUstu[],intnum,intcoach) { inti,x=0,y=0; for(i=0;i { if(stu[i].CoachID==coach&&stu[i].score[2]>=0) { y++; if(stu[i].score[2]>=80) x++; } } return1.0*x/y; } voidmain() { DrivingSTUstu[20]; inti,num,n; printf("请输入学员的人数: "); scanf("%d",&num); for(i=0;i { getchar(); printf("请输入学员的姓名、身份证号及教练编号: \n"); scanf("%s%s%d",stu[i].name,stu[i].IDCard,&stu[i].CoachID); printf("请输入学员的科目一成绩: \n"); scanf("%d",&stu[i].score[0]); if(stu[i].score[0]<90) { stu[i].score[1]=stu[i].score[2]=-1; continue; } printf("请输入学员的科目二成绩: \n"); scanf("%d",&stu[i].score[1]); if(stu[i].score[1]<80) { stu[i].score[2]=-1; continue; } printf("请输入学员的科目三成绩: \n"); scanf("%d",&stu[i].score[2]); } for(i=0;i printf("%s%s%d%d%d%d\n",stu[i].name,stu[i].IDCard,stu[i].CoachID,stu[i].score[0],stu[i].score[1],stu[i].score[2]); for(i=0;i<3;i++) printf("科目%d的通过率为%.2lf%%! \n",i+1,100*Passrate(stu,num,i)); printf("请输入要查询的教练编号: "); scanf("%d",&n); printf("教练%d所教学员的通过率为: %.2lf%%! \n",n,100*CoachRate(stu,num,n)); } 2、/*定义一个包括年、月、日成员的结构体变量,将其转换成这一年的第几天并输出。 应注意闰年的二月有29天,表达式"((year%4==0&&year%100! =0)||(year%400)==0)"值为真,即为闰年,其中year表示年号。 */ #include typedefstruct { intyear,month,day; }date; intcount(datex) { inttotal=0; switch(x.month) { case12: total+=30; case11: total+=31; case10: total+=30; case9: total+=31; case8: total+=31; case7: total+=30; case6: total+=31; case5: total+=30; case4: total+=31; case3: total+=28; case2: total+=31; case1: total+=x.day; } if(x.year%4==0&&x.year%100! =0||x.year%400==0) total+=1; returntotal; } voidweek(datex) { longsum=0; inti; for(i=1;i if(i%4==0&&i%100! =0||i%400==0) sum+=366; else sum+=365; sum+=count(x); i=sum%7; switch(i) { case1: printf("星期一\n");break; case2: printf("星期二\n");break; case3: printf("星期三\n");break; case4: printf("星期四\n");break; case5: printf("星期五\n");break; case6: printf("星期六\n");break; case0: printf("星期日\n");break; } } main() { datex; inttotal; printf("pleaseinputtheyear,monthandday: "); scanf("%d%d%d",&x.year,&x.month,&x.day); total=count(x); printf("这是%d年的第%d天! \n",x.year,total); week(x); } 作业二 1、编写一算法实现顺序表的非递减插入,即插入元素后保持顺序表元素值非递减的顺序。 #include typedefintElemType; #include"SqList.h" intOrderInsert(SqList*L,ElemTypee) { inti=0,j; if(L->length>=MaxSize) return0; while(i i++; for(j=L->length;j>i;j--) L->data[j]=L->data[j-1]; L->data[i]=e; L->length++; return1; } voidmain() { SqList*L; inti,n,e; InitList(L); printf("请输入要插入的元素个数: "); scanf("%d",&n); printf("请输入要插入的元素: \n"); for(i=0;i { scanf("%d",&e); OrderInsert(L,e); } printf("插入后的顺序表为: \n"); DispList(L); DestroyList(L); } 2、编写一算法实现删除顺序表中所有值为e的元素,返回删除元素的个数。 #include typedefintElemType; #include"SqList.h" intDeleteAll(SqList*L,ElemTypee,int&n)//算法一 { inti,j,count=0; for(i=L->length;i>=0;i--) if(L->data[i]==e) { count++; n=i; for(j=i;j L->data[j]=L->data[j+1]; L->length--; } returncount; } intDeleteAll1(SqList*L,ElemTypee,int&n)//算法二 { inti,j=0,count=0; for(i=0;i if(L->data[i]==e) { if(count==0) n=i; count++; } else L->data[j++]=L->data[i]; L->length-=count; returncount; } voidmain() { inti,e,n,num; SqList*L; InitList(L); printf("请输入要插入的元素个数: "); scanf("%d",&num); for(i=1;i<=num;i++) { scanf("%d",&e); ListInsert(L,i,e); } printf("插入后的顺序表为: "); DispList(L); printf("请输入要删除的元素值: "); scanf("%d",&e); printf("删除值为%d的元素共%d个。 \n",e,DeleteAll(L,e,n)); printf("第一个值为%d的元素的位置为: %d! \n",e,n+1); DestroyList(L); InitList(L); printf("请输入要插入的元素个数: "); scanf("%d",&num); for(i=1;i<=num;i++) { scanf("%d",&e); ListInsert(L,i,e); } printf("插入后的顺序表为: "); DispList(L); printf("请输入要删除的元素值: "); scanf("%d",&e); printf("删除值为%d的元素共%d个。 \n",e,DeleteAll1(L,e,n)); printf("第一个值为%d的元素的位置为: %d! \n",e,n+1); DestroyList(L); } 作业三 1、设A和B中存放的是两个从小到大的有序顺序表。 编写一个将A和B中相同元素组成一个新的从大到小的有序顺序表C的算法,并分析算法的时间复杂度。 #include typedefintElemType; #include"SqList.h" voidorder(SqList*A,SqList*B,SqList*&C) { inti=A->length-1,j,k=0; while(i>=0) { j=B->length-1; while(j>=0) { if(A->data[i]==B->data[j]) { C->data[k]=A->data[i]; k++; break; } j--; } i--; } C->length=k; } voidorder1(SqList*A,SqList*B,SqList*&C) { inti=A->length-1,j=B->length-1,k=0; while(i>=0&&j>=0) { if(A->data[i]==B->data[j]) { C->data[k]=A->data[i]; k++; i--;j--; } elseif(A->data[i]>B->data[j]) i--; else j--; } C->length=k; } voidmain() { SqList*A,*B,*C,*D; intn,i,x,y; InitList(A); InitList(B); InitList(C); InitList(D); cout<<"请输入顺序表A要插入的元素个数: "; cin>>n; cout<<"请输入第1个元素的值: "; cin>>x; ListInsert(A,1,x); DispList(A); for(i=2;i<=n;i++) { cout<<"请输入第"< "; do{ cin>>x; GetElem(A,i-1,y); if(x cout<<"输入的数值应大于等于前一个元素值! 请重输: "< elsebreak; }while (1); ListInsert(A,i,x); } cout<<"请输入顺序表B要插入的元素个数: "; cin>>n; cin>>x; ListInsert(B,1,x); for(i=2;i<=n;i++) { cout<<"请输入第"< "; do{ cin>>x; GetElem(A,i-1,y); if(x cout<<"输入的数值应大于等于前一个元素值! 请重输: "< elsebreak; }while (1); ListInsert(B,i,x); } cout<<"顺序表A的元素值为: "; DispList(A); cout<<"顺序表B的元素值为: "; DispList(B); order(A,B,C); cout<<"方法1得到的顺序表C的元素值为: "; DispList(C); order1(A,B,D); cout<<"方法2得到的顺序表D的元素值为: "; DispList(D); } 作业四 1.设计一个算法,实现从顺序表sq中删除自第i个元素开始的K个元素,并分析算法的时间复杂度。 /*设计一个算法,实现从顺序表sq中删除自第i个元素开始的K个元素*/ #include typedefintElemType; #include"SqList.h" intDeleteik(SqList*&L,inti,intk) { intj; if(i<1||i>L->length||i+k-1>L->length) { printf("删除元素位置错误,或元素不足%d个! ",k); return0; } for(j=i+k-1;j L->data[j-k]=L->data[j]; L->length-=k; return1; } main() { SqList*L; inti,k,n,x; InitList(L); printf("请输入要插入的元素个数: "); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&x); ListInsert(L,i,x); } printf("顺序表L中的元素为: "); DispList(L); printf("请输入要删除元素的起始位置和删除元素的个数: "); scanf("%d%d",&i,&k); Deleteik(L,i,k); printf("删除后的顺序表L为: "); DispList(L); } 2.线性表A顺序存储,设计一个算法,实现将每个元素互不相等,设计把所有奇数移到所有的偶数前边,并分析算法的时间复杂度。 、/*线性表A顺序存储,设计一个算法,实现将每个元素互不相等,设计把所有奇数移到所有的偶数前边,*/ #include typedefintElemType; #include"SqList.h" intjiou(SqList*&L) { inti,j,temp; if(L->length==0) { printf("顺序表为空,不能操作! "); return0; } for(i=0,j=L->length-1;i { while(L->data[i]%2! =0) i++; while(L->data[j]%2==0) j--; if(i { temp=L->data[i]; L->data[i]=L->data[j]; L->data[j]=temp; } } return1; } main() { SqList*L; inti,n,x; InitList(L); printf("请输入要插入的元素个数: "); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&x); ListInsert(L,i,x); } printf("顺序表L的元素分别为: "); DispList(L); jiou(L); printf("奇偶交换后的顺序表L的元素为: "); DispList(L); } 作业五 1、设计一个算法,将一个带头结点的数据域一次为a1,a2,…,an(n>=3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。 (书本56页2.3) #include typedefintElemType; #include"LinkList.h" voidReverse(LinkList*&l) { LinkList*p,*q; q=l->next->next; l->next->next=NULL; while(q! =NULL) { p=q; q=q->next; p->next=l->next; l->next=p; } } voidmain() { LinkList*l; intn,i; ElemTypex; InitList(l); cout<<"请输入单链表l要插入的元素个数: "; cin>>n; for(i=1;i<=n;i++) { cout<<"请输入要插入的第"< "; cin>>x; ListInsert(l,i,x); } cout<<"单链表l的元素为: "; DispList(l); Reverse(l); cout<<"反转后的单链表l的元素为: "; DispList(l); } 2、设有一个单链表,每个结点中除有prior、data和next三个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零。 每当在链表进行一次LocateNode运算时,令元素值为x的结点中freq域的值加1,并调整表中结点的次序,使其按访问频度的递减序排列,以便使频繁访问的结点总是靠近表头。 试写一符合上述要求的LocateNode运算的算法。 (书本56页2.4) #include typedefintElemType; typedefstructnode { ElemTypedata; structnode*prior,*next; intfreq; }DLinkList; voidInitList(DLinkList*&dl) { dl=newDLinkList;/*创建头结点sl*/ dl->freq=0; dl->prior=dl->next=NULL; } intScanList(DLinkList*h,ElemTypex) { DLinkList*p=h,*q; while(p! =NULL&&p->data! =x)//找data域值为x的结点p p=p->next; if(p==NULL) return0; else { p->freq++; q=p->prior; while(q! =h&&(q->freq { p->prior=q->prior; p->prior->next=p; q->next=p->next; if(q->next! =NULL) q->next->prior=q; p->next=q;q->prior=p; q=p->prior; } return1; } } intGetLength(DLinkList*dl) { inti=0; DLinkList*p=dl->next; while(p! =NULL) { i++; p=p->next; } returni; } intInsElem(DLinkList*dl,ElemTypex,inti) { intj=1; DLinkList*p=dl,*s; s=newDLinkList;//创建data域为x的结点 s->data=x; s->prior=s->next=NULL; s->freq=0; if(i<1||i>GetLength(dl)+1) return0;//i参数不正确,插入失败,返回0 while(j { p=p->next;j++; } s->next=p->next;//将*s的next域指向*p的下一个结点(即第i个结点) s->prior=p; if(p->next! =NULL) s->next->prior=s; p->next=s;//将*p的next域指向*s,这样*s变成第i个结点 return1;//插入成功返回1 } voidDispList(DLinkList*dl) { DLinkList
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习 材料