求解Josephus问题实验总结(用C语言循环单链表实现)(精选5篇)

时间:2019-05-12 04:29:16下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《求解Josephus问题实验总结(用C语言循环单链表实现)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《求解Josephus问题实验总结(用C语言循环单链表实现)》。

第一篇:求解Josephus问题实验总结(用C语言循环单链表实现)

求解Josephus问题实验总结

1实验题目: josephus问题可描述如下:

设有n个人围成一个环,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人从新开始报数,数到第m的人又出列,如此重复,直至所有人均出列为止。求这些人出列的顺序。

2实验目的:

熟练掌握线性表的顺序实现和链式实现的基本操作。

3实验方法:

通过运用已学的向量和循环单链表编写程序,并在电脑上运行,实现josephus问题的求解。4实验过程与结果:

(1)输入n值为6,s值为3,m值为2,输入A[i]的值为1 2 3 4 5 6 输出结 果为:4 6 2 5 3 1 截图如下:

(2)

1、输入n值为-1, s值为3,m值为2,显示:ERROR。截图如下:

2、输入n值为6, s值为0,m值为3,显示:ERROR。截图如下:

3、输入n值为6, s值为3,m值为0,显示:ERROR。截图如下

5试验体会与收获:

(1)写程序是要随时注意缩进,使得程序层次清晰,便于寻找错误,同时也让别人看的更加方便。(2)构造循环单链表,要以单链表为单元指针指向把最后个单元与第一个即可(3)建立好循环单链表后,通过三个指针(p,q,tmp)的指示,来确定报数,出列人的位置,得以完成。具体过程如下:p指向head头指针,通过s次循环将p指向报数的起始位置s,用q记录p的位置,再经过m次循环另p指向出列者的位置,将其数值保存在一维数组中,并将其从链表中删除,p指向下一次起始位置,结束时返回数组A[j]。(4)删除节点时,注意要释放节点。

(5)构造函数时,一定要明确函数的类型,即返回行还是不返回型,以免出现不必要的错误。

第二篇:职工信息管理系统 单链表实现 C语言源程序(范文)

#include #include #include int saveflag=0;

/* 单链表内容有无发生改变,是否需要存盘的标志变量 */ struct employee {

};

typedef struct Node {

void InitList(LinkList *head)

/*将单链表初始化为空。动态生成一个头结点,并将头结点的指针域置为空*/ {

}

ListNode *Locatenum(LinkList head,char find[])

//通过职工工号查找,返回定位指针。{ LinkList p;if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)

/*为头结点分配一 printf(“系统分配存储空间失败!n”);个存储空间*/ exit(-1);(*head)->next=NULL;

/*将头结点的指针域置为空*/ struct employee data;struct Node *next;char num[10];

/* 工号 */ char name[15];

/* 姓名 */ char sex[7];

/* 性别 */ int age;

/* 年龄 */ char education[15];

/* 学历 */ int salary;

/* 工资 */ char phone[20];

/* 电话号码 */ char address[30];

/* 住址 */ }ListNode,*LinkList;

} p=head->next;if(!p)

//如果职工信息记录为空,返回NULL。

{

} return NULL;if(strcmp(p->data.num,find)==0)return p;p=p->next;return NULL;while(p)ListNode *Locatename(LinkList head,char find[])

//通过职工姓名查找,返回定位指针。{

}

ListNode *Locatesalary(LinkList head,int salary)

//通过职工工资查找,返回定位指针。{

LinkList p;p=head->next;if(!p)

//如果职工信息记录为空,返回NULL。

return NULL;while(p){ LinkList p;p=head->next;if(!p)

//如果职工信息记录为空,返回NULL。

{

} return NULL;if(strcmp(p->data.name,find)==0)return p;p=p->next;return NULL;while(p)

}

} if(p->data.salary==salary)return p;p=p->next;return NULL;void Nofind(){ }

void Modify(LinkList L)

//修改功能。{

ListNode *p;

char find[20];

if(!L->next)

{

printf(“请你输入要修改的职工工号:”);

scanf(“%s”,find);

p=Locatenum(L,find);

if(p)

{

printf(“请你输入新的工号(原来是%s):”,p->data.num);

scanf(“%s”,p->data.num);

getchar();

printf(“n”);

printf(“请你输入新的姓名(原来是%s):”,p->data.name);

scanf(“%s”,p->data.name);

getchar();

printf(“n”);

printf(“n***提示***:没有资料可以修改!n”);

return;printf(“n***提示***:没有找到该职工!n”);

}

printf(“请你输入新的性别(原来是%s):”,p->data.sex);

scanf(“%s”,p->data.sex);

getchar();

printf(“n”);

printf(“请你输入新的年龄(原来是%d):”,p->data.age);

scanf(“%d”,&p->data.age);

printf(“n”);

printf(“请你输入新的学历(原来是%s):”,p->data.education);

scanf(“%s”,p->data.education);

getchar();

printf(“n”);

printf(“请你输入新的工资(原来是%d):”,p->data.salary);

scanf(“%d”,&p->data.salary);

printf(“n”);

printf(“请你输入新的电话(原来是%s):”,p->data.phone);

scanf(“%s”,p->data.phone);

getchar();

printf(“n”);

printf(“请你输入新的住址(原来是%s):”,p->data.address);

scanf(“%s”,p->data.address);

getchar();

printf(“n”);

printf(“n***提示***:资料修改成功!n”);

saveflag=1;

}

else

Nofind();//if(p)结束

} //void Modify(LinkList L)

//修改功能结束 void Add(LinkList head)

