兰州大学数据结构课程设计2.docx
- 文档编号:18378246
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:30
- 大小:22.35KB
兰州大学数据结构课程设计2.docx
《兰州大学数据结构课程设计2.docx》由会员分享,可在线阅读,更多相关《兰州大学数据结构课程设计2.docx(30页珍藏版)》请在冰点文库上搜索。
兰州大学数据结构课程设计2
《数据结构》课程设计题目
(程序实现采用C语言)
题目1:
猴子选王(学时:
3)
一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。
题目2:
字符逆转(学时:
3)
从键盘读入一个字符串,把它存入一个链表(每个结点存储1个字符),并按相反的次序将字符串输出到显示屏。
题目3:
工资核算(学时:
3)
设有一个单位的人员工资有如下信息:
name、department、basepay、allowance、total。
现从键盘输入一组人员工资数据并将它们存储到名为paydata的文件中;再从paydata取出工资数据并给每个人的basepay增加100元,增加后将工资数据显示于屏幕(每行1人)。
题目4:
满足条件的有序表生成(学时:
3)
已知三个有序表A、B、C,它们皆由同一类元素构成,现要求对于表A作以下运算而获得有序表D:
排出A中所有的既在B中又在C中出现的元素。
另外该任务要求具有建立有序表功能以及输出有序表到屏幕的功能。
#include
#include
voidmain()
{
voidsort(chara[],intlen);
chara[100],b[100],c[100],d[100],same[100];
inti,j,k,l1,l2;
printf("PleaseinputthelineA:
\n");
gets(a);
sort(a,strlen(a));
printf("\nPleaseinputthelineB:
\n");
gets(b);
sort(b,strlen(b));
printf("\nPleaseinputthelineC:
\n");
gets(c);
sort(c,strlen(c));
printf("\nTherightofthelineA,B,C:
\n");
puts(a);
puts(b);
puts(c);
for(i=j=k=0;(i<(l1=strlen(b)))&&(j<(l2=strlen(c)));)
{
if(b[i]==c[j])
{
same[k]=b[i];
i++;
j++;
k++;
}
elseif(b[i] elsej++; } same[k]='\0'; if(same[0]=='\0') strcpy(d,a); else { for(i=j=k=0;(i<(l1=strlen(a)))&&(j<(l2=strlen(same)));) { if(a[i]==same[j])i++; elseif(a[i] elsej++; } while(a[i]! ='\0') { d[k]=a[i]; k++; i++; } d[k]='\0'; } printf("\nThelinesameis: %s\n",same); printf("\nThelineDis: %s\n",d); } voidsort(chara[],intlen) { inti,j; chartemp; for(j=0;j for(i=0;i if(a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } 题目5: 一元多项式的减法(学时: 6) 设有两个一元多项式A(x),B(x),请完成运算A(x)+B(x)、A(x)-B(x),要求多项式采用链表进行存储。 另外该任务要求具有建立多项式链表以及输出多项式到屏幕的功能。 #include #include #defineLENsizeof(structLink) structLink { intc; inte; structLink*next; }; voidmain() { voidstart();//用户选择界面函数声明 structLink*creat(charch);//创造有序链表函数声明 structLink*addLink(structLink*head,structLink*pre);//链表相加函数声明 structLink*cutLink(structLink*head,structLink*pre);//链表相减函数声明 voidprint(structLink*p);//输出函数声明 structLink*a,*b; intsign=-1;//设置标志 start(); while(sign! =0) { scanf("%d",&sign); switch(sign) { case0: break;//退出 case1: { printf("你选择的操作是多项式相加: \n"); a=creat('A');//输入多项式f(x) printf("A(x)="); print(a); b=creat('B');//输入多项式g(x) printf("B(x)="); print(b); printf("C(x)=A(x)+B(x)="); a=addLink(a,b);//两个多项式相加 print(a); sign=-1;//复位标志 start();//回复用户选择界面 break; } case2: { printf("你选择的操作是多项式相减: \n"); a=creat('A');//输入多项式A(x) printf("A(x)="); print(a); b=creat('B');//输入多项式B(x) printf("B(x)="); print(b); printf("C(x)=A(x)-B(x)="); a=cutLink(a,b);//两个多项式相减 print(a); sign=-1;//复位标志 start();//回复用户选择界面 break; } default: { printf("输入有误! 请重新选择操作! \n");//选择错误,返回选择界面 start(); break; } } } } voidstart()//用户选择界面 { printf("************************************\n"); printf("两个一元多项式的相加/相减: \n"); printf("************************************\n"); printf("请选择操作: \n"); printf("0.退出\n"); printf("1.两个一元多项式相加\n"); printf("2.两个一元多项式相减\n"); } structLink*creat(charch) { voidinsert(structLink*head,structLink*inpt); structLink*head,*inpt; intx; inty; head=(structLink*)malloc(LEN);//创建链表头 head->next=NULL; printf("Pleaseinputthe%c(x): (Theend: 00)\n",ch); scanf("%d%d",&x,&y); while(x! =0) { inpt=(structLink*)malloc(LEN); inpt->c=x; inpt->e=y; inpt->next=NULL; insert(head,inpt);//将这个结点插到有序链表中 printf("请输入一元多项式%c(x)的下一项: (Theend: 00)\n",ch); scanf("%d%d",&x,&y); } returnhead; } voidinsert(structLink*head,structLink*inpt) { structLink*pre,*now; intsignal=0; pre=head;//pre定义为现在的前一个结点 if(pre->next==NULL) pre->next=inpt; else { now=pre->next; while(signal==0) { if((inpt->e)<(now->e))//当新链节小于现在的连接时向后移一个链节 { if(now->next==NULL) { now->next=inpt; signal=-1; } else { pre=now; now=pre->next; } } else if((inpt->e)>(now->e))//如果发现比现在的链节大了就插入到这个连接的前面 { inpt->next=now; pre->next=inpt; signal=1; } else { now->c=now->c+inpt->c; signal=1; free(inpt); if(now->c==0) { pre->next=now->next; free(now); } } } } } structLink*addLink(structLink*head,structLink*pre)//多项式相加 { structLink*inpt; intflag=0; while(flag==0) { if(pre->next==NULL) flag=1; else { pre=pre->next; inpt=(structLink*)malloc(LEN); inpt->c=pre->c; inpt->e=pre->e; inpt->next=NULL; insert(head,inpt); }//将B(x)中的结点依次插入A(x)中(相加) } returnhead; } structLink*cutLink(structLink*head,structLink*pre)//多项式相减 { structLink*inpt; intflag=0; while(flag==0) { if(pre->next==NULL) flag=1; else { pre=pre->next; inpt=(structLink*)malloc(LEN); inpt->c=0-pre->c; inpt->e=pre->e; inpt->next=NULL; insert(head,inpt); }//将B(x)中的结点依次插入A(x)中(相减) } returnhead; } voidprint(structLink*p)//输出多项式 { structLink*now; intflag=0; now=p->next;//now表示输出的信息,从头开始 if(p->next==NULL) { printf("\n"); return; } while(flag==0) { if((now->c)>0&&(p->next)! =now) printf("+"); if(now->c==1);//如果系数是1,就不用输出该系数了 elseif(now->c==-1)//如果是-1,就只需输出"-"号 printf("-"); else printf("%d",now->c);//其他情况都做输出 if(now->e! =0) printf("x^%d",now->e); elseif((now->c==1)||(now->c==-1)) printf("1"); if(now->next==NULL) flag=1; else now=now->next; } printf("\n"); } 题目6: 床位分配(学时: 6) 某客店有N个等级的房间,第k级客房有A(k)个,每个房间有B(k)个单人床,以菜单调用方式设计为单身旅客分配床位以及离店时收回床位的程序。 要求分配成功时,印出旅客姓名、年龄、性别、到达日期、客房等级、房间号及床位号;分配不成功时,允许更改房间等级,若不更改等级,印出“满客”提示。 //本人编写 #include #include #include #include typedefstructcustomer//旅客结构体 { charname[6];//姓名 intage;//年龄 intsex;//性别 intlevel;//房间等级 intbed_num;//房间号 chardate[100]; structcustomer*next; }customer; typedefstructhotel_level//旅店等级结构体 { intlv_num;//等级数目 structhotel_level*next;//该结构体指针指向下一个等级 structroom*next_r;//定义房间指针指向下一个房间(等级划分下的房间指针) }hotel_lv; typedefstructroom//房间结构体 { intr_num;//房间号 intmax;//最大值 intmember_num;//成员数 structroom*next;//定义房间指针指向下一个房间(房间相指) structcustomer*next_cus;//房间里的顾客指针房间指向顾客 }room; voidInit(hotel_lv*L)//初始化函数 { inti,j,k,l; hotel_lv*p,*q; room*p1,*p2,*p3; printf("请输入房间分为几个等级: "); scanf("%d",&j); q=L;//等级设置了头结点 for(i=1;i<=j;i++)//创建等级-房间-床位数 { p=(hotel_lv*)malloc(sizeof(hotel_lv));//开辟等级结点 q->next=p; p->lv_num=i;//给房间等级赋值 printf("请输入%d等级的房间个数: ",p->lv_num); scanf("%d",&l);//输入该等级的房间数目 if(l==0) continue; else { p2=(room*)malloc(sizeof(room)); p2->r_num=1; printf("请输入%d等级的房间号为1的房间床位个数的最大值: ",p->lv_num,k); scanf("%d",&(p2->max));//输入房间1的床位数目 p2->member_num=0;//该房间内当前人数赋为零 p->next_r=p2; p3=p2; for(k=2;k<=l;k++) { p1=(room*)malloc(sizeof(room)); p3->next=p1; p1->r_num=k; printf("请输入%d等级的房间号为%d的房间床位个数的最大值: ",p->lv_num,k); scanf("%d",&(p1->max));//输入房间k的床位数目 p1->member_num=0;//该房间内当前人数赋为零 p3=p1; } p3->next=NULL;//该等级房间床位设置结束,房间链表尾指针赋为空 } q=q->next;//等级指针指向下一个等级 } q->next=NULL;//所有等级设置结束,等级链表尾指针域赋为空 } intfull(hotel_lv*L)//是否客满函数 { hotel_lv*l; l=L->next; room*r; while(l! =NULL) { r=l->next_r; while(r! =NULL) { if(r->member_num! =r->max)//如果有房间的当前人数不等于房间的最大人数,则返回0 return0; else r=r->next;//否则指向下一个房间 } l=l->next;//否则指向下一个等级 } if(! l) return1; } voidpress(customer*p,room*q) { printf("_____________________________________________________________________________\n"); printf("|旅客房间分配表|\n"); printf("|---------|------|------|--------|--------|--------|--------------------------|\n"); printf("|姓名|性别|年龄|等级号|房间号|床位号|入住时间|\n"); printf("|-----------------------------------------------------------------------------|\n"); printf("|%6s|%d|%2d|%2d|%2d|%2d|%s",p->name,p->sex,p->age,p->level,q->r_num,p->bed_num,p->date); printf("|_________|______|______|________|________|________|__________________________|\n"); printf("\n"); } voidinput(hotel_lv*L)//旅客入住函数 { time_trawtime; structtm*timeinfo; charc; customer*s,*p2,*p3; hotel_lv*l; l=L->next; room*p1; inti,lv; s=(customer*)malloc(sizeof(customer)); printf("\n----------------------------------------\n"); printf("\n旅客信息: "); printf("\n请输入旅客姓名: "); scanf("%s",s->name); printf("\n请输入旅客年龄: "); scanf("%d",&(s->age)); printf("\n请输入旅客性别(男1女0): "); scanf("%d",&(s->sex)); time(&rawtime); timeinfo=localtime(&rawtime); strcpy(s->date,asctime(timeinfo)); if(full(L)) { printf("旅店客满,不能入住。 \n"); } else { printf("请输入旅客所需的房间等级: ");//输入旅客所需的等级 scanf("%d",&lv); while(l! =NULL)//等级不为空时 { if(l->lv_num! =lv) l=l->next; else//符合旅客需求的等级时 { p1=l->next_r; while(p1! =NULL)//当房间不为空时 { if(p1->member_num==p1->max)//房间满时访问下一个房间 { p1=p1->next; if(p1==NULL) { getchar(); printf("此等级为%d的所有房间均无空位\n是否愿意更换等级[y/n]",lv); scanf("%c",&c);//做出选择 if(c=='y') input(L); else return; } } else//进行旅客登记 {//因为床位没有设置头结点,所以对于第一个结点要特别判断 if(p1->member_num==0) { s->level=lv; p1->next_cus=s; p1->member_num++;//房间当前人数加1 s->bed_num=1;//顾客床位号 s->next=NULL;//尾指针置为空 press(s,p1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 兰州大学 数据结构 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)