数据结构上机答案(c语言版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习一:
1、编写一个读入一个字符串,把它存入一个链表,并按相反的次序打印的程序。
2、设有一个单位的人员工资有如下信息:name、department、 base pay、allowance、total。现从键盘输入一组人员工资数据并将它们存储到名为paydata的文件中;再从paydata取出工资数据并给每个人的base pay增加100元,增加后将工资数据显示于屏幕(每行1人)。请编写能够完成上述工作的程序。
代码如下:
1.#include
#include
#include
void main()
{
char x;
struct node //定义个结构node
{
char c;
struct node *next;
};
struct node *head,*pb,*pf,*p,*s,*t; //定义指针
printf("请输入字符串,按Enter结束!\n");
for(int i=0;x!='\n';i++)
{
pb=(struct node *)malloc(sizeof(struct node));//动态分配n字节的内存空间
scanf("%c",&pb->c); //输入字符
x=pb->c;
if(i==0){ //输入的首个字符作为头结点pf
head=pb;
pf=head;}
else if(pb->c!='\n'){ //如果输入的是Enter,输入终止,否则把字符依次存入链表
pf->next=pb; //把输入的字符pb存在pf后,pb后为空
pb->next=NULL;
pf=pb;//pb赋给pf,重复上述操作
p=head;}
}
for(;p!=NULL;p=p->next)
s=p; //把指向链表的最后一个字符的指针赋给s
printf("输出结果为:\n");
printf("%c",s->c);//输出链表的最后一个字符
for(p=head;s!=head;)//若s==head,该链表只有一个字符。重置p为头结点{
for(p=head;p!=s;p=p->next)
t=p;
s=t;
printf("%c",t->c);
}
printf("\n");
}
2.#include
#include
#include
//#define SIZE 4
void main()
{ struct Worker{ //定义链表结构
char name[40];
char department[40];
int basepay;
int allowance;
int total;
struct Worker *next;
}; struct Worker *p;////定义链表头指针,全局变量
struct Worker worker[4];
p=(struct Worker *)malloc(sizeof(struct Worker));//为链表头结点分配内存int i;
FILE *fp;
if((fp=fopen("paydata.txt","wb"))==NULL)
{ printf("cannot open file\n");
return;
}
printf("请输入员工的姓名,部门,底薪,津贴\n");
for(i=0;i<4;i++){
scanf("%s%s",&worker[i].name,&worker[i].department);
scanf("%d%d",&worker[i].basepay,&worker[i].allowance);
struct Worker *pb;
pb=&worker[i];
struct Worker *head;
if(i==0){
head=pb;
p=head;
}else {
p->next=pb;
pb->next=NULL;
p=pb;
}
} for(i=0;i<4;i++)
if(fwrite(&worker[i],sizeof(struct Worker),1,fp)!=1)
printf("file write error\n");
fclose(fp);
fp=fopen("paydata.txt","rb");
printf("姓名部门底薪津贴总工资\n");
for(i=0;i<4;i++)
{ fread(&worker[i],sizeof(struct Worker),1,fp);
printf("%2s%6s%6d%6d%6d",worker[i].name,worker[i].department,worker[i ].basepay+100,worker[i].allowance,worker[i].allowance+worker[i].basepay+100) ;
printf("\n");
}
fclose(fp);
}
实习二:
试分别用线性表的向量存储结构和链表存储结构来实现约瑟夫(Josephu)问题。约瑟夫问题如下:
设有n个人围坐圆桌周围。从某个位置上的人开始从1报数,数到m的人便出列,下一个人(第m+1个)又从1报数开始,数到m的人便是第2个出列的人,依次类推,直到最后一个人出列为止,这样就可以得
到一个人员排列的新次序。例如,n=8,m=4,从第1个人数起,得到的新次序为48521376.
代码如下:
链表存储结构:
#include
#include
#include