/* 录入职工信息 */ {

system(“cls”);ListNode *p,*r,*s;

/* 实现添加操作的临时的结构体指针变量 */ int sign;

/* 标记重复工号的变量 */ char num[10];r=head;s=head->next;

/* 链表没有节点时,s=NULL;链表有节点时,指向while(r->next!=NULL)/* 如果存在后继结点时,r指针后移一个 */ r=r->next;

/* 将指针移至于链表最末尾,准备添加记录 */ printf(“输入‘#’将退出职工信息录入,退回至主菜单!nn”);while(1){

printf(“(PS:职工号为‘#’即退出录入功能)nn”);printf(“请输入职工号:”);fflush(stdin);

//清除缓冲区。gets(num);if(strcmp(num,“#”)==0)/* 输入‘0’,跳出while(1),即跳出Add()函数 */ break;s=head->next;

/* 每次从第一个节点开始找,看num是否重

while(s){

if(strcmp(s->data.num,num)==0){

} s=s->next;printf(“***提示***n工号为:‘%s’的职工信息已经存在!printf(”若要修改请按‘4’,放弃请按‘0’!n“);scanf(”%d“,&sign);if(sign==4)

Modify(head);return;else 第一个职工节点 */ 复。*/ n”,num);}//while(s)if((p=(LinkList)malloc(sizeof(ListNode)))==NULL)//生成没赋值的新节点 p。

{

} strcpy(p->data.num,num);printf(“n”);printf(“请输入该职工姓名:”);scanf(“%s”,p->data.name);getchar();printf(“n”);printf(“请输入该职工的性别:(注:男性:male;女性:female)”);scanf(“%s”,p->data.sex);getchar();printf(“n”);printf(“请输入该职工的年龄:”);scanf(“%d”,&p->data.age);printf(“n”);printf(“请输入该职工的学历:”);scanf(“%s”,p->data.education);getchar();printf(“n”);printf(“请输入该职工的工资:”);scanf(“%d”,&p->data.salary);printf(“n”);printf(“请输入该职工的电话号码:”);scanf(“%s”,p->data.phone);getchar();printf(“n”);printf(“请输入该职工的住址:”);gets(p->data.address);printf(“n”);p->next=NULL;

/* 表明这是链表的尾部结点 */ r->next=p;

/* 将新建的结点加入链表尾部中 */ r=p;saveflag=1;printf(“n”);printf(“系统分配存储空间失败!n”);printf(“退出程序!n”);exit(-1);}//while(1)}//void Add函数结束。

void printline()

//打印横线。{ }

void printsubject()

//打印各分类标题。{ }

void printLinkList(LinkList p)

//打印p结点各个数据成员的值。{ printf(“ %s

%s %s

%d %s %d

%s

%sn”,p->data.num,p->data.name,p->data.sex,p->data.age,p->data.education,p->data.salary,p->data.phone,p->data.address);}

void Allemployeeinfo(LinkList head)//显示所有职工信息。{

int count=0;ListNode *p;p=head->next;if(!p){

} printf(“tttt显示结果n”);printline();printsubject();printf(“n”);while(p)printf(“***提示***:目前没有存储任何职工记录!n”);printf(“返回主菜单,请重新选择功能!n”);return;printf(“ 工 号t 姓 名

性 别

年 龄

学 历

工 资

电 话tt 住 址n”);printf(“------------------n”);

} {

} printline();printf(“n”);printf(“已经存储了%d条职工信息!n”,count);printLinkList(p);p=p->next;count++;void Wrong(){ }

void menu()

//主菜单。{

printf(“n”);printf(“t**********************************************************printf(”t*

printf(“t*

printf(”t*

< 职工信息管理系统_单链表实现 >

printf(“t*

printf(”t*

[1]

录入职工信息

[2]

删除职工信息

printf(“t*

[3]

查询职工信息

[4]

修改职工信息

printf(”t*

[5]

插入职工记录

[6]

统计职工信息

printf(“t*

[7]

排序

[8]

保存职工信息

printf(”t*

[9]

显示所有职工记录

[0]

退出系统

printf(“n***提示***:输入错误!n”);*********n“);*n”);*n“);*n”);*n“);*n”);*n“);*n”);*n“);*n”);

printf(“t*

printf(”t*

printf(“t*

版权所有人:printf(”t*

电子132班

printf(“t*

printf(”t***********************************************************n“);*n”);彭林

*n“);*n”);1319200063

*n“);*********n”);} //void menu菜单结束。

void Del(LinkList L)//删除职工信息。{

int select;

//删除方式选择记录变量。ListNode *p,*r;char find[20];if(!L->next)

//当list无后继结点时,提示和结束Del()函数。{

}

printf(“n按工号删除,请按‘1’n按姓名删除,请按‘2’n”);printf(“n=====>功能选择:”);scanf(“%d”,&select);if(select==1){

printf(“请输入要删除的职工工号:”);scanf(“%s”,find);getchar();p=Locatenum(L,find);if(p){ r=L;printf(“n***提示***:没有记录可以删除!n”);return;

} while(r->next!=p)r=r->next;//从第一个结点找起,直到发现r->next=p, 是待删除结点,跳出循环。

r->next=p->next;free(p);printf(“n***提示***:该职工信息已成功删除!n”);saveflag=1;else Nofind();}//if(select==1).else if(select==2){

printf(“请输入要删除的职工姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);if(p){

} else Nofind();r=L;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf(“n***提示***:该职工信息已成功删除!n”);saveflag=1;}//if(select==2).else Wrong();

//显示输入错误的话

}//void Del()删除函数结束。

void Search(LinkList L)

//查询职工信息。{ int select;

int salary;int sign=0;char find[20];ListNode *p;

//实现查询操作的临时结构体指针变量。if(!L->next){

} printf(“n按工号查找,请按‘1’n按工资查找,请按‘2’n按姓名查找,printf(”n=====>功能选择:“);scanf(”%d“,&select);printf(”n“);if(select==1)

//工号。{

} else if(select==2)

//工资。{

printf(”请输入要查找的工资:“);scanf(”%d“,&salary);p=Locatesalary(L,salary);printf(”请输入要查找的工号:“);scanf(”%s“,find);getchar();p=Locatenum(L,find);if(p){

} else Nofind();printf(”tttt

查找结果n“);printline();

