第一篇:求解Josephus問(wèn)題實(shí)驗(yàn)總結(jié)(用C語(yǔ)言循環(huán)單鏈表實(shí)現(xiàn))
求解Josephus問(wèn)題實(shí)驗(yàn)總結(jié)
1實(shí)驗(yàn)題目: josephus問(wèn)題可描述如下:
設(shè)有n個(gè)人圍成一個(gè)環(huán),現(xiàn)從第s個(gè)人開(kāi)始報(bào)數(shù),數(shù)到第m的人出列,然后從出列的下一個(gè)人從新開(kāi)始報(bào)數(shù),數(shù)到第m的人又出列,如此重復(fù),直至所有人均出列為止。求這些人出列的順序。
2實(shí)驗(yàn)?zāi)康模?/p>
熟練掌握線性表的順序?qū)崿F(xiàn)和鏈?zhǔn)綄?shí)現(xiàn)的基本操作。
3實(shí)驗(yàn)方法:
通過(guò)運(yùn)用已學(xué)的向量和循環(huán)單鏈表編寫(xiě)程序,并在電腦上運(yùn)行,實(shí)現(xiàn)josephus問(wèn)題的求解。4實(shí)驗(yàn)過(guò)程與結(jié)果:
(1)輸入n值為6,s值為3,m值為2,輸入A[i]的值為1 2 3 4 5 6 輸出結(jié) 果為: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試驗(yàn)體會(huì)與收獲:
(1)寫(xiě)程序是要隨時(shí)注意縮進(jìn),使得程序?qū)哟吻逦?,便于尋找錯(cuò)誤,同時(shí)也讓別人看的更加方便。(2)構(gòu)造循環(huán)單鏈表,要以單鏈表為單元指針指向把最后個(gè)單元與第一個(gè)即可(3)建立好循環(huán)單鏈表后,通過(guò)三個(gè)指針(p,q,tmp)的指示,來(lái)確定報(bào)數(shù),出列人的位置,得以完成。具體過(guò)程如下:p指向head頭指針,通過(guò)s次循環(huán)將p指向報(bào)數(shù)的起始位置s,用q記錄p的位置,再經(jīng)過(guò)m次循環(huán)另p指向出列者的位置,將其數(shù)值保存在一維數(shù)組中,并將其從鏈表中刪除,p指向下一次起始位置,結(jié)束時(shí)返回?cái)?shù)組A[j]。(4)刪除節(jié)點(diǎn)時(shí),注意要釋放節(jié)點(diǎn)。
(5)構(gòu)造函數(shù)時(shí),一定要明確函數(shù)的類型,即返回行還是不返回型,以免出現(xiàn)不必要的錯(cuò)誤。
第二篇:職工信息管理系統(tǒng) 單鏈表實(shí)現(xiàn) C語(yǔ)言源程序(范文)
#include
/* 單鏈表內(nèi)容有無(wú)發(fā)生改變,是否需要存盤(pán)的標(biāo)志變量 */ struct employee {
};
typedef struct Node {
void InitList(LinkList *head)
/*將單鏈表初始化為空。動(dòng)態(tài)生成一個(gè)頭結(jié)點(diǎn),并將頭結(jié)點(diǎn)的指針域置為空*/ {
}
ListNode *Locatenum(LinkList head,char find[])
//通過(guò)職工工號(hào)查找,返回定位指針。{ LinkList p;if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)
/*為頭結(jié)點(diǎn)分配一 printf(“系統(tǒng)分配存儲(chǔ)空間失敗!n”);個(gè)存儲(chǔ)空間*/ exit(-1);(*head)->next=NULL;
/*將頭結(jié)點(diǎn)的指針域置為空*/ struct employee data;struct Node *next;char num[10];
/* 工號(hào) */ char name[15];
/* 姓名 */ char sex[7];
/* 性別 */ int age;
/* 年齡 */ char education[15];
/* 學(xué)歷 */ int salary;
/* 工資 */ char phone[20];
/* 電話號(hào)碼 */ 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[])
//通過(guò)職工姓名查找,返回定位指針。{
}
ListNode *Locatesalary(LinkList head,int salary)
//通過(guò)職工工資查找,返回定位指針。{
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(“請(qǐng)你輸入要修改的職工工號(hào):”);
scanf(“%s”,find);
p=Locatenum(L,find);
if(p)
{
printf(“請(qǐng)你輸入新的工號(hào)(原來(lái)是%s):”,p->data.num);
scanf(“%s”,p->data.num);
getchar();
printf(“n”);
printf(“請(qǐng)你輸入新的姓名(原來(lái)是%s):”,p->data.name);
scanf(“%s”,p->data.name);
getchar();
printf(“n”);
printf(“n***提示***:沒(méi)有資料可以修改!n”);
return;printf(“n***提示***:沒(méi)有找到該職工!n”);
}
printf(“請(qǐng)你輸入新的性別(原來(lái)是%s):”,p->data.sex);
scanf(“%s”,p->data.sex);
getchar();
printf(“n”);
printf(“請(qǐng)你輸入新的年齡(原來(lái)是%d):”,p->data.age);
scanf(“%d”,&p->data.age);
printf(“n”);
printf(“請(qǐng)你輸入新的學(xué)歷(原來(lái)是%s):”,p->data.education);
scanf(“%s”,p->data.education);
getchar();
printf(“n”);
printf(“請(qǐng)你輸入新的工資(原來(lái)是%d):”,p->data.salary);
scanf(“%d”,&p->data.salary);
printf(“n”);
printf(“請(qǐng)你輸入新的電話(原來(lái)是%s):”,p->data.phone);
scanf(“%s”,p->data.phone);
getchar();
printf(“n”);
printf(“請(qǐng)你輸入新的住址(原來(lái)是%s):”,p->data.address);
scanf(“%s”,p->data.address);
getchar();
printf(“n”);
printf(“n***提示***:資料修改成功!n”);
saveflag=1;
}
else
Nofind();//if(p)結(jié)束
} //void Modify(LinkList L)
//修改功能結(jié)束 void Add(LinkList head)
/* 錄入職工信息 */ {
system(“cls”);ListNode *p,*r,*s;
/* 實(shí)現(xiàn)添加操作的臨時(shí)的結(jié)構(gòu)體指針變量 */ int sign;
/* 標(biāo)記重復(fù)工號(hào)的變量 */ char num[10];r=head;s=head->next;
/* 鏈表沒(méi)有節(jié)點(diǎn)時(shí),s=NULL;鏈表有節(jié)點(diǎn)時(shí),指向while(r->next!=NULL)/* 如果存在后繼結(jié)點(diǎn)時(shí),r指針后移一個(gè) */ r=r->next;
/* 將指針移至于鏈表最末尾,準(zhǔn)備添加記錄 */ printf(“輸入‘#’將退出職工信息錄入,退回至主菜單!nn”);while(1){
printf(“(PS:職工號(hào)為‘#’即退出錄入功能)nn”);printf(“請(qǐng)輸入職工號(hào):”);fflush(stdin);
//清除緩沖區(qū)。gets(num);if(strcmp(num,“#”)==0)/* 輸入‘0’,跳出while(1),即跳出Add()函數(shù) */ break;s=head->next;
/* 每次從第一個(gè)節(jié)點(diǎn)開(kāi)始找,看num是否重
while(s){
if(strcmp(s->data.num,num)==0){
} s=s->next;printf(“***提示***n工號(hào)為:‘%s’的職工信息已經(jīng)存在!printf(”若要修改請(qǐng)按‘4’,放棄請(qǐng)按‘0’!n“);scanf(”%d“,&sign);if(sign==4)
Modify(head);return;else 第一個(gè)職工節(jié)點(diǎn) */ 復(fù)。*/ n”,num);}//while(s)if((p=(LinkList)malloc(sizeof(ListNode)))==NULL)//生成沒(méi)賦值的新節(jié)點(diǎn) p。
{
} strcpy(p->data.num,num);printf(“n”);printf(“請(qǐng)輸入該職工姓名:”);scanf(“%s”,p->data.name);getchar();printf(“n”);printf(“請(qǐng)輸入該職工的性別:(注:男性:male;女性:female)”);scanf(“%s”,p->data.sex);getchar();printf(“n”);printf(“請(qǐng)輸入該職工的年齡:”);scanf(“%d”,&p->data.age);printf(“n”);printf(“請(qǐng)輸入該職工的學(xué)歷:”);scanf(“%s”,p->data.education);getchar();printf(“n”);printf(“請(qǐng)輸入該職工的工資:”);scanf(“%d”,&p->data.salary);printf(“n”);printf(“請(qǐng)輸入該職工的電話號(hào)碼:”);scanf(“%s”,p->data.phone);getchar();printf(“n”);printf(“請(qǐng)輸入該職工的住址:”);gets(p->data.address);printf(“n”);p->next=NULL;
/* 表明這是鏈表的尾部結(jié)點(diǎn) */ r->next=p;
/* 將新建的結(jié)點(diǎn)加入鏈表尾部中 */ r=p;saveflag=1;printf(“n”);printf(“系統(tǒng)分配存儲(chǔ)空間失??!n”);printf(“退出程序!n”);exit(-1);}//while(1)}//void Add函數(shù)結(jié)束。
void printline()
//打印橫線。{ }
void printsubject()
//打印各分類標(biāo)題。{ }
void printLinkList(LinkList p)
//打印p結(jié)點(diǎn)各個(gè)數(shù)據(jù)成員的值。{ 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顯示結(jié)果n”);printline();printsubject();printf(“n”);while(p)printf(“***提示***:目前沒(méi)有存儲(chǔ)任何職工記錄!n”);printf(“返回主菜單,請(qǐng)重新選擇功能!n”);return;printf(“ 工 號(hào)t 姓 名
性 別
年 齡
學(xué) 歷
工 資
電 話tt 住 址n”);printf(“------------------n”);
} {
} printline();printf(“n”);printf(“已經(jīng)存儲(chǔ)了%d條職工信息!n”,count);printLinkList(p);p=p->next;count++;void Wrong(){ }
void menu()
//主菜單。{
printf(“n”);printf(“t**********************************************************printf(”t*
printf(“t*
printf(”t*
< 職工信息管理系統(tǒng)_單鏈表實(shí)現(xiàn) >
printf(“t*
printf(”t*
[1]
錄入職工信息
[2]
刪除職工信息
printf(“t*
[3]
查詢職工信息
[4]
修改職工信息
printf(”t*
[5]
插入職工記錄
[6]
統(tǒng)計(jì)職工信息
printf(“t*
[7]
排序
[8]
保存職工信息
printf(”t*
[9]
顯示所有職工記錄
[0]
退出系統(tǒng)
printf(“n***提示***:輸入錯(cuò)誤!n”);*********n“);*n”);*n“);*n”);*n“);*n”);*n“);*n”);*n“);*n”);
printf(“t*
printf(”t*
printf(“t*
版權(quán)所有人:printf(”t*
電子132班
printf(“t*
printf(”t***********************************************************n“);*n”);彭林
*n“);*n”);1319200063
*n“);*********n”);} //void menu菜單結(jié)束。
void Del(LinkList L)//刪除職工信息。{
int select;
//刪除方式選擇記錄變量。ListNode *p,*r;char find[20];if(!L->next)
//當(dāng)list無(wú)后繼結(jié)點(diǎn)時(shí),提示和結(jié)束Del()函數(shù)。{
}
printf(“n按工號(hào)刪除,請(qǐng)按‘1’n按姓名刪除,請(qǐng)按‘2’n”);printf(“n=====>功能選擇:”);scanf(“%d”,&select);if(select==1){
printf(“請(qǐng)輸入要?jiǎng)h除的職工工號(hào):”);scanf(“%s”,find);getchar();p=Locatenum(L,find);if(p){ r=L;printf(“n***提示***:沒(méi)有記錄可以刪除!n”);return;
} while(r->next!=p)r=r->next;//從第一個(gè)結(jié)點(diǎn)找起,直到發(fā)現(xiàn)r->next=p, 是待刪除結(jié)點(diǎn),跳出循環(huán)。
r->next=p->next;free(p);printf(“n***提示***:該職工信息已成功刪除!n”);saveflag=1;else Nofind();}//if(select==1).else if(select==2){
printf(“請(qǐng)輸入要?jiǎng)h除的職工姓名:”);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();
//顯示輸入錯(cuò)誤的話
}//void Del()刪除函數(shù)結(jié)束。
void Search(LinkList L)
//查詢職工信息。{ int select;
int salary;int sign=0;char find[20];ListNode *p;
//實(shí)現(xiàn)查詢操作的臨時(shí)結(jié)構(gòu)體指針變量。if(!L->next){
} printf(“n按工號(hào)查找,請(qǐng)按‘1’n按工資查找,請(qǐng)按‘2’n按姓名查找,printf(”n=====>功能選擇:“);scanf(”%d“,&select);printf(”n“);if(select==1)
//工號(hào)。{
} else if(select==2)
//工資。{
printf(”請(qǐng)輸入要查找的工資:“);scanf(”%d“,&salary);p=Locatesalary(L,salary);printf(”請(qǐng)輸入要查找的工號(hào):“);scanf(”%s“,find);getchar();p=Locatenum(L,find);if(p){
} else Nofind();printf(”tttt
查找結(jié)果n“);printline();
//打印橫線。printsubject();
//打印各分類標(biāo)題。
printLinkList(p);
//打印p結(jié)點(diǎn)各個(gè)數(shù)據(jù)成員的值。printline();
//打印橫線。printf(”n***提示***:沒(méi)有職工信息資料可以查詢!n“);printf(”返回主菜單,請(qǐng)重新選擇功能!n“);return;請(qǐng)按‘3’n”);
} if(p){
} while(p){
{
} } if(sign==0)Nofind();printf(“tttt查找結(jié)果n”);printline();printsubject();printLinkList(p);printline();sign++;p=Locatesalary(p,salary);if(p)printf(“tttt查找結(jié)果n”);printline();printsubject();printLinkList(p);printline();sign++;else if(select==3)
//姓名。{
printf(“請(qǐng)輸入要查找的姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);if(p){
printf(“tttt查找結(jié)果n”);printline();printsubject();printLinkList(p);
} } printline();else Nofind();else Wrong();}//void Search()查詢函數(shù)結(jié)束。
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)
//將第一個(gè)記錄結(jié)點(diǎn)值寫(xiě)入文
{
p=p->next;
//依次寫(xiě)入下一個(gè)結(jié)點(diǎn)的 count++;
//文件的記錄數(shù)+1。printf(“n***提示***:打開(kāi)文件時(shí)發(fā)生錯(cuò)誤!n”);return;件。
值。
}
else
{
flag=0;
printf(“寫(xiě)入文件過(guò)程發(fā)生錯(cuò)誤!n”);
break;
}
}//while(p).if(count>0){
} else {
} fclose(fp);system(“cls”);//清屏。
printf(“文件保存失??!‘0’條記錄被保存。n”);printf(“n***提示***:文件保存成功。(有%d條記錄已經(jīng)保存。)n”,count);saveflag=0;
}//void Save()函數(shù)結(jié)束。
void Sort(LinkList L)
//排序功能函數(shù)。{
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 //不包含頭結(jié)點(diǎn)的職工信息結(jié)點(diǎn)的總個(gè)數(shù)。p=p->next;system(“cls”); //清屏。printf(“無(wú)任何職工信息!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)//統(tǒng)計(jì)職工中的最高工資和最低工資。{ ListNode *Max,*Min;int i;ListNode *t=L->next;if(!t){ system(“cls”); //清屏。printf(“沒(méi)有儲(chǔ)存任何職工記錄!n”); } } printf(“返回主菜單,請(qǐng)先錄入職工信息!n”);return;system(“cls”);Max=Min=t;t=t->next;while(t){ } printf(“最高工資為:%dn”,Max->data.salary);printf(“最低工資為:%dn”,Min->data.salary);printf(“若要查看最低,最高工資的相關(guān)職工信息,n”);printf(“請(qǐng)按‘1’,然后按照提示進(jìn)行相關(guān)操作,n”);printf(“否則,請(qǐng)按‘1’除外的任何數(shù)字鍵以退出統(tǒng)計(jì)功能,返回主菜單。n”);printf(“n=====>功能選擇:”);scanf(“%d”,&i);if(i==1)Search(L); //顯示符合要求的職工信息。return;else if(Max->data.salary //Max指針指向最高工資的職工結(jié)點(diǎn)。Min=t; //Min指針指向最低工資的職工結(jié)點(diǎn)。if(Min->data.salary>t->data.salary)t=t->next;void Insert(LinkList L) //插入新的職工信息。{ printf(“本功能可以通過(guò)姓名和工號(hào)查找到符合要求的n”);//功能介紹。printf(“相關(guān)職工信息,然后將您希望添加進(jìn)去的新的n”);printf(“職工信息插入到該職工信息記錄的后面。n”);ListNode *p,*s;char find[20]; //存放工號(hào)和姓名的變量。int i;printf(“通過(guò)姓名查找,請(qǐng)按‘1’。n”);printf(“通過(guò)工號(hào)查找,請(qǐng)按‘2’。n”); printf(“返回主菜單,請(qǐng)按‘3’。n”);printf(“n=====>功能選擇:”);scanf(“%d”,&i);printf(“n”);if(i==3){ } else if(i==1){ printf(“請(qǐng)輸入已在存儲(chǔ)記錄中的職工姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);//定位。if(!p){ } s=(LinkList)malloc(sizeof(ListNode));if(!s){ } printf(“請(qǐng)輸入新職工工號(hào):”);gets(s->data.num);printf(“n”);printf(“請(qǐng)輸入新職工姓名:”);scanf(“%s”,s->data.name);getchar();printf(“n”);printf(“請(qǐng)輸入新職工的性別:(注:男性:male;女性:female)”);scanf(“%s”,s->data.sex);printf(“系統(tǒng)分配存儲(chǔ)空間失敗!n”);system(“cls”);return;printf(“您輸入的該職工姓名不在信息記錄中,請(qǐng)重新核審!n”);printf(“返回主菜單。n”);return;system(“cls”); //退出插入功能,返回主菜單。return; } getchar();printf(“n”);printf(“請(qǐng)輸入新職工的年齡:”);scanf(“%d”,&s->data.age);printf(“n”);printf(“請(qǐng)輸入新職工的學(xué)歷:”);scanf(“%s”,s->data.education);getchar();printf(“n”);printf(“請(qǐng)輸入新職工的工資:”);scanf(“%d”,&s->data.salary);printf(“n”);printf(“請(qǐng)輸入新職工的電話號(hào)碼:”);scanf(“%s”,s->data.phone);getchar();printf(“n”);printf(“請(qǐng)輸入新職工的住址:”);scanf(“%s”,s->data.address);getchar();printf(“n”);s->next=p->next;p->next=s;printf(“姓名為:%s的新職工信息已成功插到姓名為:%s的職工信息記saveflag=1; //資料已改動(dòng)的存儲(chǔ)變量。錄后面。n”,s->data.name,p->data.name);else if(i==2){ printf(“請(qǐng)輸入已在存儲(chǔ)記錄中的職工工號(hào):”);scanf(“%s”,find);getchar();p=Locatenum(L,find);//定位。if(!p){ printf(“您輸入的該職工工號(hào)不在信息記錄中,請(qǐng)重新核審!n”);printf(“返回主菜單。n”);return; } s=(LinkList)malloc(sizeof(ListNode));if(!s){ } printf(“請(qǐng)輸入新職工工號(hào):”);gets(s->data.num);printf(“n”);printf(“請(qǐng)輸入新職工姓名:”);scanf(“%s”,s->data.name);getchar();printf(“n”);printf(“請(qǐng)輸入新職工的性別:(注:男性:male;女性:female)”);scanf(“%s”,s->data.sex);getchar();printf(“n”);printf(“請(qǐng)輸入新職工的年齡:”);scanf(“%d”,&s->data.age);printf(“n”);printf(“請(qǐng)輸入新職工的學(xué)歷:”);scanf(“%s”,s->data.education);getchar();printf(“n”);printf(“請(qǐng)輸入新職工的工資:”);scanf(“%d”,&s->data.salary);printf(“n”);printf(“請(qǐng)輸入新職工的電話號(hào)碼:”);scanf(“%s”,s->data.phone);getchar();printf(“n”);printf(“請(qǐng)輸入新職工的住址:”);scanf(“%s”,s->data.address);getchar();printf(“n”);printf(“系統(tǒng)分配存儲(chǔ)空間失?。”);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;/*保存選擇結(jié)果變量*/ char ch; /*保存(y,Y,n,N)*/ int count=0;/*保存文件中的記錄條數(shù)(或結(jié)點(diǎn)個(gè)數(shù))*/ struct Node *p,*r; /*定義記錄指針變量*/ printf(“tttt職工信息管理系統(tǒng)nttttn”); L=(struct Node*)malloc(sizeof(struct Node)); if(!L) { printf(“n系統(tǒng)分配存儲(chǔ)空間失敗!n”);/*如沒(méi)有申請(qǐng)到,打印提示信 return; /*返回菜單*/ 息*/ } L->next=NULL; r=L; fp=fopen(“Employeeinfo.txt”,“rb”); if(fp==NULL) { printf(“n***提示***:存儲(chǔ)職工信息的文件還不存在,是否創(chuàng)建? scanf(”%c“,&ch);(y/n)n”); */ if(ch=='y'||ch=='Y') { fp=fopen(“Employeeinfo.txt”,“ab+”); printf(“文件創(chuàng)建成功!n”); } else { printf(“文件沒(méi)有創(chuàng)建,無(wú)法寫(xiě)入職工信息!nn”); printf(“<-----退 出 職 工 信 息 管 理 系 統(tǒng)----->n”); exit(0); } } // if(fp==NULL) printf(“n=====>提示:文件已經(jīng)打開(kāi),正在導(dǎo)入記錄......n”); while(!feof(fp))//沒(méi)有到文件尾時(shí),循環(huán) { fclose(fp);/* 關(guān)閉文件 */ printf(“n=====>提示:記錄導(dǎo)入完畢,共導(dǎo)入%d條記錄。n”,count); while(1) p=(struct Node*)malloc(sizeof(struct Node)); if(!p) { if(fread(p,sizeof(struct Node),1,fp))/* 讀文件的已有內(nèi)容放入結(jié)點(diǎn)中 { p->next=NULL; r->next=p; r=p;/* 將該結(jié)點(diǎn)掛入鏈表中, r指向最后的節(jié)點(diǎn) */ count++; printf(“ memory malloc failure!n”); /*沒(méi)有申請(qǐng)成功*/ exit(0); /*退出*/ } } } //while(!feof(fp)) { menu(); printf(“tt====>請(qǐng)選擇:”); scanf(“%d”,&choose); if(choose==0) { if(saveflag==1) { getchar(); printf(“n=====>提示:資料已經(jīng)改動(dòng),是否將改動(dòng)保存到文件 scanf(”%c“,&ch); if(ch=='y'||ch=='Y') Save(L);中(y/n)?n”); } //if printf(“n***提示***:您已經(jīng)退出系統(tǒng),歡迎再次使用!~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; #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(“請(qǐng)輸入關(guān)鍵字n”); scanf(“%s”,transport.Name); printf(“請(qǐng)輸入IDn”); scanf(“%d”,&transport.Id); printf(“請(qǐng)輸入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(“請(qǐng)輸入關(guān)鍵字n”); scanf(“%s”,transport.Name); printf(“請(qǐng)輸入IDn”); scanf(“%d”,&transport.Id); printf(“請(qǐng)輸入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語(yǔ)言課程設(shè)計(jì) 職工信息管理系統(tǒng)—單鏈表實(shí)現(xiàn) #include “stdio.h” #include “stdlib.h” #include “string.h” int saveflag=0;/*是否需要存盤(pán)的標(biāo)志變量*/ struct employee { char name[15];char num[10];/* 工號(hào) */ 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不是數(shù)字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);//統(tǒng)計(jì) void Sort(Link l);//排序 void Modify(Link l);//修改功能 void save(Link l);//將單鏈表l中的數(shù)據(jù)寫(xiě)入文件 void printe(Node *p);//本函數(shù)用于打印鏈表中某個(gè)節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容 */ //以下4個(gè)函數(shù)用于輸出中文標(biāo)題 void printstart();void Wrong();void Nofind();void printc(); void menu(){ printf(“t*****************************************************************n”);printf(“t* *n”);printf(“t* 職工信息管理系統(tǒng)_結(jié)構(gòu)體數(shù)組實(shí)現(xiàn) *n”);printf(“t* *n”);printf(“t* [1] 增加職工信息 [2] 刪除職工信息 *n”);printf(“t* [3] 查詢職工信息 [4] 修改職工信息 *n”);printf(“t* [5] 插入職工記錄 [6] 統(tǒng)計(jì)職工記錄 *n”);printf(“t* [7] 排序 [8] 保存職工信息 *n”);printf(“t* [9] 顯示數(shù)據(jù) [0] 退出系統(tǒng) *n”);printf(“t* *n”);printf(“t*****************************************************************n”);} //void menu菜單結(jié)束 void Disp(Link l)//顯示單鏈表l中存儲(chǔ)的職工記錄,內(nèi)容為employee結(jié)構(gòu)中定義的內(nèi)容 { int count=0;Node *p;p=l->next;// l存儲(chǔ)的是單鏈表中頭結(jié)點(diǎn)的指針,該頭結(jié)點(diǎn)沒(méi)有存儲(chǔ)職工信息,指針域指向的后繼結(jié)點(diǎn)才有職工信息 if(!p)/*p==NULL,NUll在stdlib中定義為0*/ { printf(“n=====>提示:沒(méi)有職工記錄可以顯示!n”); return;} printf(“tttt顯示結(jié)果n”);printstart();//打印橫線 printc();//打印各學(xué)科標(biāo)題 printf(“n”); while(p)//逐條輸出鏈表中存儲(chǔ)的職工信息 { printe(p); p=p->next;} printstart();printf(“n”);} //void Disp結(jié)束 void printstart(){ printf(“---------n”);} void Wrong(){ printf(“n=====>提示:輸入錯(cuò)誤!n”);} void Nofind(){ printf(“n=====>提示:沒(méi)有找到該職工!n”);} void printc()/* 本函數(shù)用于輸出中文 */ { printf(“ 工號(hào)t 姓名 性別 部門 職稱 工資 總工資平均工資n”);} void printe(Node *p)/* 本函數(shù)用于打印鏈表中某個(gè)節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容 */ { 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”);/* 該函數(shù)用于定位連表中符合要求的結(jié)點(diǎn),并返回該指針 */ Node* Locate(Link l,char findmess[],char zcornum[]){ Node *r;if(strcmp(zcornum,“num”)==0)/* 按工號(hào)查詢 */ { r=l->next; while(r!=NULL) { if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的工號(hào)*/ 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;/*若未找到,返回一個(gè)空指針*/ } //add()函數(shù)中,無(wú)節(jié)點(diǎn)時(shí),r指向list頭,有節(jié)點(diǎn)時(shí),r指向末尾節(jié)點(diǎn) void Add(Link l)/* 增加職工 */ { Node *p,*r,*s;/*實(shí)現(xiàn)添加操作的臨時(shí)的結(jié)構(gòu)體指針變量*/ char num[10];int flag=0;r=l;s=l->next;//鏈表沒(méi)有節(jié)點(diǎn)時(shí),s=null;/鏈表有節(jié)點(diǎn)時(shí),指向第一個(gè)職工節(jié)點(diǎn) while(r->next!=NULL)//如果存在后繼結(jié)點(diǎn)時(shí),r指針后移一個(gè) r=r->next;/*將指針移至于鏈表最末尾,準(zhǔn)備添加記錄*/ while(1){ printf(“請(qǐng)你輸入工號(hào)(以'0'返回上一級(jí)菜單:)”); scanf(“%s”,num); if(strcmp(num,“0”)==0)//輸入'0',跳出while(1),即跳出add()函數(shù) break; s=l->next;//作用? 每次從第一個(gè)節(jié)點(diǎn)開(kāi)始找,看num是否重復(fù)。 while(s)//工號(hào)重復(fù)時(shí),返回主菜單 { if(strcmp(s->data.num,num)==0) { printf(“=====>提示:工號(hào)為'%s'的職工已經(jīng)存在,若要修改請(qǐng)你選擇'4 修改'!n”,num); flag=1;//break; return; } s=s->next; } //while(s) p=(Node *)malloc(sizeof(Node));//生成沒(méi)賦值的新節(jié)點(diǎn) p strcpy(p->data.num,num); printf(“請(qǐng)你輸入姓名:”); scanf(“%s”,p->data.name); getchar(); printf(“請(qǐng)你輸入性別:”); scanf(“%s”,p->data.sex); getchar(); printf(“請(qǐng)你輸入職工所在部門:”); scanf(“%d”,&p->data.bm); getchar(); printf(“請(qǐng)你輸入職工職稱:”); scanf(“%d”,&p->data.zc); getchar(); printf(“請(qǐng)你輸入職工工資:”); scanf(“%d”,&p->data.gz); getchar(); /* 信息輸入已經(jīng)完成 */ p->next=NULL;/*表明這是鏈表的尾部結(jié)點(diǎn)*/ r->next=p;/*將新建的結(jié)點(diǎn)加入鏈表尾部中*/ r=p; saveflag=1;} //while(1)} //void Add增加結(jié)束 void Del(Link l)/* 刪除 */ { int sel;Node *p,*r;/*實(shí)現(xiàn)刪除操作的臨時(shí)的結(jié)構(gòu)體指針變量*/ char findmess[20]; if(!l->next)//當(dāng)list無(wú)后繼結(jié)點(diǎn)時(shí),提示和結(jié)束返回del(){ printf(“n=====>提示:沒(méi)有記錄可以刪除!n”); return;} printf(“n=====>1按工號(hào)刪除n=====>2按姓名刪除n”);scanf(“%d”,&sel);if(sel==1)//按工號(hào)刪除 { printf(“請(qǐng)你輸入要?jiǎng)h除的工號(hào):”); scanf(“%s”,findmess); p=Locate(l,findmess,“num”); if(p) { r=l; while(r->next!=p) r=r->next;//從第一個(gè)結(jié)點(diǎn)找起,直到發(fā)現(xiàn)r->next=p, 刪除結(jié)點(diǎn),跳出循環(huán) r->next=p->next;//r r->next(p)p->next free(p); printf(“n=====>提示:該職工已經(jīng)成功刪除!n”); saveflag=1; } else Nofind();//顯示一句話 } //if(sel==1)else if(sel==2)//按姓名刪除 { 是待 printf(“請(qǐng)你輸入要?jiǎng)h除的姓名:”); 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=====>提示:該職工已經(jīng)成功刪除!n”); saveflag=1; } else Nofind();} //if(sel==2)else Wrong();//顯示輸入錯(cuò)誤的話 } //void Del刪除結(jié)束 void Qur(Link l)//查詢功能 { int sel;char findmess[20];Node *p;//實(shí)現(xiàn)查詢操作的臨時(shí)的結(jié)構(gòu)體指針變量 if(!l->next){ printf(“n=====>提示:沒(méi)有資料可以查詢!n”); return;} printf(“n=====>1按工號(hào)查找n=====>2按職稱查找n”);scanf(“%d”,&sel); if(sel==1)/* 工號(hào) */ { printf(“請(qǐng)你輸入要查找的工號(hào):”); scanf(“%s”,findmess); p=Locate(l,findmess,“num”); if(p) { printf(“tttt查找結(jié)果n”); printstart();//打印橫線 printc();//打印各學(xué)科標(biāo)題 printe(p);//打印p結(jié)點(diǎn)各個(gè)數(shù)據(jù)成員的值 printstart();//打印橫線 } else Nofind();} //if(sel==1) else if(sel==2)/* 職稱 */ { printf(“請(qǐng)你輸入要查找的職稱:”); scanf(“%s”,findmess); p=Locate(l,findmess,“zc”); if(p) { printf(“tttt查找結(jié)果n”); printstart(); printc(); printe(p); printstart(); } else Nofind();} else Wrong();} //void Qur查詢結(jié)束 void Modify(Link l)//修改功能 { Node *p;char findmess[20];if(!l->next){ printf(“n=====>提示:沒(méi)有資料可以修改!n”); return;} printf(“請(qǐng)你輸入要修改的職工工號(hào):”);scanf(“%s”,findmess);p=Locate(l,findmess,“num”); if(p){ printf(“請(qǐng)你輸入新工號(hào)(原來(lái)是%s):”,p->data.num); scanf(“%s”,p->data.num); printf(“請(qǐng)你輸入新姓名(原來(lái)是%s):”,p->data.name); scanf(“%s”,p->data.name); getchar(); printf(“請(qǐng)你輸入新性別(原來(lái)是%s):”,p->data.sex); scanf(“%s”,p->data.sex); getchar(); printf(“請(qǐng)你輸入新的部門(原來(lái)是%s):”,p->data.bm); scanf(“%d”,&p->data.bm); printf(“請(qǐng)你輸入新的職稱(原來(lái)是%s):”,p->data.zc); scanf(“%d”,&p->data.zc); getchar(); printf(“請(qǐng)你輸入新的工資(原來(lái)是%d):”,p->data.gz); scanf(“%d”,&p->data.gz); printf(“n=====>提示:資料修改成功!n”); //shoudsave=1;} else Nofind();//if(p)結(jié)束 } //void Modify(Link l)//修改功能結(jié)束 //插入記錄:按工號(hào)查詢到要插入的節(jié)點(diǎn)的位置,然后在該工號(hào)之后插入一個(gè)新節(jié)點(diǎn)。 void Insert(Link l){ Node *s,*r,*p;/*p指向插入位置,p指新插入記錄節(jié)點(diǎn)*/ char ch,new_num[10],old_num[10];//old_num[]保存插入點(diǎn)位置之前的工號(hào),new_num[]保存輸入的新記錄的工號(hào) int flag=0;s=l->next;system(“cls”);Disp(l); while(1){ //stringinput(s,10,“please input insert location after the Number:”); printf(“請(qǐng)你輸入已存在的工號(hào)(以'0'返回上一級(jí)菜單:)”); scanf(“%s”,old_num); if(strcmp(old_num,“0”)==0)//輸入'0',跳出while(1),即跳出Insert()函數(shù) return; s=l->next;//作用? 每次從第一個(gè)節(jié)點(diǎn)開(kāi)始找 flag=0; while(s)/*查詢?cè)摴ぬ?hào)是否存在,flag=1表示該工號(hào)存在*/ { if(strcmp(s->data.num,old_num)==0) { flag=1; break; } s=s->next; } if(flag==1) break;/*若工號(hào)存在,則進(jìn)行插入之前的新記錄的輸入操作*/ 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)/*以下新記錄的插入新節(jié)點(diǎn),工號(hào)不能跟已存在的工號(hào)相同,操作與Add()相同*/ printf(“請(qǐng)你輸入待插入的工號(hào)(以'0'返回上一級(jí)菜單:)”);scanf(“%s”,new_num);if(strcmp(new_num,“0”)==0)//輸入'0',跳出while(1),即跳出add()函數(shù) return;s=l->next;//作用? 每次從第一個(gè)節(jié)點(diǎn)開(kāi)始找,看num是否重復(fù)。 while(s)//工號(hào)重復(fù)時(shí),返回主菜單 { if(strcmp(s->data.num,new_num)==0) { printf(“=====>提示:工號(hào)為'%s'的職工已經(jīng)存在'!n”,new_num); flag=1; return; } s=s->next;} //while(s) p=(Node *)malloc(sizeof(Node));if(!p){ printf(“n allocate memory failure ”);/*如沒(méi)有申請(qǐng)到,打印提示信息*/ return;/*返回主界面*/ } strcpy(p->data.num,new_num);printf(“請(qǐng)你輸入姓名:”);scanf(“%s”,p->data.name);getchar();printf(“請(qǐng)你輸入性別:”);scanf(“%s”,p->data.sex);getchar();printf(“請(qǐng)你輸入部門:”);scanf(“%d”,&p->data.bm);getchar();printf(“請(qǐng)你輸入職稱:”);scanf(“%d”,&p->data.zc);getchar();printf(“請(qǐng)你輸入工資:”);scanf(“%d”,&p->data.gz);getchar();// 信息輸入已經(jīng)完成 p->next=NULL;/*表明這是鏈表的尾部結(jié)點(diǎn)*/ saveflag=1;/*在main()有對(duì)該全局變量的判斷,若為1,則進(jìn)行存盤(pán)操作*/ /*將指針賦值給r,因?yàn)閘中的頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)才實(shí)際保存著學(xué)生的記錄*/ r=l->next;while(1){ if(strcmp(r->data.num,old_num)==0)/*在鏈表中插入一個(gè)節(jié)點(diǎn)*/ { p->next=r->next; r->next=p; break; } r=r->next;}// while(1),r作為查詢指針,依次從第一個(gè)節(jié)點(diǎn)找起,找到后 跳出 while(1)循環(huán) Disp(l);printf(“nn”);// getchar(); } void Tongji(Link l)//統(tǒng)計(jì) { Node *max,*min;/*用于指向工資最高的節(jié)點(diǎn)*/ 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));/*用于創(chuàng)建新的節(jié)點(diǎn)*/ if(!ll){ printf(“n allocate memory failure ”);/*如沒(méi)有申請(qǐng)到,打印提示信息*/ return;/*返回主界面*/ } ll->next=NULL;system(“cls”);Disp(l);/*顯示排序前的所有職工記錄*/ p=l->next;while(p)/*p!=NULL*/ { s=(Node*)malloc(sizeof(Node));/*新建節(jié)點(diǎn)用于保存從原鏈表中取出的節(jié)點(diǎn)信息*/ if(!s)/*s==NULL*/ { printf(“n allocate memory failure ”);/*如沒(méi)有申請(qǐng)到,打印提示信息*/ return;/*返回主界面*/ } s->data=p->data;/*填數(shù)據(jù)域*/ s->next=NULL;/*指針域?yàn)榭?/ rr=ll; /*rr鏈表于存儲(chǔ)插入單個(gè)節(jié)點(diǎn)后保持排序的鏈表,ll是這個(gè)鏈表的頭指針,每次從頭開(kāi)始查找插入位置*/ while(rr->next!=NULL && rr->next->data.gz>=p->data.gz) {rr=rr->next;} /*指針移至總分比p所指的節(jié)點(diǎn)的總分小的節(jié)點(diǎn)位置*/ if(rr->next==NULL)/*若新鏈表ll中的所有節(jié)點(diǎn)的總分值都比p->data.gz大時(shí),就將p所指節(jié)點(diǎn)加入鏈表尾部*/ rr->next=s; else /*否則將該節(jié)點(diǎn)插入至第一個(gè)總分字段比它小的節(jié)點(diǎn)的前面*/ { s->next=rr->next; rr->next=s; } p=p->next;/*原鏈表中的指針下移一個(gè)節(jié)點(diǎn)*/ } l->next=ll->next;/*ll中存儲(chǔ)是的已排序的鏈表的頭指針*/ Disp(l);saveflag=1;printf(“n =====>sort complete!n”);} void Save(Link l){ FILE* fp;Node *p;//實(shí)現(xiàn)保存操作的臨時(shí)的結(jié)構(gòu)體指針變量 int flag=1,count=0; fp=fopen(“employee.txt”,“wb”);if(fp==NULL){ printf(“n=====>提示:重新打開(kāi)文件時(shí)發(fā)生錯(cuò)誤!n”); return;} p=l->next;//p指向第一個(gè)記錄結(jié)點(diǎn) while(p){ if(fwrite(p,sizeof(Node),1,fp)==1)//將第一個(gè)記錄結(jié)點(diǎn)值寫(xiě)入文件 { p=p->next;//依次寫(xiě)入第二個(gè)結(jié)點(diǎn)的值,count++;//文件的記錄數(shù)+1 } else { flag=0; break; } } //while(p) if(count>0){ printf(“n=====>提示:文件保存成功.(有%d條記錄已經(jīng)保存.)n”,count); saveflag=0;} else { system(“cls”); printf(“保存文件失敗,'0'條記錄被保存!n”);} fclose(fp);} // void Save結(jié)束 void main(){ Link list;/*定義鏈表*/ // struct node *list;FILE *fp;/* 文件指針 */ int choose;/*保存選擇結(jié)果變量*/ char ch;/*保存(y,Y,n,N)*/ int count=0;/*保存文件中的記錄條數(shù)(或結(jié)點(diǎn)個(gè)數(shù))*/ struct node *p,*r;/*定義記錄指針變量*/ printf(“tttt職工信息管理系統(tǒng)nttttn”); list=(struct node*)malloc(sizeof(struct node)); if(!list){ printf(“n allocate memory failure ”);/*如沒(méi)有申請(qǐng)到,打印提示信息*/ return;/*返回主界面*/ } list->next=NULL;r=list; fp=fopen(“employee.txt”,“rb”);if(fp==NULL){ printf(“n=====>提示:文件還不存在,是否創(chuàng)建?(y/n)n”); scanf(“%c”,&ch); if(ch=='y'||ch=='Y') fp=fopen(“employee.txt”,“ab+”); else exit(0);} // if(fp==NULL) printf(“n=====>提示:文件已經(jīng)打開(kāi),正在導(dǎo)入記錄......n”); while(!feof(fp))//沒(méi)有到文件尾時(shí),循環(huán) { p=(struct node*)malloc(sizeof(struct node)); if(!p) { printf(“ memory malloc failure!n”);/*沒(méi)有申請(qǐng)成功*/ exit(0);/*退出*/ } if(fread(p,sizeof(struct node),1,fp))/* 讀文件的已有內(nèi)容放入結(jié)點(diǎn)中 */ { p->next=NULL; r->next=p; r=p;/* 將該結(jié)點(diǎn)掛入鏈表中, r指向最后的節(jié)點(diǎn) */ count++; } } //while(!feof(fp)) fclose(fp);/* 關(guān)閉文件 */ printf(“n=====>提示:記錄導(dǎo)入完畢,共導(dǎo)入%d條記錄.n”,count); while(1){ menu(); printf(“tt====>請(qǐng)選擇:”); scanf(“%d”,&choose); if(choose==0) { if(saveflag==1) { getchar(); printf(“n=====>提示:資料已經(jīng)改動(dòng),是否將改動(dòng)保存到文件中(y/n)?n”); scanf(“%c”,&ch); if(ch=='y'||ch=='Y') Save(list); } //if printf(“n=====>提示:你已經(jīng)退出系統(tǒng),再見(jià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;/*統(tǒng)計(jì)職工記錄*/ 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()/* */ 串的模式匹配問(wèn)題實(shí)驗(yàn)總結(jié) 1實(shí)驗(yàn)題目: 實(shí)現(xiàn)Index(S,T,pos)函數(shù)。其中,Index(S,T,pos)為串T在串S的第pos個(gè)字符后第一次出現(xiàn)的位置。 2實(shí)驗(yàn)?zāi)康模?/p> 熟練掌握串模式匹配算法。 3實(shí)驗(yàn)方法: 分別用樸素模式匹配和 KMP快速模式匹配來(lái)實(shí)現(xiàn)串的模式匹配問(wèn)題。具體方法如下: 樸素模式匹配:輸入兩個(gè)字符串,主串S和子串T,從S串的第pos個(gè)位置開(kāi)始與T的第一個(gè)位置比較,若不同執(zhí)行 i=i-j+2;j=1兩個(gè)語(yǔ)句;若相同,則執(zhí)行語(yǔ)句 ++i;++j;一直比較完畢為止,若S中有與T相同的部分則返回主串(S字符串)和子串(T字符串)相匹配時(shí)第一次出現(xiàn)的位置,若沒(méi)有就返回0。 KMP快速模式匹配:構(gòu)造函數(shù)get_next(char *T,int *next),求出主串S串中各個(gè)字符的next值,然后在Index_KMP(char *S,char *T,int pos)函數(shù)中調(diào)用get_next(char *T,int *next)函數(shù)并調(diào)用next值,從S串的第pos 位置開(kāi)始與T的第一個(gè)位置進(jìn)行比較,若兩者相等或j位置的字符next值等于0,則進(jìn)行語(yǔ)句++i;++j;即一直向下進(jìn)行。否則,執(zhí)行語(yǔ)句 j=A[j];直到比較完畢為止。若S中有與T相同的部分則返回主串(S字符串)和子串(T字符串)相匹配時(shí)第一次出現(xiàn)的位置,若沒(méi)有就返回0 4實(shí)驗(yàn)過(guò)程與結(jié)果: (1)、選擇1功能“輸入主串、子串和匹配起始位置”,輸入主串S:asdfghjkl, 輸入子串T:gh,輸入pos的值為:2。選擇2功能 “樸素的模式匹配算法”,輸出結(jié)果為 5; 選擇3功能 “KMP快速模式匹配算法”,輸出結(jié)果為 5; 選擇0功能,退出程序。截圖如下: (2)、選擇1功能“輸入主串、子串和匹配起始位置”,輸入主串S:asdfghjkl, 輸入子串T:wp, 輸入pos的值為:2。選擇2功能 “樸素的模式匹配算法”,輸出結(jié)果為 0; 選擇3功能 “KMP快速模式匹配算法”,輸出結(jié)果為 0; 選擇1功能“輸入主串、子串和匹配起始位置”,輸入主串S:asdfghjkl, 輸入子串T:sd, 輸入pos的值為:4。選擇2功能 “樸素的模式匹配算法”,輸出結(jié)果為 0; 選擇3功能 “KMP快速模式匹配算法”,輸出結(jié)果為 0; 選擇0功能,退出程序。截圖如下: 5實(shí)驗(yàn)體會(huì)與收獲: (1)C語(yǔ)言中無(wú)法用string型直接定義字符串,所以要用char型的數(shù)組來(lái)實(shí)現(xiàn)字符串的定義。 (2)在char S[]數(shù)組,數(shù)組的首位即S[0]表示數(shù)組長(zhǎng)度,用stolen()計(jì)算長(zhǎng)度,輸入的字符串逐步后移一位,此時(shí)S[1]存放第一個(gè)字符。 (3)在主函數(shù)中,用get(S+1);get(T+1);兩個(gè)語(yǔ)句無(wú)法同時(shí)實(shí)現(xiàn)字符的輸入,最后改用C++語(yǔ)句 cin>>S+1;cin>>T+1;使字符的輸入得到了實(shí)現(xiàn)。(4)程序用有必要的文字說(shuō)明,以便運(yùn)行時(shí)更加清晰明了。第三篇:C語(yǔ)言用指針和鏈表讀寫(xiě)文件
第四篇:C語(yǔ)言課程設(shè)計(jì) 職工信息管理系統(tǒng) 單鏈表實(shí)現(xiàn)程序源代碼
第五篇:串的模式匹配問(wèn)題實(shí)驗(yàn)總結(jié)(用C實(shí)現(xiàn))