c語言連結串列寫約瑟夫環問題,c語言連結串列寫約瑟夫環問題

時間 2021-09-06 10:36:10

1樓:匿名使用者

#include

#include

typedef struct node//節點存放一個資料和指向下一個節點的指標

node;

node *link_create(int n)//建立n個節點的迴圈連結串列

p->pnext = head;//最後一個節點指向頭部,形成迴圈連結串列

return head;

}void link_process(node *head,int k,int m)//從編號為k(1<=k<=n)的人開始報數,數到m的那個人出列;

printf("%d ",p->data);

tmp1->pnext= p->pnext;

free(p);

p = tmp1->pnext;

}printf("%d ",p->data);

free(p);

}int main()

有點長,但是應該看得懂,

迴圈連結串列的。

2樓:匿名使用者

c語言的約瑟夫環問題,利用單迴圈連結串列,**如下:

#include//利用單迴圈連結串列!!!!!

#include

#include

typedef int elemtype;

typedef struct singlenode

sll,*linklist;

int main()

use->next = head;//末首相連,形成環

printf("人員序號為:");  //輸出人員的序號

temp=head;

for(i=0;idata);

temp=temp->next;

}printf("\n");

for(i=0;inext;

}printf("人員出列順序為:");

while (n)

printf("\n");

return 0;

}單連結串列實現**如下:

#include//這是使用單連結串列做的約瑟夫環

#include

#include

typedef int elemtype;

typedef struct singlenode

sll,*linklist;

void listinitialize(sll **head)   //初始化

int listinsert(sll *head,int i,elemtype x)  //插入

if(j!=i-1)

if((q=(sll *)malloc(sizeof(sll)))==null)

exit(1);

q->data=x;

q->next=p->next;

p->next=q;

return 1;

}int listget(sll *head,int i,elemtype *x)   //取

if(j!=i)

*x=p->data;

return 1;

}void yuesefu(sll *head, elemtype n,elemtype m,elemtype k)  //約瑟夫刪除操作

while(p->next!=null)

if(p->next==null)  p->next=head->next;   //控制迴圈

s=p->next;  //刪除第k個元素

x=s->data;

if(s->next==null)  s->next=head->next;  //控制迴圈

p->next=s->next;

printf("%d ",x);  //輸出第k個元素

j=j+1;   //用以統計總共輸出了多少個元素

free(s);

if(j==n) break;

i=0;   //i清零}}

void main()

{sll *head;

int x,i,n,m,k,a=0;

listinitialize(&head); //呼叫初始化函式

printf("請輸入總人數n:");

scanf("%d",&n);

printf("從第m個人開始數起,請輸入m:");

scanf("%d",&m);

printf("數到第k個人,該人出列,請輸入k:");

scanf("%d",&k);

for(i=0;i

關於迴圈佇列實現約瑟夫環(c語言)的問題

3樓:

首先,p是指向頭結點的,或者說第一個結點,然後:

p->next = p; //p->next也指向頭結點,也就是頭結點的next指向自己,那麼一開始只有一個結點時這就已經是一個迴圈連結串列了,後面再插入結點時只要尾結點的next指向頭結點,就能保持它仍然是迴圈連結串列。

node *r = p;//用r來指向尾結點,r=p,因為p->next=p,所以也就是r->next==p,尾結點的next指向頭結點。

for迴圈中:

q->next = r->next;//把新增結點的next指向頭結點,其實等價於q->next=p,因為r->next==p,尾結點的next是指向頭結點的。

r->next = q;//把原先的尾結點的next指向新增結點。

r = q;//把尾結點改為新增結點,因為上面已經將新增結點的next指向頭結點,所以這個操作過後,尾結點的next仍然指向頭結點,也就保持了連結串列仍然是迴圈連結串列。

C語言連結串列問題,c語言連結串列問題

我不知道你用什麼編譯器,不同的編譯器可能結果不一樣。會提示段錯誤的可能是vc編譯器,建議你除錯下 while p1 p1 num 0 struct student next 這個分號你寫錯了,所以會造成字元錯誤,然後定義連結串列的儲存結構是要用typedef struct student的。在主函式...

c語言 單向連結串列如何排序,C語言 單向連結串列如何排序?

問明 void link order stu p head stu pb,pf,temp pf p head if p head null 連結串列為空printf needn t order.n return if p head next null 連結串列有1個節點 printf only on...

C語言連結串列與結構體,c語言結構體與連結串列

北風微風 include include define null 0 define len sizeof struct student struct student int n struct student creat void if n 0 head null p2 next null free ...