//打印横线。printsubject();

//打印各分类标题。

printLinkList(p);

//打印p结点各个数据成员的值。printline();

//打印横线。printf(”n***提示***:没有职工信息资料可以查询!n“);printf(”返回主菜单,请重新选择功能!n“);return;请按‘3’n”);

} if(p){

} while(p){

{

} } if(sign==0)Nofind();printf(“tttt查找结果n”);printline();printsubject();printLinkList(p);printline();sign++;p=Locatesalary(p,salary);if(p)printf(“tttt查找结果n”);printline();printsubject();printLinkList(p);printline();sign++;else if(select==3)

//姓名。{

printf(“请输入要查找的姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);if(p){

printf(“tttt查找结果n”);printline();printsubject();printLinkList(p);

} } printline();else Nofind();else Wrong();}//void Search()查询函数结束。

void Save(LinkList L)

//信息保存到文件中。{

FILE *fp;ListNode *p;int count=0;int flag=1;fp=fopen(“Employeeinfo.txt”,“wb”);if(fp==NULL){

} p=L->next;while(p){

if(fwrite(p,sizeof(ListNode),1,fp)==1)

//将第一个记录结点值写入文

{

p=p->next;

//依次写入下一个结点的 count++;

//文件的记录数+1。printf(“n***提示***:打开文件时发生错误!n”);return;件。

值。

}

else

{

flag=0;

printf(“写入文件过程发生错误!n”);

break;

}

}//while(p).if(count>0){

} else {

} fclose(fp);system(“cls”);//清屏。

printf(“文件保存失败!‘0’条记录被保存。n”);printf(“n***提示***:文件保存成功。(有%d条记录已经保存。)n”,count);saveflag=0;

}//void Save()函数结束。

void Sort(LinkList L)

//排序功能函数。{

ListNode *p,*m,*n;int i,j,count=0;p=L->next;if(!p){

} system(“cls”);

//清屏。printf(“按工资从低到高排序:n”);printf(“***以下为排序前的所有职工记录***n”);Allemployeeinfo(L);while(p){

} for(i=0;i

//不包含头结点的职工信息结点的总个数。p=p->next;system(“cls”);

//清屏。printf(“无任何职工信息!n”);printf(“返回主菜单!n”);return;

}

{

} printf(“***以下为排序后的所有职工记录***n”);Allemployeeinfo(L);saveflag=1;printf(“排序成功!n”);n=L;p=L->next;m=p->next;while(m){

} if(p->data.salary>m->data.salary){

} else {

} n=p;p=m;m=m->next;n->next=p->next;p->next=m->next;m->next=p;n=m;m=p->next;void Statistics(LinkList L)//统计职工中的最高工资和最低工资。{

ListNode *Max,*Min;int i;ListNode *t=L->next;if(!t){ system(“cls”);

//清屏。printf(“没有储存任何职工记录!n”);

}

} printf(“返回主菜单,请先录入职工信息!n”);return;system(“cls”);Max=Min=t;t=t->next;while(t){

} printf(“最高工资为:%dn”,Max->data.salary);printf(“最低工资为:%dn”,Min->data.salary);printf(“若要查看最低,最高工资的相关职工信息,n”);printf(“请按‘1’,然后按照提示进行相关操作,n”);printf(“否则,请按‘1’除外的任何数字键以退出统计功能,返回主菜单。n”);printf(“n=====>功能选择:”);scanf(“%d”,&i);if(i==1)Search(L);

//显示符合要求的职工信息。return;else if(Max->data.salarydata.salary)Max=t;

//Max指针指向最高工资的职工结点。Min=t;

//Min指针指向最低工资的职工结点。if(Min->data.salary>t->data.salary)t=t->next;void Insert(LinkList L)

//插入新的职工信息。{

printf(“本功能可以通过姓名和工号查找到符合要求的n”);//功能介绍。printf(“相关职工信息,然后将您希望添加进去的新的n”);printf(“职工信息插入到该职工信息记录的后面。n”);ListNode *p,*s;char find[20];

//存放工号和姓名的变量。int i;printf(“通过姓名查找,请按‘1’。n”);printf(“通过工号查找,请按‘2’。n”);

printf(“返回主菜单,请按‘3’。n”);printf(“n=====>功能选择:”);scanf(“%d”,&i);printf(“n”);if(i==3){

} else if(i==1){

printf(“请输入已在存储记录中的职工姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);//定位。if(!p){

} s=(LinkList)malloc(sizeof(ListNode));if(!s){

} printf(“请输入新职工工号:”);gets(s->data.num);printf(“n”);printf(“请输入新职工姓名:”);scanf(“%s”,s->data.name);getchar();printf(“n”);printf(“请输入新职工的性别:(注:男性:male;女性:female)”);scanf(“%s”,s->data.sex);printf(“系统分配存储空间失败!n”);system(“cls”);return;printf(“您输入的该职工姓名不在信息记录中,请重新核审!n”);printf(“返回主菜单。n”);return;system(“cls”);

