1
《專業實訓 II》 實訓報告
實訓項目名稱:
約瑟夫環問題
班級:
學號:
姓名:
指導教師:
2 目錄
目錄 .................................................................................................................................................. 2 一、摘要........................................................................................................................................... 3 二、專業實訓項目描述 ................................................................................................................... 3 三、程序設計 ................................................................................................................................... 3 3.1 菜單系統設計(系統功能結構設計)
............................................................................. 3 3.2 基礎數據結構設計 ............................................................................................................ 4 3.3
函數封裝(功能模塊設計)
.......................................................................................... 4 四、關鍵算法分析 ........................................................................................................................... 6 五、總結........................................................................................................................................... 6 附錄:程序源代碼 ........................................................................................................................... 7
湖北第二師范學院計算機學院
83030177
專業實訓 I
3
一、摘要
報告描述了《約瑟夫環系統》的 C 語言實現方案,程序代碼用 C語言給出,包含所有的數據結構及函數定義、功能模塊,以及專業實訓過程中的心得體會。
二、專業實訓項目描述 本專業實訓項目以《約瑟夫環系統》為主題,包含初始化鏈表、創建鏈表、約瑟夫環輸出等模塊,主要采用了循環單鏈表數據結構,及相關的遞歸算法等。
三、程序設 計
3.1 菜單系統設計(系統功能結構設計)
void main()
{
int n,m; Node *p,*head; LinkList CL;
printf("\t\t************歡迎來到約瑟夫環*************\n\n\n");
printf("請輸入一個初始密碼作為一個報數上限值,再輸入每個人的密碼,并求出出列順序\n\n\n");
printf("請輸入人數 N:\n");
scanf("%d",&n);
printf("請輸入初始密碼 m:\n");
scanf("%d",&m);
InitCLinkList(&CL);
head=CreateCLinkList(CL,n);
PrintLinkList(head,n);
p=head;
printf("出列的順序為:\n");
joseph(p,n,m); }
湖北第二師范學院計算機學院
83030177
專業實訓 I
4 3.2 基礎數據結構設計
************************** typedef struct Node {
int num;
int data;
struct Node *next; } Node,*LinkList;//結點類型,指針類型
int InitCLinkList(LinkList *CL)//創建一個無頭結點的單向循環鏈表 {
int key;
printf("請依次輸入密碼:");
scanf("%d",&key);
*CL=(Node *)malloc(sizeof(Node));//申請一個結點
(*CL)->data=key;
(*CL)->num=1;
(*CL)->next=*CL;
return OK; }
3.3
函數封裝(功能模塊設計)
1.主函數模塊——執行輸入調用其他的功能函數 2.創建環表模塊——創建單向循環鏈表 Node *CreateCLinkList(LinkList CL,int n) {
Node *rear; Node *s,*head;
int i=1,key;
rear=CL;
for(i=2;i<=n;i++)
{
scanf("%d",&key);
head=s=(Node*)malloc(sizeof(Node));//創建一個結點
s->data=key;
s->num=i;
rear->next=s;
湖北第二師范學院計算機學院
83030177
專業實訓 I
5
rear=s;
}
head=rear->next=CL;//尾指針指向頭指針
return head;
} 3.計算處理模塊——計算出要出列的標號并輸出 4.宣示模塊——輸出建立好的環表
int PrintLinkList(LinkList CL,int n)
{
int i;
Node *p;
p=CL;
printf("每個人的序號及對應的密碼為:\n");
for(i=1;i<=n;i++)
{
printf("%d,%d\n",p->num,p->data);
p=p->next;
}
if(p=NULL)
{
printf("此鏈表為空");
exit(OVERFLOW);
}
printf("\n");
return OK;
}
湖北第二師范學院計算機學院
83030177
專業實訓 I
6
四、關鍵算法分析 int joseph(LinkList CL,int n,int m)
{
int i,j;
Node *p;
Node *q;
p=CL;
for(j=1;j<m-1;j++)//循環到第 m-1 個結點
{
p=p->next;
}
q=p->next;
//q 指向第 m 個結點
p->next=q->next;
p=p->next;
printf("%d\t",q->num);//輸出第 m 個結點的序號
n--;
if(n>1)
joseph(p,n,q->data);//用第 m 個結點的密碼進行遞歸調用
else
printf("%d",p->num);//輸出最后一個結點的序號
free(q);
p->next=NULL;
return OK;
} 五、 總結 答:細節決定成敗,編程最需要的是嚴謹,如何的嚴謹都不過分,往往檢查了半天發現錯誤發生在某個括號,分號,引號,或者數據類型上。在寫主要函數 joseph()時,在查找目標結
湖北第二師范學院計算機學院
83030177
專業實訓 I
7 點的書寫處不是很清楚,導致我浪費了很多時間。
附錄:程序源代碼 #include <stdio.h> #include <stdlib.h> #include <conio.h> #define OK 1 #define OVERFLOW 0 typedef struct Node {
int num;
int data;
struct Node *next;
} Node,*LinkList;
int InitCLinkList(LinkList *CL) {
int key;
printf("請依次輸入密碼:");
scanf("%d",&key);
*CL=(Node *)malloc(sizeof(Node));
(*CL)->data=key;
(*CL)->num=1;
(*CL)->next=*CL;
return OK; }
Node *CreateCLinkList(LinkList CL,int n) {
Node *rear; Node *s,*head;
int i=1,key;
rear=CL;
for(i=2;i<=n;i++)
{
scanf("%d",&key);
head=s=(Node*)malloc(sizeof(Node));
s->data=key;
s->num=i;
rear->next=s;
湖北第二師范學院計算機學院
83030177
專業實訓 I
8
rear=s;
}
head=rear->next=CL;
return head;
}
int joseph(LinkList CL,int n,int m)
{
int i,j;
Node *p;
Node *q;
p=CL;
for(j=1;j<m-1;j++)
{
p=p->next;
}
q=p->next;
p->next=q->next;
p=p->next;
printf("%d\t",q->num);
n--;
if(n>1)
joseph(p,n,q->data);
else
printf("%d",p->num);
free(q);
p->next=NULL;
return OK;
}
int PrintLinkList(LinkList CL,int n)
{
int i;
Node *p;
p=CL;
printf("每個人的序號及對應的密碼為:\n");
for(i=1;i<=n;i++)
{
printf("%d,%d\n",p->num,p->data);
p=p->next;
湖北第二師范學院計算機學院
83030177
專業實訓 I
9
}
if(p=NULL)
{
printf("此鏈表為空");
exit(OVERFLOW);
}
printf("\n");
return OK;
}
void main()
{
int n,m; Node *p,*head; LinkList CL;
printf("\t\t************歡迎來到約瑟夫環*************\n\n\n");
printf("請輸入一個初始密碼作為一個報數上限值,再輸入每個人的密碼,并求出出列順序\n\n\n");
printf("請輸入人數 N:\n");
scanf("%d",&n);
printf("請輸入初始密碼 m:\n");
scanf("%d",&m);
InitCLinkList(&CL);
head=CreateCLinkList(CL,n);
PrintLinkList(head,n);
p=head;
printf("出列的順序為:\n");
joseph(p,n,m); }
推薦訪問: 約瑟夫 實驗 報告上一篇:擴頻通信實驗報告
下一篇:java課程設計實驗報告
同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究