//退出插入功能,返回主菜单。return;

} getchar();printf(“n”);printf(“请输入新职工的年龄:”);scanf(“%d”,&s->data.age);printf(“n”);printf(“请输入新职工的学历:”);scanf(“%s”,s->data.education);getchar();printf(“n”);printf(“请输入新职工的工资:”);scanf(“%d”,&s->data.salary);printf(“n”);printf(“请输入新职工的电话号码:”);scanf(“%s”,s->data.phone);getchar();printf(“n”);printf(“请输入新职工的住址:”);scanf(“%s”,s->data.address);getchar();printf(“n”);s->next=p->next;p->next=s;printf(“姓名为:%s的新职工信息已成功插到姓名为:%s的职工信息记saveflag=1;

//资料已改动的存储变量。录后面。n”,s->data.name,p->data.name);else if(i==2){

printf(“请输入已在存储记录中的职工工号:”);scanf(“%s”,find);getchar();p=Locatenum(L,find);//定位。if(!p){

printf(“您输入的该职工工号不在信息记录中,请重新核审!n”);printf(“返回主菜单。n”);return;

} s=(LinkList)malloc(sizeof(ListNode));if(!s){

} printf(“请输入新职工工号:”);gets(s->data.num);printf(“n”);printf(“请输入新职工姓名:”);scanf(“%s”,s->data.name);getchar();printf(“n”);printf(“请输入新职工的性别:(注:男性:male;女性:female)”);scanf(“%s”,s->data.sex);getchar();printf(“n”);printf(“请输入新职工的年龄:”);scanf(“%d”,&s->data.age);printf(“n”);printf(“请输入新职工的学历:”);scanf(“%s”,s->data.education);getchar();printf(“n”);printf(“请输入新职工的工资:”);scanf(“%d”,&s->data.salary);printf(“n”);printf(“请输入新职工的电话号码:”);scanf(“%s”,s->data.phone);getchar();printf(“n”);printf(“请输入新职工的住址:”);scanf(“%s”,s->data.address);getchar();printf(“n”);printf(“系统分配存储空间失败!n”);system(“cls”);return;

}

} s->next=p->next;p->next=s;printf(“姓名为:%s的新职工信息已成功插到姓名为:%s的职工信息记saveflag=1;录后面。n”,s->data.name,p->data.name);else {

} printf(“功能选择有误!返回主菜单。n”);return;void main(){

LinkList L;/*定义链表*/ // struct Node *list;

FILE *fp;/* 文件指针 */

int choose;/*保存选择结果变量*/

char ch;

/*保存(y,Y,n,N)*/

int count=0;/*保存文件中的记录条数(或结点个数)*/

struct Node *p,*r;

/*定义记录指针变量*/

printf(“tttt职工信息管理系统nttttn”);

L=(struct Node*)malloc(sizeof(struct Node));

if(!L)

{

printf(“n系统分配存储空间失败!n”);/*如没有申请到,打印提示信

return;

/*返回菜单*/ 息*/

}

L->next=NULL;

r=L;

fp=fopen(“Employeeinfo.txt”,“rb”);

if(fp==NULL)

{

printf(“n***提示***:存储职工信息的文件还不存在,是否创建?

scanf(”%c“,&ch);(y/n)n”);

*/

if(ch=='y'||ch=='Y')

{

fp=fopen(“Employeeinfo.txt”,“ab+”);

printf(“文件创建成功!n”);

}

else

{

printf(“文件没有创建,无法写入职工信息!nn”);

printf(“<-----退 出 职 工 信 息 管 理 系 统----->n”);

exit(0);

}

} // if(fp==NULL)

printf(“n=====>提示:文件已经打开,正在导入记录......n”);

while(!feof(fp))//没有到文件尾时,循环

{

fclose(fp);/* 关闭文件 */

printf(“n=====>提示:记录导入完毕,共导入%d条记录。n”,count);

while(1)

p=(struct Node*)malloc(sizeof(struct Node));

if(!p)

{

if(fread(p,sizeof(struct Node),1,fp))/* 读文件的已有内容放入结点中

{

p->next=NULL;

r->next=p;

r=p;/* 将该结点挂入链表中, r指向最后的节点 */

count++;

printf(“ memory malloc failure!n”);

/*没有申请成功*/

exit(0);

/*退出*/

}

}

} //while(!feof(fp))

{

menu();

printf(“tt====>请选择:”);

scanf(“%d”,&choose);

if(choose==0)

{

if(saveflag==1)

{

getchar();

printf(“n=====>提示:资料已经改动,是否将改动保存到文件

scanf(”%c“,&ch);

if(ch=='y'||ch=='Y')

Save(L);中(y/n)?n”);

} //if

printf(“n***提示***:您已经退出系统,欢迎再次使用!~n”);

break;

}//if switch(choose){ case 1:Add(L);

break;break;break;break;break;break;Sort(L);break;Save(L);case 2:Del(L);case 3:Search(L);case 4:Modify(L);case 5:Insert(L);case 6:Statistics(L);case 7: case 8:

break;system(“cls”);Allemployeeinfo(L);break;case 9: default:

} } } Wrong();break;

第三篇:C语言用指针和链表读写文件

#include

#include

#include

#include

#define MAXLEN_OF_KEYWORD 50

#define MAXLEN_OF_KEYWORDTYPE 30

char i,ch[5];

struct KeyWordBox

{

char Name[MAXLEN_OF_KEYWORD];

intId;

char Type[MAXLEN_OF_KEYWORDTYPE];//该单词的类型struct KeyWordBox *next;//指针

};

void write();

void read();

void main()

{

write();

read();

}

void write()

{

char *FileName=“FileName.txt”;

KeyWordBox transport;

memset(&transport,0,sizeof(struct KeyWordBox));

FILE *out=NULL;

FILE *test=NULL;

test=fopen(FileName,“a”);

if(test==NULL)

{

out=fopen(FileName,“w”);

printf(“ 1 continue,0 exitn”);

i=getchar();

while(i=='1')

{

printf(“请输入关键字n”);

scanf(“%s”,transport.Name);

printf(“请输入IDn”);

scanf(“%d”,&transport.Id);

printf(“请输入Typen”);

scanf(“%s”,transport.Type);

fwrite(&transport,sizeof(struct KeyWordBox),1,out);

printf(“ 1 continue,0 exitn”);

scanf(“%c”,&i);

}

fclose(out);

}

else

{

out=fopen(FileName,“a”);

printf(“ 1 continue,0 exitn”);

scanf(“%c”,&ch);

//i=getchar();

//while(i=='1')

while(strcmp(ch,“1”)==0)

{

printf(“请输入关键字n”);

scanf(“%s”,transport.Name);

printf(“请输入IDn”);

scanf(“%d”,&transport.Id);

printf(“请输入Typen”);

scanf(“%s”,transport.Type);

fwrite(&transport,sizeof(KeyWordBox),1,out);

printf(“ 1 continue,0 exit.n”);

scanf(“%s”,ch);

}

fclose(out);

}

}

void read()

{

char *FileName=“FileName.txt”;

KeyWordBox *Head=NULL,*q=NULL;

KeyWordBox *Body=NULL;

KeyWordBox *p=NULL;

FILE *in=NULL;

in=fopen(FileName,“r”);

if(in==NULL)

{

printf(“can't open the file!n”);

exit(0);

}

else

{

Head=(struct KeyWordBox*)malloc(sizeof(struct KeyWordBox));Head->next =NULL;

}}q=Head;while(!feof(in)){Body=(struct KeyWordBox*)malloc(sizeof(struct KeyWordBox));Body->next=NULL;fread(Body,sizeof(struct KeyWordBox),1,in);if(feof(in)){q->next=NULL;break;}q->next=Body;q=Body;printf(“%st%dt%sn”,Body->Name,Body->Id,Body->Type);} fclose(in);p=Head->next;while(p!=NULL){printf(“%st%dt%sn”,p->Name,p->Id,p->Type);p=p->next;}

第四篇:C语言课程设计 职工信息管理系统 单链表实现程序源代码

//C语言课程设计 职工信息管理系统—单链表实现 #include “stdio.h” #include “stdlib.h” #include “string.h”

int saveflag=0;/*是否需要存盘的标志变量*/

struct employee { char name[15];char num[10];/* 工号 */ char sex[4];char bm[15];char zc[20];int gz;

};

typedef struct node { struct employee data;struct node *next;}Node,*Link;

//Link l(注意是:字母l不是数字1)void add(Link l);void disp(Link l);//查看职工所有信息 void del(Link l);//删除功能

Node* Locate(Link l,char findmess[],char nameornum[]);

void Qur(Link l);//查询功能 void Tongji(Link l);//统计 void Sort(Link l);//排序 void Modify(Link l);//修改功能

void save(Link l);//将单链表l中的数据写入文件

void printe(Node *p);//本函数用于打印链表中某个节点的数据内容 */

//以下4个函数用于输出中文标题 void printstart();void Wrong();void Nofind();void printc();

void menu(){ printf(“t*****************************************************************n”);printf(“t* *n”);printf(“t*

职工信息管理系统_结构体数组实现 *n”);printf(“t* *n”);printf(“t* [1] 增加职工信息 [2] 删除职工信息 *n”);printf(“t* [3] 查询职工信息 [4] 修改职工信息 *n”);printf(“t* [5] 插入职工记录 [6] 统计职工记录 *n”);printf(“t* [7] 排序 [8] 保存职工信息 *n”);printf(“t* [9] 显示数据 [0] 退出系统 *n”);printf(“t* *n”);printf(“t*****************************************************************n”);} //void menu菜单结束

void Disp(Link l)//显示单链表l中存储的职工记录,内容为employee结构中定义的内容 { int count=0;Node *p;p=l->next;// l存储的是单链表中头结点的指针,该头结点没有存储职工信息,指针域指向的后继结点才有职工信息

if(!p)/*p==NULL,NUll在stdlib中定义为0*/ {

printf(“n=====>提示:没有职工记录可以显示!n”);

return;}

printf(“tttt显示结果n”);printstart();//打印横线

printc();//打印各学科标题

printf(“n”);

while(p)//逐条输出链表中存储的职工信息

{

printe(p);

p=p->next;} printstart();printf(“n”);} //void Disp结束

void printstart(){ printf(“---------n”);}

void Wrong(){ printf(“n=====>提示:输入错误!n”);}

void Nofind(){ printf(“n=====>提示:没有找到该职工!n”);}

void printc()/* 本函数用于输出中文 */ { printf(“ 工号t 姓名 性别 部门 职称 工资 总工资平均工资n”);}

void printe(Node *p)/* 本函数用于打印链表中某个节点的数据内容 */ { printf(“%-12s%st%st%dt%dt%dt %dt %dn”,p->data.num,p->data.name,p->data.sex,p->data.bm,p->data.zc,p->data.gz);}

//Locate(l,findmess,“num”);/* 该函数用于定位连表中符合要求的结点,并返回该指针 */ Node* Locate(Link l,char findmess[],char zcornum[]){ Node *r;if(strcmp(zcornum,“num”)==0)/* 按工号查询 */ {

r=l->next;

while(r!=NULL)

{

if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的工号*/

return r;

r=r->next;

} } else if(strcmp(zcornum,“zc”)==0)/* 按职称查询 */ {

r=l->next;

while(r!=NULL)

{

if(strcmp(r->data.zc,findmess)==0)/*若找到findmess值的职工职称*/

return r;

r=r->next;

} } return 0;/*若未找到,返回一个空指针*/ }

//add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点 void Add(Link l)/* 增加职工 */ { Node *p,*r,*s;/*实现添加操作的临时的结构体指针变量*/ char num[10];int flag=0;r=l;s=l->next;//链表没有节点时,s=null;/链表有节点时,指向第一个职工节点

while(r->next!=NULL)//如果存在后继结点时,r指针后移一个

r=r->next;/*将指针移至于链表最末尾,准备添加记录*/

while(1){

printf(“请你输入工号(以'0'返回上一级菜单:)”);

scanf(“%s”,num);

if(strcmp(num,“0”)==0)//输入'0',跳出while(1),即跳出add()函数

break;

s=l->next;//作用? 每次从第一个节点开始找,看num是否重复。

while(s)//工号重复时,返回主菜单

{

if(strcmp(s->data.num,num)==0)

{

printf(“=====>提示:工号为'%s'的职工已经存在,若要修改请你选择'4 修改'!n”,num);

flag=1;//break;

return;

}

s=s->next;

} //while(s)

p=(Node *)malloc(sizeof(Node));//生成没赋值的新节点 p

strcpy(p->data.num,num);

printf(“请你输入姓名:”);

scanf(“%s”,p->data.name);

getchar();

printf(“请你输入性别:”);

scanf(“%s”,p->data.sex);

getchar();

printf(“请你输入职工所在部门:”);

scanf(“%d”,&p->data.bm);

getchar();

printf(“请你输入职工职称:”);

scanf(“%d”,&p->data.zc);

getchar();

printf(“请你输入职工工资:”);

scanf(“%d”,&p->data.gz);

getchar();

/* 信息输入已经完成 */

p->next=NULL;/*表明这是链表的尾部结点*/

r->next=p;/*将新建的结点加入链表尾部中*/

r=p;

saveflag=1;} //while(1)} //void Add增加结束

void Del(Link l)/* 删除 */ { int sel;Node *p,*r;/*实现删除操作的临时的结构体指针变量*/ char findmess[20];

if(!l->next)//当list无后继结点时,提示和结束返回del(){

printf(“n=====>提示:没有记录可以删除!n”);

return;}

printf(“n=====>1按工号删除n=====>2按姓名删除n”);scanf(“%d”,&sel);if(sel==1)//按工号删除

{

printf(“请你输入要删除的工号:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“num”);

if(p)

{

r=l;

while(r->next!=p)

r=r->next;//从第一个结点找起,直到发现r->next=p, 删除结点,跳出循环

r->next=p->next;//r r->next(p)p->next

free(p);

printf(“n=====>提示:该职工已经成功删除!n”);

saveflag=1;

}

else

Nofind();//显示一句话

} //if(sel==1)else if(sel==2)//按姓名删除

{

是待

printf(“请你输入要删除的姓名:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“name”);

if(p)

{

r=l;

while(r->next!=p)

r=r->next;

r->next=p->next;//r r->next(p)p->next

free(p);

printf(“n=====>提示:该职工已经成功删除!n”);

saveflag=1;

}

else

Nofind();} //if(sel==2)else

Wrong();//显示输入错误的话 } //void Del删除结束

void Qur(Link l)//查询功能 { int sel;char findmess[20];Node *p;//实现查询操作的临时的结构体指针变量

if(!l->next){

printf(“n=====>提示:没有资料可以查询!n”);

return;}

printf(“n=====>1按工号查找n=====>2按职称查找n”);scanf(“%d”,&sel);

if(sel==1)/* 工号 */ {

printf(“请你输入要查找的工号:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“num”);

if(p)

{

printf(“tttt查找结果n”);

printstart();//打印横线

printc();//打印各学科标题

printe(p);//打印p结点各个数据成员的值

printstart();//打印横线

}

else

Nofind();} //if(sel==1)

else if(sel==2)/* 职称 */ {

printf(“请你输入要查找的职称:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“zc”);

if(p)

{

printf(“tttt查找结果n”);

printstart();

printc();

printe(p);

printstart();

}

else

Nofind();} else

Wrong();} //void Qur查询结束

void Modify(Link l)//修改功能 { Node *p;char findmess[20];if(!l->next){

printf(“n=====>提示:没有资料可以修改!n”);

return;}

printf(“请你输入要修改的职工工号:”);scanf(“%s”,findmess);p=Locate(l,findmess,“num”);

if(p){

printf(“请你输入新工号(原来是%s):”,p->data.num);

scanf(“%s”,p->data.num);

printf(“请你输入新姓名(原来是%s):”,p->data.name);

scanf(“%s”,p->data.name);

getchar();

printf(“请你输入新性别(原来是%s):”,p->data.sex);

scanf(“%s”,p->data.sex);

getchar();

printf(“请你输入新的部门(原来是%s):”,p->data.bm);

scanf(“%d”,&p->data.bm);

printf(“请你输入新的职称(原来是%s):”,p->data.zc);

scanf(“%d”,&p->data.zc);

getchar();

printf(“请你输入新的工资(原来是%d):”,p->data.gz);

scanf(“%d”,&p->data.gz);

printf(“n=====>提示:资料修改成功!n”);

//shoudsave=1;} else

Nofind();//if(p)结束

} //void Modify(Link l)//修改功能结束

//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。

void Insert(Link l){ Node *s,*r,*p;/*p指向插入位置,p指新插入记录节点*/ char ch,new_num[10],old_num[10];//old_num[]保存插入点位置之前的工号,new_num[]保存输入的新记录的工号

int flag=0;s=l->next;system(“cls”);Disp(l);

while(1){

//stringinput(s,10,“please input insert location after the Number:”);

printf(“请你输入已存在的工号(以'0'返回上一级菜单:)”);

scanf(“%s”,old_num);

if(strcmp(old_num,“0”)==0)//输入'0',跳出while(1),即跳出Insert()函数

return;

s=l->next;//作用? 每次从第一个节点开始找

flag=0;

while(s)/*查询该工号是否存在,flag=1表示该工号存在*/

{

if(strcmp(s->data.num,old_num)==0)

{

flag=1;

break;

}

s=s->next;

}

if(flag==1)

break;/*若工号存在,则进行插入之前的新记录的输入操作*/

else

{

getchar();

printf(“n=====>The number %s is not existing,try again?(y/n):”,old_num);

scanf(“%c”,&ch);

if(ch=='y'||ch=='Y')

{continue;}

else

{return;} //回主菜单

}

}//while(1)/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add()相同*/

printf(“请你输入待插入的工号(以'0'返回上一级菜单:)”);scanf(“%s”,new_num);if(strcmp(new_num,“0”)==0)//输入'0',跳出while(1),即跳出add()函数

return;s=l->next;//作用? 每次从第一个节点开始找,看num是否重复。

while(s)//工号重复时,返回主菜单

{

if(strcmp(s->data.num,new_num)==0)

{

printf(“=====>提示:工号为'%s'的职工已经存在'!n”,new_num);

flag=1;

return;

}

s=s->next;} //while(s)

p=(Node *)malloc(sizeof(Node));if(!p){

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/ }

strcpy(p->data.num,new_num);printf(“请你输入姓名:”);scanf(“%s”,p->data.name);getchar();printf(“请你输入性别:”);scanf(“%s”,p->data.sex);getchar();printf(“请你输入部门:”);scanf(“%d”,&p->data.bm);getchar();printf(“请你输入职称:”);scanf(“%d”,&p->data.zc);getchar();printf(“请你输入工资:”);scanf(“%d”,&p->data.gz);getchar();// 信息输入已经完成

p->next=NULL;/*表明这是链表的尾部结点*/

saveflag=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/ /*将指针赋值给r,因为l中的头节点的下一个节点才实际保存着学生的记录*/

r=l->next;while(1){

if(strcmp(r->data.num,old_num)==0)/*在链表中插入一个节点*/

{

p->next=r->next;

r->next=p;

break;

}

r=r->next;}// while(1),r作为查询指针,依次从第一个节点找起,找到后 跳出 while(1)循环

Disp(l);printf(“nn”);// getchar();

}

void Tongji(Link l)//统计 { Node *max,*min;/*用于指向工资最高的节点*/ Node *t=l->next;if(!t){

system(“cls”);

printf(“n=====>Not employee record!n”);

getchar();

return;} system(“cls”);Disp(l);max=min=t;while(t){

if(t->data.gz>=max->data.gz)max=t;

if(t->data.gz<=min->data.gz)min=t;

t=t->next;

printf(“最高工资为:%dn”,max);

printf(“t%st%st%st%st%st%dnn”,t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);printf(“最低工资为:%dn”,min);

printf(“t%st%st%st%st%st%dnn”,t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);} }

void Sort(Link l)//排序 { Link ll;Node *p,*rr,*s;int i=0;if(l->next==NULL){ system(“cls”);printf(“n=====>Not employee record!n”);getchar();return;} ll=(Node*)malloc(sizeof(Node));/*用于创建新的节点*/ if(!ll){

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/ } ll->next=NULL;system(“cls”);Disp(l);/*显示排序前的所有职工记录*/ p=l->next;while(p)/*p!=NULL*/ {

s=(Node*)malloc(sizeof(Node));/*新建节点用于保存从原链表中取出的节点信息*/

if(!s)/*s==NULL*/

{

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/

}

s->data=p->data;/*填数据域*/

s->next=NULL;/*指针域为空*/

rr=ll;

/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/

while(rr->next!=NULL && rr->next->data.gz>=p->data.gz)

{rr=rr->next;} /*指针移至总分比p所指的节点的总分小的节点位置*/

if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.gz大时,就将p所指节点加入链表尾部*/

rr->next=s;

else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/

{

s->next=rr->next;

rr->next=s;

}

p=p->next;/*原链表中的指针下移一个节点*/ }

l->next=ll->next;/*ll中存储是的已排序的链表的头指针*/

Disp(l);saveflag=1;printf(“n =====>sort complete!n”);}

void Save(Link l){ FILE* fp;Node *p;//实现保存操作的临时的结构体指针变量

int flag=1,count=0;

fp=fopen(“employee.txt”,“wb”);if(fp==NULL){

printf(“n=====>提示:重新打开文件时发生错误!n”);

return;}

p=l->next;//p指向第一个记录结点

while(p){

if(fwrite(p,sizeof(Node),1,fp)==1)//将第一个记录结点值写入文件

{

p=p->next;//依次写入第二个结点的值,count++;//文件的记录数+1

}

else

{

flag=0;

break;

} } //while(p)

if(count>0){

printf(“n=====>提示:文件保存成功.(有%d条记录已经保存.)n”,count);

saveflag=0;} else {

system(“cls”);

printf(“保存文件失败,'0'条记录被保存!n”);} fclose(fp);} // void Save结束

void main(){ Link list;/*定义链表*/ // struct node *list;FILE *fp;/* 文件指针 */ int choose;/*保存选择结果变量*/ char ch;/*保存(y,Y,n,N)*/

int count=0;/*保存文件中的记录条数(或结点个数)*/ struct node *p,*r;/*定义记录指针变量*/ printf(“tttt职工信息管理系统nttttn”);

list=(struct node*)malloc(sizeof(struct node));

if(!list){

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/ }

list->next=NULL;r=list;

fp=fopen(“employee.txt”,“rb”);if(fp==NULL){

printf(“n=====>提示:文件还不存在,是否创建?(y/n)n”);

scanf(“%c”,&ch);

if(ch=='y'||ch=='Y')

fp=fopen(“employee.txt”,“ab+”);

else

exit(0);} // if(fp==NULL)

printf(“n=====>提示:文件已经打开,正在导入记录......n”);

while(!feof(fp))//没有到文件尾时,循环

{

p=(struct node*)malloc(sizeof(struct node));

if(!p)

{

printf(“ memory malloc failure!n”);/*没有申请成功*/

exit(0);/*退出*/

}

if(fread(p,sizeof(struct node),1,fp))/* 读文件的已有内容放入结点中 */

{

p->next=NULL;

r->next=p;

r=p;/* 将该结点挂入链表中, r指向最后的节点 */

count++;

} } //while(!feof(fp))

fclose(fp);/* 关闭文件 */ printf(“n=====>提示:记录导入完毕,共导入%d条记录.n”,count);

while(1){

menu();

printf(“tt====>请选择:”);

scanf(“%d”,&choose);

if(choose==0)

{

if(saveflag==1)

{

getchar();

printf(“n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?n”);

scanf(“%c”,&ch);

if(ch=='y'||ch=='Y')

Save(list);

} //if

printf(“n=====>提示:你已经退出系统,再见!n”);

break;

}//if

switch(choose)

{

case 1:Add(list);

break;/* 增加职工记录 */

case 2:

Del(list);

break;/* 删除职工记录 */

case 3:

Qur(list);

break;/* 查询职工记录 */

case 4:

Modify(list);

break;/* 修改职工记录 */

case 5:

Insert(list);

break;/*插入职工记录*/

case 6:

Tongji(list);

break;/*统计职工记录*/

case 7:

Sort(list);

break;/*排序职工记录*/

case 8:

Save(list);

break;/* 保存职工记录 */

case 9:

system(“cls”);

Disp(list);

break;/*显示职工记录*/

default:

Wrong();

getchar();

break;

} //switch(choose)}//while(1)} //main()/* */

第五篇:串的模式匹配问题实验总结(用C实现)

串的模式匹配问题实验总结

1实验题目:

实现Index(S,T,pos)函数。其中,Index(S,T,pos)为串T在串S的第pos个字符后第一次出现的位置。

2实验目的:

熟练掌握串模式匹配算法。

3实验方法:

分别用朴素模式匹配和

KMP快速模式匹配来实现串的模式匹配问题。具体方法如下:

朴素模式匹配:输入两个字符串,主串S和子串T,从S串的第pos个位置开始与T的第一个位置比较,若不同执行 i=i-j+2;j=1两个语句;若相同,则执行语句 ++i;++j;一直比较完毕为止,若S中有与T相同的部分则返回主串(S字符串)和子串(T字符串)相匹配时第一次出现的位置,若没有就返回0。

KMP快速模式匹配:构造函数get_next(char *T,int *next),求出主串S串中各个字符的next值,然后在Index_KMP(char *S,char *T,int pos)函数中调用get_next(char *T,int *next)函数并调用next值,从S串的第pos 位置开始与T的第一个位置进行比较,若两者相等或j位置的字符next值等于0,则进行语句++i;++j;即一直向下进行。否则,执行语句 j=A[j];直到比较完毕为止。若S中有与T相同的部分则返回主串(S字符串)和子串(T字符串)相匹配时第一次出现的位置,若没有就返回0

4实验过程与结果:

(1)、选择1功能“输入主串、子串和匹配起始位置”,输入主串S:asdfghjkl, 输入子串T:gh,输入pos的值为:2。选择2功能 “朴素的模式匹配算法”,输出结果为 5; 选择3功能 “KMP快速模式匹配算法”,输出结果为 5; 选择0功能,退出程序。截图如下:

(2)、选择1功能“输入主串、子串和匹配起始位置”,输入主串S:asdfghjkl, 输入子串T:wp, 输入pos的值为:2。选择2功能 “朴素的模式匹配算法”,输出结果为 0; 选择3功能 “KMP快速模式匹配算法”,输出结果为 0; 选择1功能“输入主串、子串和匹配起始位置”,输入主串S:asdfghjkl, 输入子串T:sd, 输入pos的值为:4。选择2功能 “朴素的模式匹配算法”,输出结果为 0; 选择3功能 “KMP快速模式匹配算法”,输出结果为 0;

选择0功能,退出程序。截图如下:

5实验体会与收获:

(1)C语言中无法用string型直接定义字符串,所以要用char型的数组来实现字符串的定义。

(2)在char S[]数组,数组的首位即S[0]表示数组长度,用stolen()计算长度,输入的字符串逐步后移一位,此时S[1]存放第一个字符。

(3)在主函数中,用get(S+1);get(T+1);两个语句无法同时实现字符的输入,最后改用C++语句 cin>>S+1;cin>>T+1;使字符的输入得到了实现。(4)程序用有必要的文字说明,以便运行时更加清晰明了。

下载求解Josephus问题实验总结(用C语言循环单链表实现)(精选5篇)word格式文档
下载求解Josephus问题实验总结(用C语言循环单链表实现)(精选5篇).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    黑马程序员C语言教程:如何实现一个优美的链表

    如何实现一个优美的链表 面向对象的语言更接近人的思维方式,而且在很大程度上降低了代码的复杂性,同时提高了代码的可读性和可维护性,传统的 C 代码同样可以设计出比较易读,易维......

    c语言迷宫问题代码实现

    C语言迷宫问题代码如下:#include#include#define LEN sizeof(SEAT)#define MAXSIZE 100#define LENGTH 30typedef struct{int x;//横坐标int y;//纵坐标int di;//表示方向,0-3......

    用c语言实现单纯形法的编程

    用c语言实现单纯形法的编程 #include "stdio.h" #include "math.h" #include int M,N; float c[100],a[100][100],b[100],CZ[100],Dn[100],th[100],x[100]; int Fn[100]; i......

    C语言实验实习总结

    2012年下学期C语言实验实习总结 贺秀山 在科技高度发展的今天,计算机在人们之中的作用越来越突出。而c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算......

    C语言实验程序、总结 实验六 函数(★)

    一 实验目的 1 掌握定义函数的方法; 实验六 函数 2 掌握函数实参与形参的对应关系以及“值传递”的方式; 3 掌握函数递归调用的方法; 二 实验内容 1 编写两个函数,分别求两个正......

    C语言实验程序、总结 实验七 指针大全

    一 实验目的 实验七 指针 1 了解指针的概念,学会定义和使用指针变量。 2 掌握指针、变量和数组的关系及使用方法。 3 学会使用指向函数的指针变量。 二 实验内容 1 编写函数f......

    教学编制问题 c语言 数据结构实现[五篇范例]

    数据结构 课程设计报告 主题:教学计划编制问题 学号:20091003768 班级:计科四班 姓名:熊金莲 指导老师:郭艳内容概要 (1) 题目要求 (2) 教学计划编制问题的要点 (3) 函数模块及各函数可......

    C语言自增自减问题总结

    C语言自增自減问题总结 在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C语言为这种操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运......